Two files, one quick check that eats an afternoon

"Can you just make sure the numbers didn't change?" It sounds like ninety seconds of work. Then you open the old budget and the new budget side by side, realize nobody labeled which revision is which, and start scrolling two windows in parallel like a human comparator. By the third screen you're no longer reading values — you're pattern-matching them, which is a polite way of saying you're guessing. Twenty thousand cells in, the confidence that you would actually spot a changed 12,400 to 13,800 is approximately zero, and you know it.

The professional move in a spreadsheet shop is to reach for a real diff. The problem is that the genuinely good one Microsoft ships, Spreadsheet Compare, arrives only with certain Office licensing, and the online alternatives mostly want your file uploaded to their servers before they will tell you anything. Neither constraint is acceptable when the two files in question are the salary planning workbook.

This page is the third option: drop both workbooks, get a cell-level diff rendered in the browser, filter it down to changed, added, or removed content, and read a summary that says in one line what an afternoon of scrolling would have half-found. Nothing uploads. Nothing gets emailed to a converter.

A diff tool that thinks in cells

A text diff, the kind your version control system runs, thinks in lines. That model fits poorly to spreadsheets, because a workbook is not a sequence of lines — it is a two-dimensional grid of addressed cells, plus shared lookup tables, plus style records, all zipped together. Comparing the raw bytes or the raw XML of two .xlsx files tells you they differ; it does not tell you that cell D17 on the Marketing tab moved from 12,400 to 13,800 while everything else on that sheet stayed put.

So this tool reconstructs both sheets into cell grids first, then compares them cell by cell by reference. For each address — A1 through XFD1048576 in principle, though real sheets are far smaller — it asks: does this cell exist on both sides, and if so, are its contents equal? Cells present on the left but absent on the right are removals; the reverse are additions; matching addresses with unequal contents are changes. Every result lands in a filterable diff grid with old value, new value, and location, and the top-line summary counts each category so you know at a glance whether you are looking at three edits or three thousand.

The comparison mode is your call. Value mode diffs calculated results — the pragmatic default for "did the numbers change." Formula mode diffs the formula text itself — the right choice when you are auditing a spreadsheet someone else reworked and the question is what logic moved, not what it printed.

Comparing two workbooks, step by step

  1. Load file A

    Drop the original workbook on the left panel. The parser reads the Office Open XML package (or the legacy .xls binary) and lists every sheet it contains, hidden tabs included.

  2. Load file B

    Drop the revision on the right panel. Same treatment: full sheet list, no judgment about which one is newer.

  3. Choose the two sheets

    Pick which tab from each workbook forms side A and side B of the comparison. Same sheet name in both files is the normal case; comparing two different tabs from one file is equally allowed.

  4. Set the mode

    Values or formulas, plus an optional numeric tolerance for decimals. Tolerance of zero means exact stored-precision comparison; two decimals means 0.30 and 0.30000000000000004 compare equal.

  5. Read the diff

    The result grid lists every difference with its cell address, old content, and new content. Filter buttons narrow it to changed, added, or removed cells; the summary strip counts rows and columns touched.

  6. Export or repeat

    Download the diff as CSV for documentation, or swap in the next pair of files — the panels reset without reloading the page.

For the paranoid — which in spreadsheet work is a compliment — the tool also shows sheet dimensions and cell counts for both sides before the diff runs. Two files that claim to be the same export with different row counts are already worth a question, and you will see it before you see a single flagged cell.

What counts as a difference

The interesting engineering in a cell diff is deciding what "equal" means, because an .xlsx file stores surprisingly little the way you'd guess. Text does not live inside the worksheet XML; it lives in a shared string pool that cells reference by index, and two identical strings are usually one entry used twice. The tool resolves those references first, so you compare the actual text, not the plumbing.

Numbers compare numerically. That sounds obvious until you meet the display trap: a cell showing 5% stores 0.05, a cell showing $1,250.00 stores 1250, and two cells that display identically can store different values under different formats. The diff always compares what the file stores, and displays both sides raw, precisely so format tricks can't hide a real change or invent a fake one. Dates, stored as numeric serials in the 1900 system, are resolved to their readable form for display but compared as the underlying numbers — January 1, 2020 is 43831 or it isn't.

Text comparison is exact and case-sensitive, byte for byte after shared-string resolution. A trailing space — the single most common invisible edit in shared spreadsheets — shows up as a change, with the old and new values printed side by side where the space is visible if unglamorous. Empty versus blank is another quiet distinction the tool surfaces: a cell containing the empty string and a cell containing nothing at all are different animals in the file format, and the diff reports them as such rather than papering over it.

Cell situationReported asWhy
Same address, different numberChangedThe core case: old and new values shown together
Same address, same value, different formulaUnchanged in values mode / changed in formula modeFormula rework with identical output is invisible to a value diff by design
Address exists only in file ARemovedRow or column deletions concentrate here
Address exists only in file BAddedNew data — or a shifted grid; see alignment below
0.3 versus 0.30000000000000004, tolerance onEqualFloat noise below the chosen precision is not a business change
Empty string versus truly empty cellChangedThey differ in the file, and importers treat them differently too
How the comparison classifies what it finds.

Inside the XLSX format: why diffing a spreadsheet is strange

Rename any .xlsx to .zip and open it. What you find is a small filesystem: workbook.xml holding the sheet registry, worksheets/sheet1.xml and its siblings holding cells, sharedStrings.xml holding the text pool, styles.xml, theme parts, maybe a calcChain describing formula evaluation order. A cell in the worksheet XML looks like <c r="D17" s="4" t="n"><v>13800</v></c> — address, style index, type, value — with the number sitting right there, but text sitting back in the shared pool and meaning distributed across three files.

This structure is why naive comparisons misfire. Diff the raw XML and the order of rows in the file, zip entry timestamps, and style renumbering all register as differences even when every cell is identical. Excel itself rewrites the package in ways that shuffle internal ordering. The only reliable method is what this tool does: parse both files to the same abstract representation — a grid of resolved values — and compare that. It is slower than a byte diff and incomparably more meaningful.

The legacy .xls format is even further from text: a binary record stream inside an OLE2 compound container. No line-oriented tool can touch it at all. Supporting both formats in one diff means the comparison you run between last quarter's archive and this quarter's export does not start with "first, convert everything," which historically was the step where the audit quietly stopped happening.

Diffing a budget before it ships

Here is the scenario the tool was born from, with real numbers. A finance team circulates budget_v7.xlsx, an ops director returns "budget_final.xlsx" (a name that means nothing), and someone must certify that the returned file contains only the agreed changes before it goes to the board pack.

Worked example — certifying two agreed edits

Input

File A, budget_v7.xlsx, sheet "Summary", rows 14–17:

Row | Item | Q1 | Q2
14 | Travel | 4200 | 5100
15 | Software | 12400 | 11800
16 | Training | 3000 | 3000
17 | Contingency | 2500 | 2500

File B, budget_final.xlsx, same sheet, same rows — with two edits: Software Q1 12400 → 13800, Training Q2 3000 → 3600.

Output

Diff (values mode, exact):

B15: 12400 → 13800 (changed)
D16: 3000 → 3600 (changed)

Summary: 2 changed cells, 0 added, 0 removed, 2 rows touched, 2 columns touched.

Everything else on the sheet compares equal — the other 418 populated cells are not listed, because they are not differences.

Two flagged cells, both among the agreed edits, nothing else moved. That is the whole audit, and it took about ten seconds including file loading. The certification writes itself: "budget_final differs from budget_v7 in exactly two cells, B15 and D16, matching the approved adjustments." Try composing that sentence credibly after a manual scroll-through.

Worked example — the inserted-row avalanche

Input

File A: a 50-row roster, IDs 1001–1050, one row per person.

File B: the same roster with one new person inserted at position 12 (ID 1037) and nothing else touched.

Output

Reference-only alignment: 39 changed cells and a summary that screams — because row 13 onward in file B contains what row 12 onward contained in file A, and every cell address after the insertion compares against its shifted neighbor.

Key-based alignment (match rows on the ID column): 1 added row (ID 1037), 0 changed cells, 0 removed. The honest picture.

The second example is the one to internalize. A diff that reports only cell-address mismatches is technically correct and practically useless the moment anyone inserts a row. Matching rows on a stable key — an ID, a code, a name that doesn't repeat — is what turns the flood back into the single edit that actually happened. When your sheets have a natural key column, use it.

When a cell diff misleads you

  • Shifted grids without a key. Sort order changes, filters left applied, rows moved — all masquerade as mass edits under reference alignment. Match on a key column or re-sort both sheets before comparing.
  • Cross-sheet formula dependencies. A value that comes from another tab changes when that tab changes, even though this sheet's cells were never touched. Values mode catches the outcome; formula mode on this sheet alone will not flag anything, because the formula text is identical. Compare the dependent sheets too.
  • Volatile functions. NOW(), TODAY(), RAND() recompute every time the file opens. Two "identical" files saved a day apart will show differences in any cell touching those functions. Filter those rows out of the diff, or your audit noise drowns signal.
  • External links. Workbooks pulling from other files (or databases, or the now long-dead MSN Money data feeds) store cache values that drift between saves. A diff flags the cached numbers, not the link — check Data → Queries and Connections in Excel if the changed cells all trace back to one source.
  • Rounding display versus stored value. A cell displaying 12.4 that stores 12.400000000000002 will flag against a true 12.4 at zero tolerance. Set the tolerance to the number of decimals your numbers actually carry; four is plenty for most financial work.
  • Merged cells compare at their anchor. The top-left cell of a merge holds the value; the rest are empty. Two files with the same visible layout can differ in merge structure without showing a content diff — this tool compares contents, not layout.
  • Very large sheets hit browser memory. Multiple million-row sheets in both files can exhaust a tab. Trimming to the used range, or exporting the sheet to CSV first and diffing the text, is the escape hatch — CSV Filter Rows and XLS to CSV Converter cover that path.

Who needs cell-level diffs

The recurring users are predictable. Finance teams comparing circulating budget versions before a board meeting. Payroll and HR verifying that a vendor's updated headcount file contains only the agreed changes. Ops managers checking that a supplier's refreshed price list matches the negotiated one — a five-cent drift on one SKU across forty thousand units is real money, and exactly the kind of change no eyeball catches. Pricing analysts validating a spreadsheet regenerated by an export job against the previous run, where "the process worked" means "the only diffs are the ones the process was supposed to produce."

It shows up after mistakes, too. When two people edit what they believe is the same file, or someone pastes into the wrong window, the reconstruction question is always the same: what actually changed between this and that? A cell-level diff turns an hour of squinting at Freeze Panes into a sorted list with addresses. Data teams use it during migrations for exactly this reason — "compare the old extract to the new extract, prove the pipeline, sign it off."

And auditors, internal and external, have a standing need to evidence that a reviewed number is the number that shipped. A downloadable diff, produced locally, dated, listing exactly two changed cells, is the kind of artifact that makes review notes short.

Spreadsheet Compare, Inquire, and this page

Microsoft ships a genuinely thorough desktop diff tool: Spreadsheet Compare, which arrives with Office Professional Plus and the enterprise tiers of Microsoft 365 Apps, alongside the Inquire add-in. If you have that licensing and a Windows machine, it is the reference implementation — it diffs values, formulas, formatting, macros, and even VBA changes, and nobody serious disputes it.

Excel Spreadsheet Compare / InquireThis toolTypical online diff sites
AvailabilityProfessional Plus / enterprise licensing, WindowsAny modern browser, any OSAny browser
Uploads your fileNoNoYes — files go to their servers
Value + formula diffYesYes, switchableUsually values only
Formatting / VBA diffYesNo (contents only)Rarely
Added / removed row detectionYesYes, with key-based alignmentInconsistent
Account requiredNoNoOften, past the free tier
CostBundled with qualifying OfficeFreeFree tier with limits
The realistic field of options for comparing two sheets.

The honest positioning: if you have the Microsoft tool, it does more. This page exists for everyone else — the contractor on a Mac, the analyst on a Microsoft 365 Business Standard license that doesn't include Inquire, the auditor who cannot install anything, and the person whose files simply must not take a trip to a vendor's upload endpoint. For contents-only diffing, which is what 90% of "did anything change" questions actually require, the cell grid here answers in seconds without prerequisites.

Nothing uploads, nothing syncs

Both workbooks are opened with the browser's local File API and parsed in the tab. The comparison, the alignment, the diff grid, the CSV export — all JavaScript on your machine. There is no conversion queue, no storage bucket, no "we delete files after 24 hours" promise to take on faith, because there is nothing to delete. Load the page once and it keeps working with the network disconnected, which is not a party trick: it is how the air-gapped machine in the finance room gets to have working tools.

The no-upload property is the entire reason we built this as a browser tool rather than a free API with a page in front of it. The files people need to compare — salary plans, vendor contracts, client rosters — are the files with the least business being on a third-party server. Local comparison removes the judgment call entirely. If you want proof rather than prose, the browser's dev-tools network panel shows zero requests after the page loads.

Sheet-compare questions, answered

Does the comparison look at formulas or at values?

Both, and separately. In values mode, each cell's calculated result is compared, so a formula rewritten to compute the same number shows as unchanged. In formula mode, the formula text itself is compared, which catches edits that happen to produce identical output. Most version checks want values mode first, then formula mode for the audit.

Can it compare two sheets inside the same workbook?

Yes. Pick the workbook once and select two different tabs for side A and side B — useful for sanity-checking a copied-and-adjusted sheet against its source. The more common case, one sheet from each of two files, works identically.

Will it catch rows that were inserted or deleted?

Yes, with a caveat. Added and removed rows are reported as their own category in the diff summary. The caveat is alignment: comparing strictly by cell reference (A1 to A1, A2 to A2) means one inserted row in the middle shifts every row below it, which shows up as a wall of changes. Key-based alignment, matching rows by an ID column, keeps the diff honest when rows moved.

Does it compare formatting, colors, or conditional formatting?

No, and that is deliberate. This diff compares cell contents — values and formulas — because that is what changes the numbers a downstream consumer sees. Formatting changes are invisible here; if a color change matters to your workflow, Excel's own Spreadsheet Compare covers the visual side.

What happens with floating-point differences like 0.1 + 0.2 versus 0.3?

The tool compares at full stored precision by default, so 0.30000000000000004 and 0.3 are flagged. A tolerance option treats values as equal when they differ only beyond a chosen number of decimal places, which is the right setting for financial sheets where both figures are, for all business purposes, thirty cents.

Are .xls files supported, or only .xlsx?

Both. The reader parses the modern Office Open XML .xlsx package and the legacy binary .xls format, so you can compare a 2026 export against the 2009 archive file it supposedly matches without converting anything first.

How large can the workbooks be?

Both files load into browser memory, so the ceiling is your machine. Sheets of a few hundred thousand cells compare in seconds; a fully populated 1,048,576-row sheet depends on available RAM and browser tab limits, and 64-bit Excel files with multiple million-row sheets may need to be trimmed to the relevant range first.

Is either workbook uploaded anywhere?

No. Both files are read by the browser's File API and compared by JavaScript in the page. There is no server round trip, no temporary copy, and no account — which matters, because the workbooks people diff tend to be exactly the ones nobody should be pasting into a random web form: budgets, payroll files, client lists.

If you need the next tool

The comparison habit generalizes. For JSON exports, the JSON Diff Checker runs the same value-level analysis on documents, and Text Diff Checker handles the line-oriented case — changelogs, configs, contracts. When a diff surfaces cells worth extracting rather than just flagging, XLSX to JSON Converter takes the sheet straight to structured data for scripting.

And when the finding is "the old file is the good file," XLS to CSV Converter is standing by to get its contents into a format the rest of your pipeline will accept.

Cited sources

Sources and further reading

We cite primary sources (standards bodies, government agencies, official documentation) wherever they exist so you can verify every number on this page yourself.