SheetXL on SpreadsheetBench
97%*
388 of 400. The highest score of any vendor that has published its results.
97%
of tasks solved, first attempt
- SheetXL97.00%
- Tetra94.25%
- GPT for Excel92.50%
- GRID Agent91.25%
- Leni91.25%
Leaderboard scores, V1 Verified.
3.4× fewer
output tokens per task
- SheetXL2,939
- Tetranot published
- GPT for Excelnot published
- GRID Agent9,978
- Leninot published
Average per task, against the one other engine that publishes token counts. Against an agent with no engine: about 7×.
30 seconds
per task, average
- SheetXL30 s
- Tetra112 s
- GPT for Excel24 s
- GRID Agent130 s
- 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.
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 →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
| Agent | Score | What is public |
|---|---|---|
| SheetXL | 97.00%* | Outputs, transcripts, every engine call, prompts, evaluator results |
| Tetra (DealGlass) | 94.25% | Evaluation logs and results |
| GPT for Excel (Talarian) | 92.50% | Write-up |
| GRID Agent | 91.25% | Outputs, transcripts, evaluator results |
| Leni | 91.25% | Outputs, running log, 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.
| Task | The task says | What we did | The expected answer |
|---|---|---|---|
| 44017 | Apply the increases “to the base rate in column W” | Used column W | A different column for each of the twelve months |
| 45738 | The input already holds 1160 in cell L13 | Computed 1160 | 0 for that cell |
| 118-50 | The answer range starts at C2 | Wrote from C2 | Starts 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 End | Matches rows where End is blank |
| 22-47 | Order the names by a helper list and “sort only column H” | Ordered by the list, sorted column H on its own | Whole rows sorted by H; the list is not used |
| 534-26 | Delete columns before “the current month”; its own Result sheet keeps December 2020 onward | Matched the Result sheet | Every date column is gone |
| 3002 | Its own example labels row 7 “Multiple” and rows 8 to 10 “Single” | Followed the example | The 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.
| Task | What we did | What was expected |
|---|---|---|
| 469-9 | Split amounts into Debits and Credits, reading negative amounts as debits. The sheet does not say which is which. | Positive amounts are the debits. |
| 524-31 | Assigned categories with a lookup, and left #N/A in the 7 of 53 rows that match no category. | Those cells are empty. |
| 56786 | Wrote a rolling 365-day average over the entries before each row. | The average includes the row itself. |
| 59129 | Counted 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-16 | No 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.