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

Standard 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, and show) 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?
Does it work on GitLab, Azure DevOps, or Bitbucket?
Does <code>sheetdelta git install</code> change how diffs look on the GitHub/GitLab website?
Will it slow down <code>git diff</code> on a big repo?
Does the CLI send my workbooks to SheetDelta?
Do the runners need Excel installed?
Is it free?

Review spreadsheet changes like code

Add the Action to one repo and watch the next workbook PR get a real diff.