Every spreadsheet solution will say it is compatible with Excel. Now we can check those claims.
For eight years our job at GRID has been to build a spreadsheet engine that gives the same answer as Excel, because if a model returns different numbers nobody will trust your solution. To make sure we'd earn that trust, we had to build a test rig.
Today we are opening that rig up. The GRID Spreadsheet Benchmark measures how closely an engine's formula results match Excel's. It runs thirteen engines today, the results are live on the benchmark page, and everything needed to rerun it is in a public repository. If you are choosing an engine to build on, or building one yourself, this is meant for you.
What we measure
Excel is the reference. Every test workbook is opened in desktop Excel, fully recalculated and saved. The value Excel writes into each formula cell is the expected answer. Not the value a test's author wrote next to the formula, not a specification, and not our own engine.
The tests are other people's. We did not write the tests we score on. We took eight test suites from open-source projects: two from IronCalc, and one each from LibreOffice, Gnumeric, Apache POI, HyperFormula, Univer and fast-formula-parser. Each is imported at a pinned commit, and the suites written as code are turned into workbooks, one cell per test case. That gives 102,516 test cases covering 497 of Excel's functions. We also have our own comprehensive suite of function tests, which gives us extra depth, but it stays out of the public score.
Every engine gets the same cells, and must match exactly. The engine must return Excel's value, or the same error Excel returns. Text, true/false and errors must be identical, and that includes complex numbers, which Excel's functions return as text, so they get no numeric tolerance. Numbers count as equal when they agree to about seven significant digits, or lie within 5×10⁻⁸ of each other when they are close to zero. Two correct engines can differ in the last digits: they add things up in a different order, or stop an iterative function like IRR one step apart. That is not a wrong answer, and nobody reads a model to the fifteenth digit. Cases Excel itself cannot judge are left out: volatile functions like RAND and NOW, functions Excel does not have, like REGEXMATCH, ISEMAIL, WEEKS and HF.ADD, and formulas Excel drops when it repairs a file.
Every engine really recalculates. An engine that reads an xlsx file also sees the values Excel saved in it, and could hand those back instead of computing anything. We check that every engine on the board computes its own answers.
The board
As of 10 November 2026, v1. The benchmark page has the current results.
| Engine | Version | Compatibility | Failures per 1,000, log scale | |
|---|---|---|---|---|
| 1 | GRID19.0.0 | 19.0.0 | 99.9% | 1.2 |
| 2 | GridCraft0.18.0 | 0.18.0 | 95.8% | 42 |
| 3 | IronCalc0.9.1 | 0.9.1 | 95.2% | 48 |
| 4 | SpreadsheetGear9.3.85 | 9.3.85 | 94.4% | 56 |
| 5 | Mog1.0.0 | 1.0.0 | 91.5% | 85 |
| 6 | SpreadJS19.2.5 | 19.2.5 | 91.3% | 87 |
| 7 | Univer1.4.0 | 1.4.0 | 91.2% | 88 |
| 8 | Google SheetsWeb, Nov 9, 2026 | Web, Nov 9, 2026 | 90.6% | 94 |
| 9 | LibreOffice26.8.2.2 | 26.8.2.2 | 87.4% | 126 |
| 10 | HyperFormula3.5.0 | 3.5.0 | 82.9% | 171 |
| 11 | Gnumeric1.12.62 | 1.12.62 | 82.8% | 172 |
| 12 | Apache POI6.0.0 | 6.0.0 | 52.9% | 471 |
| 13 | fast-formula-parser1.0.19 | 1.0.19 | 47.0% | 530 |
| 1101001,000 |
These are good engines. Behind us, the next three are within a point and a half of each other, and seven more score above 90%. Four implement a function we have not yet, FILTERXML. Apache POI and fast-formula-parser are a different kind of project, a file library and a formula parser with evaluators on the side, and their scores should be read that way.
Why the last few percent are the hardest
A percentage near 100 hides how far apart engines are. Look at failures instead. An engine at 95.81% gets 42 of every 1,000 cases wrong. At 99.88% it is 1.2. That is about 35 times fewer wrong answers, from what looks like a gap of about 4 points. It is why the page plots failures on a log scale: each step closer to Excel takes more work than the last.
The reason is what the remaining failures are. The first 90% is implementing functions. The next few points are getting them right on ordinary inputs. What is left after that are the edge cases, and our own remaining failures show what they look like. =DATEVALUE("Jan1, 2015"), with no space after the month, is 1 January 2015 in Excel and #VALUE! in GRID. =TEXT(A1,"hh:mm a/p") at half past midnight gives 12:30 a in Excel, where GRID prints 00:30 a/p. And =ROW(INDIRECT("NonExist!W3")) is #REF! in Excel, since there is no such sheet, where GRID answers 3. Each one is a small fix. There are thousands of them, and nobody tells you where they are.
The benchmark page shows the same thing per function. Of the 497 functions tested, GRID passes every test case for 439. The next engines are at 170 (SpreadsheetGear) and 123 (GridCraft). What separates the top engines is no longer how many functions they implement, but how many of those functions you can trust on every input these suites test.
Suite by suite
The page shows the pooled score. Here is the same run broken down by the suite the tests came from, with each engine's own suite outlined.
| Engine | Test suites | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| Cases | 102,516 | 72,678 | 11,454 | 5,523 | 4,491 | 3,178 | 1,960 | 1,767 | 1,465 |
| GRID | 99.9 | 99.98 | 99.4 | 99.4 | 99.9 | 100.0 | 99.8 | 99.6 | 100.0 |
| GridCraft | 95.8 | 97.2 | 92.8 | 89.6 | 94.4 | 90.3 | 96.9 | 91.2 | 93.9 |
| IronCalc | 95.2 | 99.9 | 88.7 | 76.1 | 80.6 | 92.7 | 73.7 | 91.4 | 71.5 |
| SpreadsheetGear | 94.4 | 96.4 | 88.0 | 84.4 | 93.0 | 98.5 | 99.3 | 73.0 | 95.9 |
| Mog | 91.5 | 94.4 | 89.0 | 73.8 | 89.1 | 84.1 | 82.2 | 76.2 | 87.7 |
| SpreadJS | 91.3 | 94.2 | 86.5 | 79.4 | 91.3 | 79.8 | 69.6 | 87.5 | 87.7 |
| Univer | 91.2 | 92.2 | 88.8 | 93.8 | 91.1 | 78.1 | 85.5 | 88.2 | 91.5 |
| Google Sheets | 90.6 | 94.3 | 75.9 | 75.2 | 90.7 | 89.6 | 93.0 | 85.6 | 86.6 |
| LibreOffice | 87.4 | 90.7 | 83.8 | 65.0 | 82.8 | 86.8 | 88.5 | 71.6 | 70.0 |
| HyperFormula | 82.9 | 89.7 | 64.8 | 51.2 | 85.9 | 76.7 | 67.4 | 55.3 | 66.1 |
| Gnumeric | 82.8 | 83.4 | 80.3 | 71.2 | 84.8 | 93.2 | 98.2 | 72.1 | 81.3 |
| Apache POI | 52.9 | 51.6 | 46.1 | 44.3 | 65.2 | 98.8 | 66.3 | 52.6 | 51.0 |
| fast-formula-parser | 47.0 | 44.6 | 45.5 | 40.9 | 65.3 | 58.8 | 61.9 | 48.0 | 95.6 |
One suite carries most of the cases. IronCalc's suite supplies about 71% of them (72,678 of 102,516), 73% with IronCalc's unit tests, and two of its workbooks, ARABIC_ROMAN and FLOOR_CEILING, about half of all cases. We pool every case rather than weighting suites, because the suites are a well of good tests and more tests are better. But it means the headline leans on IronCalc's suite, where IronCalc itself scores 99.9%. Weigh the 8 suites equally instead and GRID is still first, while IronCalc moves from third to eighth. The repository lists every engine's mean of suites. Read across a row and you see how an engine does on tests written by people who never saw its code.
No engine passes all its own tests. IronCalc comes closest at 99.9%. HyperFormula passes 85.9% of its own suite, LibreOffice 83.8%. The reason is how the benchmark is built. We keep each suite's formulas and inputs, but not its expected answers: every workbook goes through Excel, and Excel's answer becomes the expected value. So when an engine misses one of its own tests here, it is usually because the test's author expected something different from what Excel returns. In more than nine in ten of HyperFormula's misses on its own suite, the engine returns exactly the answer its own test expects. Excel is the one that disagrees. The same holds for most of the misses by Univer, Apache POI and fast-formula-parser on their own suites, and for more than half of LibreOffice's.
Some of those differences seem deliberate. HyperFormula's tests read dates day first, so "02/08/2020" is 2 August to them and 8 February to Excel in US English. LibreOffice converts units Excel does not know, and finds an interest rate where Excel gives up with #NUM!. Others, like its Bessel functions parting ways with Excel's in the sixth or seventh digit, are harder to call.
And some of the drift is Excel's own. A test written years ago to match Excel's answer at the time may not match what today's Excel returns. Excel changes, quietly, and a test suite is a snapshot of what its authors believed when they wrote it. That is one more reason to measure against Excel itself rather than against anyone's expected answers, ours included.
Reading the numbers honestly
This is a stress test, not a model. Test suites exist to find what breaks: odd inputs, boundaries, error handling, obscure functions. A failure rate of 5% here does not mean one cell in twenty goes wrong in a real workbook. But the larger and more complex the model, a big financial model say, the more likely it is to hit some of these cases somewhere. That is why the last edge cases matter: every engine, ours included, still has some, and a big model finds them.
File in, values out. Engines that read xlsx files themselves carry their reader's bugs in these numbers, because that is what their users get. Engines without a reader are handed the cells and formulas, which is how their users run them. An open-source xlsx reader reads the files for them, the same one for every such engine. One of our engineers wrote it. Our own engine reads the files itself. Google Sheets imports each workbook into Google Drive, and its xlsx export gives the values.
A workbook an engine cannot finish counts in full. If an engine fails to load a workbook, crashes on it or takes more than 60 seconds, every case in it counts as wrong, including cases that would otherwise be left out. One workbook that fast-formula-parser does not finish in time costs it 11 points.
Excel is the reference, not the truth. Excel has quirks, and matching them is the point. The reference is desktop Excel for Windows 16.0, build 20527, in US English.
Versions move. Several of these engines release monthly. Every result carries the version and the date it was run, and we will rerun the board as engines release.
Rerun it yourself
The harness is in the public repository, under the Apache 2.0 licence. It holds the import scripts for the eight suites, the Excel-saved test workbooks, the runner for every engine on the public board, and every published report. You do not need Excel, or anything from GRID beyond our public engine package, to reproduce the numbers: clone, install, run. The commercial engines need their own licence or trial key, and Google Sheets a Google account.
The test workbooks keep the licences of the suites they came from, and the results are published under CC BY 4.0, so use them, with credit. This is v1 of the benchmark: the suites are frozen at the commits listed in the repository, so every number on the board is measured against the same tests. Upstream suites keep growing, and moving to their newer tests will be a new version of the benchmark, not a quiet update to this one.
Found a bug, think we ran an engine wrong, or want another engine on the board? Open an issue. We will fix the setup and rerun.
What comes next
This is the first of at least three benchmarks. Formula compatibility asks whether an engine gets the answer right. The next two ask what else it supports, and how fast it gets there: coverage of features beyond formulas, and performance and memory usage on real-sized workbooks. Those numbers are coming, and we expect them to be just as interesting.
If you need Excel's answers inside your own product, the engine at the top of this board is the one we make: the GRID spreadsheet engine.