NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #2096 most downloaded on pub.dev
A community fork of the excel library to read, create, and edit XLSX files. Cross-platform, high-performance, and supports charts, borders, and formulas.
Last release today
07 Oct 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 39 of 40 stable releases
1 version withdrawn
withdrawn after publishing
6 months old
41 releases · first in 2026
One column per month.
Fixed appendRow getting slower as the sheet grows.
appendRow getting slower as the sheet grows.showTotalsRow overwriting the last row of data.sheet.refreshPivotTables() to recompute pivot tables after changing their data.Saving the same workbook more than once (encode()/save()) no longer duplicates chart and image anchors, relationships and styles, which made Excel rep
encode()/save()) no longer duplicates chart and image anchors, relationships and styles, which made Excel repair the file.npm install <folder>), accepts JS Date values and chart/table config objects, and no longer defines window/self globals in Node.sheet.unmerge('A1') now unmerges the range containing the cell (it silently did nothing).clustered grouping, which kept Excel from opening the file.&C was saved as &C, and amp in the text became &).Sheet1 requested with excel['Sheet1'] is no longer renamed when another sheet is added, which detached it and lost its later changes.cell.setStyle() keeps the options it is not given, and sheet.protect(password, options) options now mean "allow" (true allows the action), as documented.<script> build (dist/excel_community.browser.js) and a browser example page with tests, a demo workbook, an .xlsx viewer and a playground.Sheet1 being renamed and losing changes when another sheet is added.Excel Tables: sheet.addTable(), getTable, updateTable, removeTable, tableRowsAsMaps and appendTableRow, with the 60 built-in table styles, totals row
sheet.addTable(), getTable, updateTable, removeTable, tableRowsAsMaps and appendTableRow, with the 60 built-in table styles, totals row and structured references. Tables are read, saved and moved with row/column inserts and removals.sheet.groupRows() / groupColumns() (up to 7 levels), ungroup, collapse/expand, rowGroups / columnGroups and OutlineSettings.xl/calcChain.xml is dropped on save (Excel rebuilds it).insertRow / removeRow / insertColumn / removeColumn now move row heights, column widths and hidden flags, also on empty rows/columns.<sheetFormatPr> always has defaultRowHeight.Excel.createExcel() uses Excel's default outline settings on Sheet1.0.3 with ?/? is 1/3), rounded seconds, no -0.00, Japanese eras only with [$-411], and built-in format 47 is mm:ss.0..xls files with 4096-byte sectors are read correctly.Page Setup & Printing: PageSetup (orientation, paper size, scale, fit to pages), PageMargins and PrintOptions (gridlines, headings, centering) via she
PageSetup (orientation, paper size, scale, fit to pages), PageMargins and PrintOptions (gridlines, headings, centering) via sheet.setPageOrientation(), setPaperSize(), fitToPages() and more.sheet.rowsAsMaps(), rowsAsValues(), toJson(), toCsv(), excel.toJson() and appendRowsFromMaps().DataValidation (list, numbers, dates, times, text length, custom formula) with input/error messages, sheet.addDataValidation() and accepts() to check values in Dart.sheet.setHyperlink() and cell.hyperlink.TRUE / FALSE.ListTile background warning.`Sheet.getColumnWidth()` / `Sheet.getRowHeight()` no longer throw Null check operator used on a null value on sheets without a default width/height (e
Sheet.getColumnWidth() / Sheet.getRowHeight() no longer throw Null check operator used on a null value on sheets without a default width/height (e.g. sheets created with excel['New sheet'] or decoded from files without <sheetFormatPr> defaults). They now fall back to the sheet default and then to Excel's defaults (column width 8.43, row height 15.0), the same values already used when saving.Sheet Tab Colors (` `): Full OpenXML/SpreadsheetML support for colored worksheet tabs.
Sheet Tab Colors (<tabColor>): Full OpenXML/SpreadsheetML support for colored worksheet tabs.
TabColor Domain Model: Encapsulates <tabColor> element with support for 8-digit ARGB hex (#RRGGBB, RRGGBB, #AARRGGBB, AARRGGBB, and 3-char shorthand #RGB), ExcelColor presets, Office theme color indices (theme), tints (tint), indexed colors (indexed), and auto colors (auto).sheet.tabColor (getter and setter)sheet.setTabColor(ExcelColor color)sheet.setTabColorHex(String hex)sheet.clearTabColor() and alias sheet.removeTabColor()sheet.hasTabColor (boolean getter)_WorksheetParser extracts <tabColor> attributes (rgb, theme, tint, indexed, auto) directly with zero memory overhead.<sheetPr> as the very first child element preceding <outlinePr> and <pageSetUpPr> in strict compliance with ECMA-376 Part 4 CT_SheetPr sequence rules.<sheetPr> attributes (codeName, filterMode, etc.) and non-color child elements (<outlinePr>, <pageSetUpPr>) across read/write cycles.<tabColor>)" section to excel_flutter_example with real-time UI preview showing colored tabs, source code snippets, and live XLSX file generation.AutoFilter (<autoFilter>): Full OpenXML/SpreadsheetML support for worksheet auto-filters.
AutoFilter Model: Represents <autoFilter ref="..."> with normalized coordinates, start/end cells (startCell, endCell), dimensions (rowCount, columnCount), and containment checks (containsCell, containsCellId).FilterColumn & CustomFilterRule: Column criteria configuration (<filterColumn>), button visibility flags (hiddenButton, showButton), matching values (<filters><filter val="..."/></filters>), blank filtering, and custom comparison rules (<customFilters>).sheet.setAutoFilter(CellIndex start, CellIndex end, {List<FilterColumn>? filterColumns})sheet.setAutoFilterByString(String range, {List<FilterColumn>? filterColumns})sheet.clearAutoFilter() and alias sheet.removeAutoFilter()sheet.hasAutoFilter (boolean getter)sheet.addFilterColumn(FilterColumn filterColumn)_WorksheetParser supporting self-closing <autoFilter ref="..."/> and child elements with zero memory overhead.sheetProtection and preceding sortState and mergeCells).<autoFilter>)" showcase section in excel_flutter_example with live code, interactive preview, and downloadable XLSX file.`FormulaCellValue.cachedValue`: formula cells now retain the pre-calculated result found in the source file (instead of discarding it), so the last va
FormulaCellValue.cachedValue: formula cells now retain the pre-calculated <v> result found in the source file (instead of discarding it), so the last value Excel computed can be read without recalculating the formula.Data.displayText and NumFormat.format(CellValue?): render a cell's value as the display text a spreadsheet application would show, based on its assigned number format (e.g. 1234.5 with NumFormat.standard_7 → "$1,234.50"). Best-effort coverage of the ~50 built-in standard formats plus common custom currency/percentage/date/time patterns.FormulaCellValue.cachedValue and Data.displayText against a bundled fixture with real cached formula results.`BubbleChart` (` `): 3-dimensional data comparison plotting X, Y, and Bubble Size with configurable bubbleScale and showNegativeBubbles.
BubbleChart (<c:bubbleChart>): 3-dimensional data comparison plotting X, Y, and Bubble Size with configurable bubbleScale and showNegativeBubbles.StockChart (<c:stockChart>): Financial stock price fluctuations (High-Low-Close, Open-High-Low-Close) with showHighLowLines and showUpDownBars.OfPieChart (<c:ofPieChart>): Pie-of-Pie and Bar-of-Pie secondary breakdown charts with configurable ofPieType (pie/bar), splitType (position/value/percent), and secondPieSize.ChartGrouping):
grouping parameter (clustered, stacked, percentStacked) to ColumnChart, BarChart, AreaChart, and LineChart.showMarkers and smooth (spline curves) to LineChart.showLines, showMarkers, and smooth (spline curves) to ScatterChart.ChartDataLabels): Every chart type now accepts an optional dataLabels parameter that renders labels on each data point. Supported components: value, categoryName, seriesName, and percentage (pie / doughnut). Custom separator and labelPosition are also supported. The XML round-trip is preserved (labels written to <c:dLbls> are re-read via ChartXmlWriter.parseDataLabelsFromXml).ChartSeriesStyle, ChartFillType): Per-series visual customization for all chart types via ChartSeries.style.
ChartFillType.solid), customizable transparency with fillAlpha (ChartFillType.transparent), and border-only no-fill (ChartFillType.none).borderColor, borderAlpha, and borderWidth in EMUs.excel_flutter_example for Bubble, Stock & Stacked Charts, Chart Data Labels, and Chart Color Customization.README.md with complete documentation, parameter tables, and worked examples for all 11 chart types.Merge Cells: Fix merge cells parsing and saving.
Conditional Formatting (` `): Native OpenXML/SpreadsheetML support for Conditional Formatting rules and Differential Styles ( ).
<conditionalFormatting>): Native OpenXML/SpreadsheetML support for Conditional Formatting rules and Differential Styles (<dxfs>).
cellIs), text matching (containsText, notContains, beginsWith, endsWith), custom formula expressions (expression), and duplicate/unique values (duplicateValues, uniqueValues)..xlsx files.example/excel_conditional_formatting.dart), documentation snippet, and a new interactive section in the Flutter demo app (excel_flutter_example).Cell Comments: Added support and usage instructions for Cell Comments.
Cell Comments section displaying a sheet with formatted comments and hover preview tooltips.Pivot Table Add Official support and usage instructions for Pivot Tables.
Show Icon show excel community logo.
SST parsing: Fixed the SST parsing logic to correctly read the shared strings from the SST stream.
Legacy XLS File Support: Added read-only support for parsing legacy .xls (Excel 97-2003) workbooks using a custom, clean-room OLE2 and BIFF8 parser im
.xls (Excel 97-2003) workbooks using a custom, clean-room OLE2 and BIFF8 parser implemented from scratch in pure Dart. It decodes sheet names, row/column dimensions, and cell values (TextCellValue, IntCellValue, DoubleCellValue), with transparent fallback inside Excel.decodeBytes and Excel.decodeBuffer using signature magic bytes detection.- Improve documentation
Hidden Columns & Rows: New Sheet.setColumnHidden(index, hidden), Sheet.isColumnHidden(index), Sheet.setRowHidden(index, hidden), and Sheet.isRowHidden
Sheet.setColumnHidden(index, hidden), Sheet.isColumnHidden(index), Sheet.setRowHidden(index, hidden), and Sheet.isRowHidden(index) methods to toggle and query visibility of columns/rows. Full serialization to OOXML <col hidden="1"> and <row hidden="1"> on save, and parsing from XLSX on decode.Hidden Columns & Rows sidebar demo displaying a multi-sheet spreadsheet where some sheets contain hidden elements and others are fully visible.xl/drawings/drawing1.xml) and its worksheet relationship from the base sheet template base64 string inside constants.dart. This ensures newly created worksheets (such as Sheet2) that have charts do not bleed/render their charts onto the first sheet (Sheet1) of the workbook, whilst preserving pre-existing charts when editing loaded files.Multi-Sheet Freeze Panes: Added hidden columns to the Staff Salaries and Executive Perks sheets, with corresponding data removed. Now only the Public
Multi-Sheet Freeze Panes: Added hidden columns to the Staff Salaries and Executive Perks sheets, with corresponding data removed. Now only the Public Directory sheet is visible, while the other two remain hidden (but fully functional) in the generated XLSX file.
Multi-Sheet Charts: Fixed chart issue in multi-sheet workbooks.
Freeze Panes: New Sheet.frozenRows and Sheet.frozenColumns setters/getters (nullable int?). Each sheet in a workbook can carry its own independent fre
Sheet.frozenRows and Sheet.frozenColumns setters/getters (nullable int?). Each sheet in a workbook can carry its own independent freeze combination (rows+cols, rows only, cols only, or none). Values are serialized as OOXML-compliant <pane> elements on save and fully restored on decode.example/excel_freeze_panes.dart (single-sheet samples) and example/excel_freeze_panes_multisheet.dart (multi-sheet workbook with per-sheet freezes and round-trip assertions).Freeze Panes and Multi-Sheet Freeze Panes sidebar sections, with matching helpers and code snippets.test/freeze_panes_test.dart covering the four freeze configurations (4/4 passing).<sheetView> writer: Only the first sheet in the workbook carries tabSelected="1" (Excel requires exactly one active tab). <selection> entries and activePane are now chosen dynamically based on the actual split configuration, so Excel no longer shows the "Reparaciones / Recover as much as we can" dialog on multi-sheet workbooks.Sheet Protection: Added full programmatic support for worksheet protection, including password hashing (legacy 16-bit XOR algorithm) and custom protec
locked and hidden boolean properties on CellStyle to control cell editability/visibility under sheet protection.XML parsing pipeline: Refactored to use a streaming-based approach with iterative DOM building instead of full recursive parsing.
Cell Style: Fix underline and strikethrough preservation bug in CellStyle constructor and parsing logic.
### Fixed - Wasm: Fix save excel file. - Lint issues: Fix lint issues.
XML parsing pipeline: Refactored to use a streaming-based approach with iterative DOM building instead of full recursive parsing.
_XfCache._readXfs method when processing shared strings with rich text formatting.Chart XML — series name (`c:tx`): The series name inside was incorrectly wrapped in , which is not a valid child according to the OOXML CT_SerTx schem
c:tx): The series name inside <c:tx> was incorrectly wrapped in <c:strLit>, which is not a valid child according to the OOXML CT_SerTx schema (§21.2.2.174). It now correctly uses <c:v> directly, fixing broken/missing series names when opening generated files in Microsoft Excel.CT_Chart: <c:autoTitleDeleted> was emitted before <c:title>, violating the required sequence defined in OOXML §21.2.2.29. The order is now <c:title> → <c:autoTitleDeleted>, fixing chart validation errors in strict Excel readers.standard_21 format code: Was 'h:mm:dd' (invalid), corrected to 'h:mm:ss' per ECMA-376 §18.8.30.standard_40 format code: Was '#,##0.00;[Red](#,#)' (truncated), corrected to '#,##0.00;[Red](#,##0.00)'.standard_5–standard_8 ($#,##0, $#,##0.00 with normal/red negative variants).standard_23–standard_26 (mapped to General).standard_27–standard_36.standard_41–standard_44 (_(* …) / _($* …) patterns).parse.dart into styles_parser.dart (style/XF resolution) and worksheet_parser.dart (row/cell parsing) for improved maintainability.Image embedding support: embed PNG, JPEG, GIF, BMP, TIFF, WMF, EMF, SVG, WebP, and ICO images into worksheets.
ExcelImage model class with fromFile factory for automatic type detection from file extension.ExcelImageType enum with fromExtension factory covering 10 image formats.ImageAnchor class with fromPixels factory (96 DPI) and direct EMU constructor.SheetImages extension on Sheet exposing addImage() and images getter._ImageManager save-pipeline component that writes OOXML drawing, relationship, and media files.example/excel_images.dart demonstrating PNG and SVG embedding.- Fix Excel Community logo.
Added logo for the package in the README.md.
Add Excel Community logo to pub.dev.
Update logo to open source version.
Fix Losing Cell styling when setting a new value to a cell.
Fix rich-text bold/italic/underline parsing per ECMA-376
- add funding text
Fix underline preservation bug in CellStyle constructor and parsing logic.
- Fix color accessibility.
Apply clean code fix minors bugs.
Apply Clean Architecture in Save class.
Renamed main example to example/main.dart for better visibility on pub.dev.
example/main.dart for better visibility on pub.dev.Nothing published for this version
Reorganized tests: moved manual debug scripts to test/manual/.
test/manual/.parse.dart and save_file.dart.Initial Release of the community fork.
dart:html to package:webYour coding agent can read these notes before it upgrades. Set up the MCP server →