Clean up a spreadsheet

Remove the duplicates, blanks and stray spaces that break every lookup, and take out the columns the recipient does not need. The file is read in this browser tab and never uploaded.

How it works

Any spreadsheet that has been exported, edited, pasted into and exported again collects the same three faults. Rows appear twice because two exports overlapped. Blank rows sit in the middle because someone deleted the contents rather than the row. Values carry a leading space because they were pasted from somewhere that had one. None of this is visible at a glance, and all of it quietly breaks lookups, counts and any comparison made against the file.

The fixes are individually trivial and collectively tedious, which is why they never get done. Removing duplicates means an exact match across every column, not a fuzzy one. Removing blank rows means rows where every cell is empty, not rows where one cell is. Trimming has to happen before the duplicate check, or the row with the stray space survives as a distinct value and the duplicate is still there. This does all three in that order, and shows you what it removed.

The second half is why this tool sits on a privacy site. The spreadsheet you are about to send usually contains more than the recipient needs: salaries next to names, phone numbers next to order ids, an email column that was only there for the import. You can mask a column, which keeps its shape so the sheet still makes sense, or remove it outright. Masking uses a fixed width rather than one bullet per character, because the length of a value is itself information.

The preview shows the cleaned sheet, not the original, so what you check is what you download. The file never leaves your device: it is parsed, cleaned and written again inside this browser tab. For a spreadsheet holding customer or payroll data, that is not a nicety. Uploading it to have it tidied is precisely the thing you were trying to avoid by removing the column.

How to use it

  1. 1 Choose a CSV or Excel file, or paste one in.
  2. 2 Pick which tidying to apply. All three are on by default.
  3. 3 Mask or remove any column the recipient should not see.
  4. 4 Check the preview, then download as CSV or Excel.

Good to know

  • Trimming runs before the duplicate check, so a row that differs only by a stray space is still caught.
  • A blank row means every cell is empty. A row with one value in it is kept.
  • Masking keeps the column and its header, so the sheet still lines up with whatever expects it.
  • Only the first sheet of a workbook is read. Split multi-sheet workbooks first if you need the others.
  • Nothing is uploaded, which is the point when the columns you are removing are the sensitive ones.

Browser support

  • Chrome 94 and later
  • Firefox 93 and later
  • Safari 16.4 and later
  • Edge 94 and later

These are the oldest versions with everything the tool uses. They are worked out from the tool itself, so they change when it does.

Version numbers checked on 2026-09-04.

Why your duplicate rows survive every attempt to remove them

Two rows that look identical on screen are frequently not identical to a computer, and the reasons are almost always invisible. The commonest is a trailing space, picked up when a value was pasted from a web page or exported from a system that padded its fields. "Ana" and "Ana " differ by one byte, so any comparison treats them as distinct, the duplicate check finds nothing, and the row you can plainly see twice stays twice.

There are subtler versions. A non-breaking space, U+00A0, is what you get when text comes from HTML, and it looks exactly like a space while comparing unequal to one. Numbers stored as text compare unequal to the same numbers stored as numbers, which is why a column of ids can fail to match itself after a round trip through CSV. Unicode makes it worse: an accented character can be a single code point or a base letter followed by a combining accent, identical on screen and different in memory, which is what normalisation forms exist to reconcile.

The order of operations therefore matters more than the operations. Trimming has to happen before deduplication, not after, or the padded row survives the comparison as a distinct value and gets removed only from the tidied output, leaving the duplicate behind. Blank-row removal has to come before deduplication too, otherwise several blank rows are themselves duplicates of each other and the count of what was removed becomes confusing to read. This tool runs trim, then blank-row removal, then deduplication, and reports each separately so the numbers add up.

What counts as a duplicate is a decision, not a fact. Matching on every column is the strict reading and the safe default: two rows are the same row only if they agree everywhere. Matching on a key column instead, so that a later record supersedes an earlier one, is a different job with different risks, and it is the one the spreadsheet comparison tool is for. Conflating them in a single button is how people delete rows they meant to keep.

The masking half of the tool has its own subtlety worth stating. Replacing a value with one bullet per character preserves its length, and length is information: a masked phone number of ten characters beside one of nine tells a reader something about both. A fixed-width mask gives that away nothing, at the cost of the column no longer showing which entries were longer, which is a trade worth making by default. Removing the column outright gives away less still, and is the right choice whenever the recipient has no reason to know the column ever existed.

Frequently asked questions

How do I remove duplicate rows from a spreadsheet?

Choose the file and leave "Remove duplicate rows" on. A row counts as a duplicate only when every column matches, and the first occurrence is the one kept, so the original order survives. The count of what was removed is shown above the preview.

Why are my duplicates not being found?

Usually because of invisible whitespace: "Ana" and "Ana " are different values, and any tool that compares them literally will keep both. Leave "Trim spaces around values" on. It runs first, so the padding is gone before the comparison happens.

What does masking a column do?

It replaces every value in that column with a fixed-width mask while keeping the column and its header. The sheet keeps its shape, so anything expecting that column still works, but the contents are gone. The width is fixed on purpose: one bullet per character would leak how long each value was.

Is my spreadsheet uploaded?

No. It is parsed, cleaned and written again inside this browser tab by your own device. You can watch the Network tab in your browser’s developer tools: nothing carrying the file goes out. That matters most for exactly the files this tool is for, which tend to hold customer or payroll data.

Can I get an Excel file back, not just CSV?

Yes. Both are offered. CSV is the safer choice for importing into another system, since it has no formatting to misread; Excel is the better choice if a person is going to open it. Neither keeps the original formatting, formulas or multiple sheets.

Does it keep my formulas and formatting?

No. The output is the values as they stood, without formulas, styles or extra sheets. A formula that produced a value becomes that value. If you need the workbook intact, clean a copy and keep the original.

Related tools

Your files are processed on your device and are not uploaded. You can verify this in your browser’s developer tools under the Network tab.