Excel Diff
Two slots, one for the original workbook and one for the updated one. Rows are paired on the column that identifies them rather than on the row they happen to sit in, so a workbook that came back sorted differently produces no false differences at all. Both files are read in this tab, however many times you do it.
More than two workbooks, or joining them instead? Open the app
Two versions of the same spreadsheet
Somebody has a workbook, somebody else has a slightly different workbook, and the only honest answer to "what changed" involves opening both and scrolling. That is the situation, and it repeats:
- A file you sent out that came back edited. Three hundred rows, an unknown number of edits, and a covering note saying "made a few tweaks".
- A supplier's revised price list. Same columns, same products, a new filename with v2 on the end, and thirty prices that moved somewhere in the middle.
- This month's report against last month's. Both exported from a system that keeps no history, so the spreadsheets are the history.
- Before and after a bulk edit. You ran find and replace across a column and now you need to show which rows it touched, and that it touched nothing else.
- Two people, two copies, one merge. The classic. Two colleagues edited the same sheet in parallel and neither can remember exactly where.
- A migration check. Export the old system to a workbook, export the new one, and prove nothing was dropped or silently retyped on the way across.
Excel does ship a comparison tool, but Spreadsheet Compare is bundled only with the enterprise editions of Office, so most people who need it do not have it. The web tools filling that gap usually want the workbook on their server and start counting how many comparisons you have had. This one runs in the page, is not counting, and never sees the file.
Worked example: one changed cell, one new row, everything re-sorted
Original workbook, stock-q3.xlsx, first sheet:
sku product price stock
A-11 Desk lamp 24 40
A-12 Chair mat 31 12
A-13 Monitor arm 89 7
Updated workbook, stock-q4.xlsx. One cell moved, one product is new, and whoever produced it sorted the sheet on a different column first:
sku product price stock
A-13 Monitor arm 89 7
A-14 Cable tray 18 25
A-11 Desk lamp 24 36
A-12 Chair mat 31 12
Line those two sheets up row by row and not a single row matches its opposite number, which is why a row-by-row comparison reports four differences and helps nobody. Drop the workbooks into the two slots above, leave the key on sku, and the summary reads: 1 added, 0 removed, 1 changed, 2 unchanged, matched on sku. The download, stock-q3-diff.csv, is two rows long:
_status,_changed_columns,sku,product,price,stock,stock__was
added,,A-14,Cable tray,18,25,
changed,stock,A-11,Desk lamp,24,36,40
A-14 is new. A-11 has 36 in stock where it had 40, and the old value is kept in stock__was so you never have to go back to the first workbook to see what it used to be. _changed_columns names the one field that moved. There is no price__was or product__was, because those columns were compared on every row and never differed, so no column was created for them.
Flip the download option to Include unchanged and the same comparison becomes a full reconciliation instead, every product accounted for:
_status,_changed_columns,sku,product,price,stock,stock__was
unchanged,,A-13,Monitor arm,89,7,
added,,A-14,Cable tray,18,25,
changed,stock,A-11,Desk lamp,24,36,40
unchanged,,A-12,Chair mat,31,12,
Rows arrive in the updated workbook's own order, with anything that disappeared listed at the end. Re-sort either workbook and feed them back in: the same two rows, every time.
How the two workbooks are lined up
Short enough to describe in full, which is a useful property for something you are about to attach to a sign-off:
- Each workbook is opened in the tab and its first sheet with data becomes rows. Any other sheets are named in a warning rather than merged in or ignored quietly.
- Cells become the text the sheet displays. A cell showing 1,234.50 compares as the string
1,234.50, and a date shown as 2023-03-15 compares as that. Formulas contribute their last calculated result, not the formula itself, so=1+2and a typed 3 compare as equal. - The first row is the header on both sides, and every column name the two sheets share becomes a candidate key, offered as checkboxes under the result. Until you touch them, the first shared column is the key, which is why a sheet starting with an id or sku column needs no setup at all.
- Both sides are indexed on the key values. Every row of the updated sheet is looked up in the original: no match means added, a match with every comparable column identical means unchanged, and a match with at least one difference means changed.
- Keys that exist in the original and never turn up in the updated sheet are the removed rows, listed at the end.
- Padding is forgiven, nothing else is by default. Cells padded to a width stop counting as changes unless you switch Whitespace to Exact. Case stays significant unless you pick Ignore case, a number tolerance can absorb float drift when you set one, and columns you tick under Ignore columns stay in the output without ever making a row "changed". There is no date reinterpretation at all.
- Change the key and it reruns immediately on the workbooks already in the slots. There is nothing to re-upload, because nothing was uploaded.
Reading the diff
_statusis one of added, removed, changed or unchanged. Filter or pivot on it and you have your summary in one move._changed_columnsnames the fields that moved on that row, separated by spaces, and is empty for every other status. Sorting on it groups rows that changed in the same way, which is how one bad paste that hit forty rows identically gives itself away.- The data columns follow the original sheet's order, with anything the updated sheet introduced appended at the end. Values come from the updated workbook where the row exists there, and from the original for removed rows.
- The
__wascolumns hold the previous value, and only exist for fields that changed somewhere in the sheet. A hundred-column workbook with two edits gets two extra columns, not a hundred empty ones. - The filename comes from the original workbook, so
stock-q3.xlsxdownloads asstock-q3-diff.csvand a folder of these stays readable months later. - A clean comparison says so. When nothing differs the summary leads with "No differences" and the download is the header row on its own, which is a perfectly good artefact to attach to an approval.
Gotchas worth knowing
- Number formats are part of the comparison. Because cells are compared as displayed text, the same underlying 1234.5 shown plainly on one side and as
#,##0.00on the other comes out as a change from1234.5to1,234.50. Dates behave the same way. If a whole column lights up and none of the values look different, the format is what moved. - Display rounding can hide a real difference. The other edge of the same rule: two cells holding 10.004 and 10.001, both formatted to two decimals, both display as 10.00 and are reported as identical. When precision below the displayed decimals matters, widen the format before you export.
- Only the first sheet with data is compared. Every other sheet in either workbook is named in a warning that says which file it came from and which sheet was used instead. If the sheet you care about is not the first one, move it or export it on its own.
- An empty leading sheet is stepped over. A workbook whose first tab is a blank cover page is not a dead end; the first sheet with anything in it is used and a warning names both.
- Duplicate keys are compared once and announced. The first row holding a given key is the one used, later ones are skipped, and a warning says which side repeated how many keys. Ignoring that message is how a comparison quietly under-reports.
- One key column is often not enough. Stock rows keyed on
skualone collapse the moment the same product appears for two regions. Tickregionas well, the summary switches to matched on sku + region, and the duplicate warning goes away. - Columns on one side only ride along uncompared. They appear in the output and get named in a warning, but a column that did not exist in the original has no old value to have changed from.
- No shared column names means no comparison. The comparer stops and says so rather than guessing, and the usual cause is a sheet whose first row is a title banner rather than a header.
- Formatting, formulas and charts are not compared. Cell colours, borders, conditional formatting, comments, hidden sheets and the formulas themselves are outside what this looks at. It compares the values a reader would see.
- Two files at 100 MB each sit in the tab at once. That is the ceiling, and a machine short on memory will feel it well before that.
Frequently Asked Questions
Do the two workbooks have to be in the same row order?
No. Rows are paired on the column that identifies them, and row position is never consulted. Sort the updated workbook by a different column, or let a report generator hand the rows back however it likes, and the added, removed and changed counts come out identical.
Which sheet gets compared?
The first sheet with data in it, on each side. If either workbook has more sheets than that, a warning names the file, the sheet that was used and every sheet that was left out, so nothing is skipped silently. A cover sheet with nothing on it is stepped over and that is announced too.
Why is a cell showing as changed when I did not touch it?
Cells are compared as the text the sheet displays, not as the raw number underneath. The same value of 1234.5 formatted as a plain number on one side and as #,##0.00 on the other compares as 1234.5 against 1,234.50, which is a difference. The same is true of dates: one serial number shown as 2023-03-15 and as 15/03/2023 is reported as changed.
Can I match on more than one column?
Yes. Under the result is a set of checkboxes over every column name the two sheets share. Tick several and rows match only when all of them agree, and the summary line updates to say so, for example matched on sku + region. That is usually the right answer when a single key column repeats.
What do I get back, and can I have it as a workbook?
The download is a CSV named after the original workbook, so stock-q3.xlsx becomes stock-q3-diff.csv. It opens in Excel directly, and if you want a real .xlsx to send on, run it through the CSV to Excel converter afterwards. The diff is also shown as a table on the page before you download anything.
Is there a limit, and are my files uploaded?
There is no comparison count, no trial and no account. Both workbooks are read in your tab and the diff is assembled there, so nothing is uploaded and nothing is retained after you close the page. The only ceiling is size: this in-page comparer tops out at 100 MB per file, and the full editor handles anything larger.
Compare two workbooks
Free, unlimited, no account, nothing uploaded. Add both files, pick the column that identifies a row, and read the four numbers that matter.
Back to the comparison