1. Drop the two files
Drag an XLSX/XLS/CSV/TSV into each drop zone (File A · Original and File B · Revised). Files are never uploaded — parsing is done locally by the SheetJS community edition (xlsx). Disconnect your network and it still works.
2. Pick the sheet
If the XLSX has multiple sheets, each drop zone shows a Sheet selector. You can compare different sheets on each side (e.g. "2024" on A vs "2025" on B).
3. Choose a key column
The key column decides "which cell value identifies the same row?" Typical picks:
- Employee roster → EmpID
- Product list → SKU
- Invoice register → Invoice# (single column only for now)
Row 1 is treated as the header. Columns that exist on both A and B appear first in the selector. Duplicate keys are matched in order of appearance (first A row pairs with first B row of the same key).
4. Read the results
- Yellow · Modified — same key on both sides, but some cell values differ. Changed cells are bolded in a darker yellow.
- Green · Added — a row that only exists in file B.
- Red · Removed — a row that was present in A but gone in B.
Badges at the top show "N modified · N added · N removed". The on-screen table renders the first 500 diff rows for snappiness; XLSX/CSV exports always include the full result.
5. Export
Download XLSX produces a 4-sheet workbook:
- Summary — sheet name, key column, counts.
- Modified — Key · Column · Before (A) · After (B).
- Added — full rows that only exist in B.
- Removed — full rows that vanished from A.
CSV export packs all three sections into one file, prefixed with a UTF-8 BOM so Excel renders Korean/Japanese headers without corruption.
6. Merged cells and formulas
Merged cells are represented by the top-left cell value (the same simplification Excel uses when reading merged ranges). Formulas are compared by their computed value, not the formula text itself. If you need to diff the raw formula strings, convert to values first.
7. Large files
Sheets with 100k+ rows show a warning banner; expect tens of seconds depending on your device.
- Modern laptop — smooth up to ~200k rows × 30 columns.
- 500k+ rows — split the sheet into chunks and compare in 2–3 passes.
8. Header normalisation
If file A's header is Invoice Number and file B's is invoice number (different casing, extra whitespace, or fullwidth/halfwidth characters), we still line them up after NFKC + trim + lower-case normalisation. Cross-language equivalents (Name ↔ 이름) are not auto-matched — rename the headers to match on both sides first.
9. Privacy
The site is static S3 hosting — there is no upload endpoint at all. Open DevTools → Network, run a compare, and confirm that upload traffic is literally zero bytes. Safe to use under corporate "no-upload" policies. For security review, the runtime works like this: (1) HTML/JS/CSS is served from CloudFront CDN, (2) parsing happens entirely in browser memory via SheetJS, (3) the only outbound network calls are a single GA4 pageview beacon and the AdSense SDK, (4) file contents live in React state and are freed when you navigate away or refresh the page.
10. Attaching diff reports to GitHub PRs
Teams who version-control Excel data alongside code commonly use this workflow:
- Drop the original and revised XLSX into this tool to generate the diff.
- Click Download XLSX to produce a 4-sheet workbook (summary · modified · added · removed).
- Attach that workbook to the PR — reviewers can grasp the change set without a visual diff tool.
- For large changes (100k+ rows), use the CSV export instead — it plays well with text diff tools.
Without Git LFS, the resulting XLSX is usually under 1MB and can be embedded directly in the PR description. Attaching the diff report is faster to review than dropping the raw spreadsheets and asking reviewers to find the changes themselves.
11. Common data-integrity pitfalls
Five frequent traps and how to avoid them:
- Mixed date formats: "2025-04-15" vs "2025/04/15" vs Excel serial (45765) in the same column flags every row as "modified". Normalise both sides to a single format first.
- Thousand separators: "1,234,567" vs "1234567" reads as different strings. Enable normalisation, or convert both sides to numeric.
- Empty cell semantics: blank string, NULL and 0 mix in the same column and become "modified". Pre-fill consistently before comparing.
- Hidden sheets: the sheet selector only shows visible sheets. In Excel, right-click the sheet tab → Unhide first.
- Pivot/chart sheets: pivot and chart sheets collapse to a single cell and produce useless diffs. Compare the underlying data sheets directly.
12. Self-verification script for security review
A 5-step procedure to prove "zero upload" on your own machine — ready to attach to a security review packet:
- Open Chrome/Edge/Firefox DevTools (
F12orCtrl+Shift+I). - Switch to Network, enable
Preserve log, clickClear. - Drop two files into the tool and click compare.
- Filter by
Initiator: xldiffand verify only HTML/JS/CSS requests appear. - Filter the
Methodcolumn toPOST/PUT— the list should be empty.
Save the Network log as HAR or PDF and attach it to your review packet — that is sufficient evidence that no file content leaves the browser.