For developers
Make git diff work for Excel
Workbooks are binary, so Git just tells you the bytes differ. SheetDelta turns an .xlsx change into a readable diff — formulas, values, rows, sheets, and VBA — in your terminal, in CI, and right on the pull request.
The same git diff — before and after
git diff binary blob $ git diff models/budget.xlsx
diff --git a/models/budget.xlsx b/models/budget.xlsx
index 3f1a2b9..7c4e8d1 100644
Binary files a/models/budget.xlsx and b/models/budget.xlsx differ git diff with SheetDelta
readable $ git diff models/budget.xlsx
diff --git a/models/budget.xlsx b/models/budget.xlsx
index 3f1a2b9..7c4e8d1 100644
--- a/models/budget.xlsx
+++ b/models/budget.xlsx
@@ -4,7 +4,9 @@
A2 "Rent"
-B2 1000
+B2 1200
A3 "Power"
-B4 =B2+B3
+B4 =B2+B3+B4
[Sheet] Notes
+A1 "reviewed"
Same command, same files — the only difference is a one-time
sheetdelta git install.
See the setup ↓
Why git diff says “binary”
An .xlsx file is a zip archive of XML. To Git it’s an opaque blob, so — as on the left above — a one-cell change collapses to a single line: “Binary files differ.” Your history becomes a list of “updated budget.xlsx” commits with no way to review what actually changed.
Unzipping to text doesn’t help — you’d be diffing reordered shared strings and shuffled styles, not the numbers. You need a diff that understands the workbook.
One command wires it into git diff
The CLI registers itself as a Git diff driver, so your normal Git commands start rendering
workbooks. No wrapper scripts, no hand-edited config — run it once per repo (or
--global for all of them):
# One-time setup, from inside your repo
$ sheetdelta git install
✓ Git integration installed (textconv, this repository).
# Or for every repo on your machine
$ sheetdelta git install --global
That’s the whole setup — the readable panel at the top of this page is what
git diff prints from then on. Because it plugs into Git’s own machinery, it
works the same in git show, git log -p, and
git stash show -p — not just git diff. It reads the formula text,
so a recalculated cached value never shows up as a phantom change.
Two ways to render the diff — choose one at install:
- Default — Git does the diffing, using
SheetDelta only to turn the workbook into text. It’s the most compatible (works in
git diff,log -p, andshow) and caches its work. -
--external— SheetDelta does the diffing itself, for a richer view that understands sheet renames and inserted or deleted rows and columns instead of plain line changes.
Switch anytime, or run sheetdelta git uninstall
to remove the integration.
Fully offline and private. The diff runs entirely on your machine — the SheetDelta CLI reads your workbooks locally and sends no workbook data to our servers, or anywhere. The only network call it ever makes is an optional, one-time license activation that exchanges a license key — never file contents. Air-gapped? Activate with an offline license file and it never touches the network at all.
See the change on every pull request
Drop in the GitHub Action. On any PR that touches a workbook, it posts a sticky comment with a cell-level diff, so spreadsheet changes get reviewed like code.
# .github/workflows/excel-diff.yml
name: Excel Diff
on:
pull_request:
paths: ['**/*.xlsx', '**/*.xlsm', '**/*.xlsb', '**/*.xls']
permissions:
contents: read
pull-requests: write # required to post the comment
jobs:
excel-diff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0 # the Action needs the base + head blobs
- uses: sheetdelta/sheetdelta.com/action@v1
with:
license-key: ${{ secrets.SHEETDELTA_LICENSE_KEY }}
The comment lists each changed sheet and cell with before/after values and formulas. Turn on
fail-on-change to require a human review before a
workbook change can merge.
Diff in your terminal and any CI
The same engine ships as a CLI. Use it locally, in a pre-commit hook, or in any pipeline — GitLab CI, Azure DevOps, Jenkins. No Excel install required.
# Compare two workbooks in your terminal
sheetdelta diff old/budget.xlsx new/budget.xlsx
# Machine-readable output for your own tooling
sheetdelta diff old/budget.xlsx new/budget.xlsx --format json
It also speaks agent: -f agent emits
compact NDJSON for AI tools, and sheetdelta mcp
runs an MCP server so assistants like Claude and Cursor can diff workbooks directly.
SheetDelta for AI agents →
We make changes reviewable — we don’t merge them
No tool can safely three-way-merge a binary workbook without risking corruption, so we don’t pretend to. SheetDelta shows precisely what changed and lets a human approve it. If a vendor tells you they merge Excel automatically, open a PR and watch what happens to your file.
Frequently asked questions
Does SheetDelta merge workbooks or resolve conflicts?
Does it diff VBA and macros?
git diff, VBA is the one paid feature: a changed module is flagged so you see which macro changed, but its source stays hidden until you activate a license — everything else in the diff is free. The moment you run sheetdelta license activate, the full line-by-line VBA diff appears inline (activation refreshes the current repo for you). Does it work on GitLab, Azure DevOps, or Bitbucket?
Does <code>sheetdelta git install</code> change how diffs look on the GitHub/GitLab website?
git diff, git log -p, and git show readable in any terminal and any CI log — on every host. The web pull-request view renders blobs on the host’s servers, which don’t run your local diff driver, so for an inline diff in the PR UI you add the GitHub Action (it posts the diff as a comment). Local Git and CI logs are covered everywhere by the CLI. Will it slow down <code>git diff</code> on a big repo?
Does the CLI send my workbooks to SheetDelta?
git diff, sheetdelta diff, and sheetdelta git install make no network calls and send no workbook data anywhere. The only time the CLI touches the network is an optional one-time license activation, which exchanges a license key, never file contents. Air-gapped teams can activate with an offline signed license file and stay completely offline. Do the runners need Excel installed?
Is it free?
git diff of workbooks — run sheetdelta git install and your terminal, git log -p, and git show render formulas, values, rows, and sheets at no cost. The paid upgrade is VBA macro diffing (changed macros are flagged but hidden until you activate a license) and the GitHub Action that posts cell-level diffs on pull requests in CI — with online keys for cloud runners and offline signed licenses for air-gapped ones. Review spreadsheet changes like code
Add the Action to one repo and watch the next workbook PR get a real diff.