Skip to the content.

.NET Excel Library Performance Benchmarks

Independent performance and memory benchmarks comparing ClosedXML, EPPlus, OpenXML SDK, NPOI, MiniExcel, Sylvan, XLibur, OfficeIMO, IronXL and Telerik.

Independent read/write performance and memory benchmarks comparing popular .NET Excel libraries, all consumed via NuGet and run on .NET 10 with BenchmarkDotNet.

πŸ“Š Latest results (tables + static charts) β†’

πŸ“ˆ Interactive charts β†’

πŸ€– CI results (indicative) β†’

Libraries under test

Library Package Version
ClosedXML ClosedXML 0.105.1
EPPlus EPPlus 8.7.1
OpenXML SDK DocumentFormat.OpenXml 3.5.1
NPOI NPOI 2.8.1
MiniExcel MiniExcel 1.46.0
Sylvan Sylvan.Data.Excel 0.5.8
XLibur XLibur.Bundle 0.630.1-rc.18
OfficeIMO OfficeIMO.Excel 3.4.4
IronXL IronXL.Excel 2026.10.1
Telerik Telerik.Documents.Spreadsheet 2026.3.923

Library links point at each project’s source repository, except IronXL and Telerik, which are closed source β€” those go to their product pages.

IronXL and Telerik are commercial. IronXL needs a licence key to run at all and is otherwise replayed from a committed snapshot (marked β§—); Telerik runs unlicensed but watermarks every workbook it writes, so it is excluded from keyless runs β€” including the CI page β€” rather than measured. See the README.

Scenarios

Report scenario β€” capability matrix

Not every library can express this scenario; a library that skips a feature is doing strictly less work, so read its timing against this table.

Library Import + grid Conditional formatting Auto-fit column Chart
ClosedXML βœ… βœ… βœ… ❌ no public API
EPPlus βœ… βœ… βœ… βœ…
OpenXML SDK βœ… ⚠️ hand-authored ⚠️ estimated width ⚠️ hand-authored
NPOI βœ… βœ… βœ… ⚠️ titled, invalid XML
MiniExcel βœ… ❌ ❌ ❌ (not benchmarked)
Sylvan ❌ ❌ ❌ ❌ (not benchmarked)
XLibur βœ… βœ… βœ… βœ…
OfficeIMO βœ… βœ… βœ… βœ…
IronXL βœ… ⚠️ font colour only βœ… βœ…
Telerik βœ… βœ… βœ… βœ…

Edit scenario β€” capability matrix

Library Open + edit in place Delete row (shift + reference fixup) Calculation engine
ClosedXML βœ… βœ… IXLRow.Delete() βœ…
EPPlus βœ… βœ… DeleteRow() βœ…
OpenXML SDK ⚠️ hand-authored ⚠️ hand-authored ❌ sums computed by the benchmark
NPOI βœ… ⚠️ RemoveRow + ShiftRows βœ…
MiniExcel ❌ ❌ ❌ (not benchmarked)
Sylvan ❌ ❌ ❌ (not benchmarked)
XLibur βœ… βœ… IXLRow.Delete() βœ…
OfficeIMO βœ… βœ… DeleteRows(), once per row βœ… lightweight engine
IronXL βœ… βœ… RemoveRow() βœ…
Telerik βœ… βœ… RowSelection.Remove() βœ…

Insert scenario β€” capability matrix

Library Open + edit in place Insert columns (shift + reference fixup) Calculation engine
ClosedXML βœ… βœ… IXLColumn.InsertColumnsBefore() βœ…
EPPlus βœ… βœ… InsertColumn(from, count) βœ…
OpenXML SDK ⚠️ hand-authored ⚠️ hand-authored ❌ sums computed by the benchmark
NPOI βœ… βœ… XSSFSheet.ShiftColumns() βœ…
MiniExcel ❌ ❌ ❌ (not benchmarked)
Sylvan ❌ ❌ ❌ (not benchmarked)
XLibur βœ… βœ… IXLColumn.InsertColumnsBefore() βœ…
OfficeIMO βœ… βœ… InsertColumns(first, count) βœ… lightweight engine
IronXL βœ… βœ… InsertColumns(index, count) βœ…
Telerik βœ… βœ… ColumnSelection.Insert() βœ…

All 500 row totals in every saved artifact are checked against the source CSV on each dotnet run -- insert, read out of the package XML rather than through a library.

Caveats

Results are produced by running the suite locally and committing the generated markdown β€” see the repository README for how to reproduce.