SheetXL on SpreadsheetBench

SpreadsheetBench Verified · 400 tasks

97%*

388 of 400. The highest score of any vendor that has published its results.

Accuracy

97%

of tasks solved, first attempt

  1. SheetXL97.00%
  2. Tetra94.25%
  3. GPT for Excel92.50%
  4. GRID Agent91.25%
  5. Leni91.25%

Leaderboard scores, V1 Verified.

Tokens

3.4× fewer

output tokens per task

  1. SheetXL2,939
  2. Tetranot published
  3. GPT for Excelnot published
  4. GRID Agent9,978
  5. Leninot published

Average per task, against the one other engine that publishes token counts. Against an agent with no engine: about 7×.

Time

30 seconds

per task, average

  1. SheetXL30 s
  2. Tetra112 s
  3. GPT for Excel24 s
  4. GRID Agent130 s
  5. Leninot published

Average per task, as each vendor reports it.

Against GRID Agent, the one other run with per-task figures: 2.9× fewer tool calls and half the input tokens. All 400 tasks ran in 76 minutes for about $140 at list price.

* Submitted to the SpreadsheetBench leaderboard, November 2026. Listing pending.

#1 of bring-your-own-agent engines

Your agent. Your model.

SheetXL is a plugin for the agent you already run. This run was Claude Code and Claude Opus 5.5, unmodified, with the plugin anyone can install. No private agent, no hosted service.

SheetXL for Agents →
#1 of public results

Publicly verifiable.

Every output workbook, every prompt, every model turn and every engine call is in a public repository. Anyone can re-grade the run and get our number.

The results repository →

Publicly verifiable results

Publishing a run means anyone can open the files and disagree with you. Credit to every vendor here for doing it. The leaderboard also lists entries from 95.5% to 99.25%; we found no outputs, logs or method for them, and will add them when they are published.

Why an engine wins

A model with a Python library reads a file it cannot calculate and saves a workbook it has never seen the results of. SheetXL gives the agent the spreadsheet itself.

545+

Excel functions, live

A real calculation engine

Every write recalculates. The agent sets a formula, reads the value back and knows it is right before it moves on. =5.35*1.5 is 8.024999999999999 in Excel, and in SheetXL, bit for bit.

1 call

to map a sheet

Region detection

getRegions() returns every block of a sheet, profiled: headers, column types, where a formula pattern runs and where it breaks. The odd cell in 800 rows comes back as its own region.

8

tool calls, median task

Scripting

The agent writes a short TypeScript script and it runs inside the engine: read, compute, write, verify. A whole task is often one script, not a click per cell.

≈45

vector operations

A vector API

Ranges are NumPy-shaped vectors. A column is transformed inside the engine and never passes through the model, so 50,000 rows cost the same tokens as 5.

How the run was made

Agent

Claude Code

headless, with the SheetXL plugin

Model

Claude Opus 5.5

no fine-tuning, no private model

Attempts

1 per task

one solve turn, no verify pass, no retries

Full runs

Best of 9

and the latest; all nine are published

Method
  • The agent saw the instruction, the answer range and the input workbook. Never an expected answer.
  • The benchmark is a regression suite for the engine. Each full run surfaced engine bugs and gaps in the skill, and the fixes ship in the product. The prompt, the rules and the skill are published exactly as the agent saw them. The result is stable, not a lucky run: the last three full runs, on the same prompt, scored 384, 383 and 384 under the public evaluator.
  • 388 is the score as the leaderboard counts it. Four tasks have answer ranges the public evaluator script cannot parse, and the leaderboard's listed scores count them: GRID's published files score 361 under the script and 365 on the board. Under the script alone, ours is 384 (96.00%). Either number is the highest published.

Why not 100%?

Good questions produce good answers.

SpreadsheetBench is built from real questions that real people asked about real workbooks, which is what makes it worth measuring against. Real questions are sometimes ambiguous, and an agent can only be as good as what it is asked. Twelve tasks did not pass. All twelve count against us. Seven of them we chose not to chase: passing them means following the expected answer against the question, and an agent taught to do that is worse at real work.

  • 388 passed
  • 7 the question and its expected answer disagree
  • 5 ours to fix
The 7 where the question and the answer disagree

The instruction or the workbook says one thing and the expected answer does another. We followed the task.

TaskThe task saysWhat we didThe expected answer
44017Apply the increases “to the base rate in column W”Used column WA different column for each of the twelve months
45738The input already holds 1160 in cell L13Computed 11600 for that cell
118-50The answer range starts at C2Wrote from C2Starts at C1, so every row is off by one
13284“Only consider rows where both the Start and End values are populated”Skipped rows with a blank EndMatches rows where End is blank
22-47Order the names by a helper list and “sort only column H”Ordered by the list, sorted column H on its ownWhole rows sorted by H; the list is not used
534-26Delete columns before “the current month”; its own Result sheet keeps December 2020 onwardMatched the Result sheetEvery date column is gone
3002Its own example labels row 7 “Multiple” and rows 8 to 10 “Single”Followed the exampleThe reverse

Others have found the same. GRID's published notes record 0 passes in 87 attempts on 44017, 0 in 86 on 45738 and 0 in 36 on 118-50, across every model it ran. GRID's task notes

The 5 that are ours to fix

Reasonable readings that were not the expected one, and one bug.

TaskWhat we didWhat was expected
469-9Split amounts into Debits and Credits, reading negative amounts as debits. The sheet does not say which is which.Positive amounts are the debits.
524-31Assigned categories with a lookup, and left #N/A in the 7 of 53 rows that match no category.Those cells are empty.
56786Wrote a rolling 365-day average over the entries before each row.The average includes the row itself.
59129Counted an employee whose last day is January 1 in January's headcount. Eleven of twelve months match.20, not 21. This task passed in earlier runs.
423-16No output. The engine ran out of memory on this workbook.A SheetXL bug, and ours to fix.

Run it yourself

SheetXL is a plugin for the agent you already run. Your workbooks never leave your machine.

SheetXL for Agents →The results repository →