Supported Formats
Spreadsheet formats
| Format | Extension | Read | Write | Notes |
|---|---|---|---|---|
| Excel Workbook | .xlsx |
✔ | ✔ | The primary and best-supported format |
| Excel Macro-Enabled Workbook | .xlsm |
✔ | ✔ | VBA preserved, never executed |
| Excel Binary Workbook | .xlsb |
✔ | ✔ | Binary OOXML; faster and smaller than .xlsx |
| Excel 97–2003 | .xls |
✔ | ✔ | BIFF8. Subject to the format’s own limits — 65,536 rows, 256 columns |
| OpenDocument Spreadsheet | .ods |
✔ | ✔ | Formulas and values; including encrypted ODS. 0.1.0 builds wrote and read values only |
| Comma-Separated Values | .csv |
✔ | ✔ | One sheet of values; type sniffing on import. Text is exported as is — see Import and Export |
| JSON | .json |
✔ | ✔ | One sheet as an array of row objects keyed by the header row; values only |
Workbook.open(Path) also reads the template variants .xltx and .xltm,
tab-separated .tsv and .txt, .html/.htm tables, .ots, .sxc, and
flat .fods, and SpreadsheetML 2003 .xml.
Output formats
| Format | Write | Notes |
|---|---|---|
| ✔ | Paginated; encryption, permissions, watermarks, bookmarks, PDF/A | |
| PNG | ✔ | Per sheet or per page |
| SVG | ✔ | Vector glyph outlines; text is not selectable or searchable |
| JPEG, GIF, BMP, TIFF | ✔ | Per sheet or per page |
| HTML | ✔ | Styled table, single-file or with attachments |
See Rendering.
Feature support
Beyond values and formulas, these are modelled — read, computed where applicable, written, and rendered:
| Formulas | 500+ functions, dynamic arrays and spill, structured references, iterative calculation, shared formulas, external references with cached values |
| Number formats | Full Excel format-code syntax, including conditional sections and locale-aware formatting |
| Styles | Fonts, fills (solid, patterned, gradient), borders, alignment, rotation, indent, themes, named styles, indexed and theme colours |
| Charts | 20+ types, series, axes, data labels, error bars, trendlines, 3-D views, chart sheets. Map charts are read and written but currently render as a placeholder frame. |
| Pivot tables | Field layout, aggregation, all four filter kinds, sorting, date and numeric grouping, show-values-as, calculated fields and items, slicers, timelines |
| Tables | Header and totals rows, banding, styles, auto-expansion, structured references |
| Conditional formats | All rule kinds, colour scales, data bars, icon sets |
| Validation | All types, input and error messages, dropdowns |
| Comments | Legacy notes and modern threaded comments |
| Drawings | Pictures, shapes, connectors, SmartArt, WordArt, 3-D effects, shadows |
| Sparklines | Line, column, and win/loss groups |
| Form controls | Ten control types with linked cells |
| Protection | Sheet, range, workbook structure, write protection |
| Security | ECMA-376 agile encryption, ODS encryption, OPC digital signatures |
| Page setup | Print areas, titles, margins, scaling, fit-to-page, headers and footers, page breaks, watermarks |
| Sheet types | Worksheets, chart sheets, dialog sheets, macro sheets |
These are preserved verbatim — carried through a round trip, but not interpreted:
- VBA projects and macro modules
- ActiveX controls and OLE embeddings
- Custom XML parts
- Unknown extension lists (
extLst), including features newer than the build - Drawing parts the model does not interpret
Known limits
Worth knowing before you design around them:
.xlsis bounded by BIFF8. 65,536 rows and 256 columns, and no feature introduced after Excel 2003. Saving a larger or more modern workbook to.xlsloses what does not fit. Prefer.xlsxor.xlsb.- CSV is one sheet of text. No formulas, styles, or objects survive it.
- Macros are never executed. A
.xlsmround-trips with its VBA intact, but nothing in it runs. - A round trip is not byte-identical. Modelled parts are rewritten. Do not compare checksums.
- Rendering depends on fonts. A missing font falls back to a metric-compatible substitute, which changes line breaks. Ship the fonts you need — see Rendering.
- XPS output is not available. Use PDF for paginated output.
- Formula function coverage is per build.
Functions.list()is the authoritative answer for the version you have, not any list in documentation.