v0.37.0 - 2026-10-18
-
Updated dependencies for release 0.37.0:
- Added
workbook_properties()methods toXlsx,XlsbandSheetsto read the workbook document properties, such as creator, title, and creation date, into a newWorkbookPropertiesstruct. Issue #677 and PR #685.
-
Fixed an issue with XLS worksheets that contain nested substreams, such as an embedded chart, leaking the chart cells into the worksheet. PR #701.
-
Fixed an issue where the column letters beyond
Zin formulas where reconstructed incorrectly. PR #699. -
Fixed the XLSX 1904 date epoch flag being reset by an
<x15:workbookPr>extension element. Issue #706. -
Fixed an issue to allow XLSX formula string results to decode Excel
_xHHHH_escapes, in the same way as shared and inline strings. PR #727. -
Fixed an issue to allow XLSX hyperlink attributes to decode XML entities, so that
&in a URL is no longer returned as&. PR #728. -
Fixed an XLS panic on a
PtgExpformula token with a truncated operand. PR #707. -
Fixed XLS parsing of
PtgStrformula tokens with UTF-16 string operands. PR #730. -
Fixed XLS parsing to accept
DIMENSIONSrecords with 2 extra trailing bytes. PR #735. -
Fixed the CFB reader to check the header sector counts before allocating, to avoid huge allocations on corrupt files. PR #729.
-
Fixed the East Asian built-in number formats (ids 27-36 and 50-58) to be recognized as dates and times instead of numbers. PR #734.
-
Fixed a panic in
ExcelDateTime::to_ymd_hms_milli()for very large serial dates. Values are now limited to 9999-12-31. Issue #722. -
Fixed XLSX boolean cells to only accept
0,1,falseandtrue. Any other value is now an error instead of being read astrue. Issue #724.
- fix(xls): skip nested substreams so embedded charts do not leak cells by @Nitjsefnie in https://github.com/tafia/calamine/pull/701
- fix(xls/xlsb): correct column letters in reconstructed formulas (columns >= AA) by @binggao1230 in https://github.com/tafia/calamine/pull/699
- xls: fix panic on a PtgExp token with a truncated operand by @Butch78 in https://github.com/tafia/calamine/pull/707
- xlsx: don't let x15:workbookPr reset the date1904 flag by @youdie006 in https://github.com/tafia/calamine/pull/708
- update quick-xml to 0.42.0 by @WindSoilder in https://github.com/tafia/calamine/pull/711
- chore(deps): upgrade zip to 9.0 by @chardoncs in https://github.com/tafia/calamine/pull/741
- feat(xlsx/xlsb): read workbook document properties by @Alex-ley-scrub in https://github.com/tafia/calamine/pull/685
- xlsx: unescape Excel xml escapes in formula string results by @keithadler in https://github.com/tafia/calamine/pull/727
- xlsx: decode XML entities in hyperlink attributes by @youdie006 in https://github.com/tafia/calamine/pull/728
- xls: fix PtgStr parsing for UTF-16 string operands by @shinichi1729 in https://github.com/tafia/calamine/pull/730
- fix(xls): accept DIMENSIONS records with 2 extra trailing bytes by @DylanMerigaud in https://github.com/tafia/calamine/pull/735
- Fix CRLF line termination in
examples/read_hyperlinks.rsby @musicinmybrain in https://github.com/tafia/calamine/pull/736 - Recognize East Asian built-in date and time formats by @Floating-Y in https://github.com/tafia/calamine/pull/734
- datetime: limit serial values in to_ymd_hms_milli() by @jmcnamara in https://github.com/tafia/calamine/pull/747
- xlsx: check/reject invalid boolean cell values by @jmcnamara in https://github.com/tafia/calamine/pull/749
- @Nitjsefnie made their first contribution in https://github.com/tafia/calamine/pull/701
- @binggao1230 made their first contribution in https://github.com/tafia/calamine/pull/699
- @Butch78 made their first contribution in https://github.com/tafia/calamine/pull/707
- @youdie006 made their first contribution in https://github.com/tafia/calamine/pull/708
- @chardoncs made their first contribution in https://github.com/tafia/calamine/pull/741
- @Alex-ley-scrub made their first contribution in https://github.com/tafia/calamine/pull/685
- @keithadler made their first contribution in https://github.com/tafia/calamine/pull/727
- @shinichi1729 made their first contribution in https://github.com/tafia/calamine/pull/730
- @DylanMerigaud made their first contribution in https://github.com/tafia/calamine/pull/735
- @musicinmybrain made their first contribution in https://github.com/tafia/calamine/pull/736
- @Floating-Y made their first contribution in https://github.com/tafia/calamine/pull/734
Full Changelog: https://github.com/tafia/calamine/compare/v0.36.1...v0.37.0
v0.36.1 - 2026-07-27
-
Fixed a regression in 0.36.0 that broke Strict OOXML (ISO/IEC 29500)
_rels/.relslinks. -
Fixed XLS string handling to preserve empty strings instead of discarding them. PR #679.
-
Fixed XLSB workbook parsing to consume the body of unhandled workbook-global records. A leftover body was misread as the next record id, which either silently dropped the worksheet or panicked from an empty buffer. PR #675.
- Add support for OOXML format by @saks in https://github.com/tafia/calamine/pull/681
- xls: preserve empty strings by @aquasync in https://github.com/tafia/calamine/pull/679
- fix(xlsb): consume unmatched workbook-global record bodies by @momomuchu in https://github.com/tafia/calamine/pull/675
- @momomuchu made their first contribution in https://github.com/tafia/calamine/pull/675
Full Changelog: https://github.com/tafia/calamine/compare/v0.36.0...v0.36.1
v0.36.0 - 2026-07-06
-
Added an XLSX streaming API for cell and formula records, including shared formula metadata. There are two new APIs:
XlsxCellReader::next_cell_with_formula()andXlsxCellReader::next_cell_with_formula_metadata(). Previously it required 2 separate reads to get similar information. PR #654. -
Added a per-sheet, lazy XLSX API to read worksheet hyperlinks:
Xlsx::hyperlinks_by_sheet_name()andXlsx::hyperlinks_by_sheet_id(). Each hyperlink reports its anchor range (Dimensions), external target (URL/file/mailto), optional internal location, displayed text, and optional tooltip. PR #659. -
Extended the
picturefeature to also extract cell position information and the raw image data, and to handle newer Excel 365 style embedded images. PR #652. -
Added support for reading XLSX rich string (
rstring) records. Issue #655.
-
Updated dependencies and the minimum supported Rust version (MSRV) for release 0.36.0:
atoi_simd: 0.17 → 0.18. PR #672zip: 7.0 → 8.6. This raises the MSRV from 1.83 to 1.88. PR #672quick-xml: 0.39 → 0.41, to address advisories RUSTSEC-2026-0194 and RUSTSEC-2026-0195. Issue #674.
-
Performance improvements:
-
Refactored and unified the merged-cell handling APIs. For historical reasons the XLSX methods for accessing merged cells were duplicated. This change introduces a cleaner API, deprecates the older methods, and aligns the XLS merged-cell handling with the new XLSX APIs. Issue #536.
-
Made XLSX package path resolution more robust for non-standard package layouts. Issue #638.
-
Changed XLSX
<t>text handling in shared strings and inline strings to trim leading and trailing ASCII whitespace (space, tab, CR, LF) unless the element carriesxml:space="preserve". See PR #671 and PR #673.
-
Fixed XLSX shared-formula cell-name replacement to be more precise for defined names. PR #664.
-
Fixed XLSX custom number-format detection to treat the
*(fill/repeat) operator as escaping the character that follows it. PR #667. -
Improved the XLS error message when a file is too small to be a valid workbook. PR #670.
- xlsx: handle minimal package structure by @aquasync in https://github.com/tafia/calamine/pull/639
- Refactor the APIs/code for merge cells/range handling by @jmcnamara in https://github.com/tafia/calamine/pull/651
- xlsx: add support for rstring records by @aquasync in https://github.com/tafia/calamine/pull/656
- feat(xlsx): add XLSX cell+formula streaming records with shared formula metadata by @PSU3D0 in https://github.com/tafia/calamine/pull/654
- xlsx: add worksheet hyperlink reading API by @adstep in https://github.com/tafia/calamine/pull/659
- picture: extend the picture feature to include more image metadata by @jmcnamara in https://github.com/tafia/calamine/pull/652
- perf: optimise buffer use for XLSB cell reads by @alexander-beedie in https://github.com/tafia/calamine/pull/662
- perf: custom zero-overhead attribute extraction by @alexander-beedie in https://github.com/tafia/calamine/pull/621
- tests(xlsx): add regression for date cells with quoted custom number formats by @jnsn99 in https://github.com/tafia/calamine/pull/665
- Handle the
*fill operator in custom number format detection by @greymoth-jp in https://github.com/tafia/calamine/pull/667 - More informative error if the file is very short by @sftse in https://github.com/tafia/calamine/pull/670
- fix: strip whitespace from elements without xml:space="preserve" by @dayongxie in https://github.com/tafia/calamine/pull/671
- Make shared formula cell replacement more greedy by @OSjoerdWie in https://github.com/tafia/calamine/pull/664
- example: fix cargo test warning for read_picture_data example by @jmcnamara in https://github.com/tafia/calamine/pull/676
- fix(xlsx): fix whitespace trimming bug introduced in #671 by @dayongxie in https://github.com/tafia/calamine/pull/673
- @PSU3D0 made their first contribution in https://github.com/tafia/calamine/pull/654
- @adstep made their first contribution in https://github.com/tafia/calamine/pull/659
- @jnsn99 made their first contribution in https://github.com/tafia/calamine/pull/665
- @greymoth-jp made their first contribution in https://github.com/tafia/calamine/pull/667
- @dayongxie made their first contribution in https://github.com/tafia/calamine/pull/671
- @OSjoerdWie made their first contribution in https://github.com/tafia/calamine/pull/664
Full Changelog: https://github.com/tafia/calamine/compare/v0.35.0...v0.36.0
v0.35.0 - 2026-5-10
-
Added
has_1904_epoch()method to Xls/Xlsx/Xlsb structs to allow the user to determine which date epoch is in use by Excel. PR #630. -
Made
RowDeserializerpublic to allow a customDeserializeSeed. PR #635.
-
Added deserialization examples. PR #649.
-
Performance improvements:
-
Fixed issue with redundant
<v>value in inlineStr XLSX cells. Issue #633. -
Fixed issue when processing XLSX files to ignore namespace prefix when reading relation ids. Previously accepted only
r:andrelationships:prefixes. Issue #634. -
Fixed XLSX issue where rich text
<r>elements were ignored after initial plain<t>elements. Issue #636. -
Fixed XLS issue where date format was ignored for formula values. Issue #640.
-
Fixed XLSX shared formula expansion corrupting function names. The
replace_cell_names()function treatedLOG10as a cell reference (column LOG, row 10). Issue #644. -
Fixed XLSX
inlineStrissue for elements that contain CDATA. Issue #648. -
Fixed panic when parsing formulas in XLS BIFF5 workbooks.The
parse_formulafunction decoded the non-3D PtgRef, PtgArea, PtgRefErr, and PtgAreaErr tokens assuming BIFF8 sizes. PR #643. -
Fixed XLS panic with unsupported formula functions. Handle unsupported XLS function ids as formula parse errors instead of indexing past the function table. Issue #646.
- perf: optimise
<v>cell value parsing by @alexander-beedie in https://github.com/tafia/calamine/pull/622 - perf: optimise cell reference parsing by @alexander-beedie in https://github.com/tafia/calamine/pull/623
- Allow (and ignore) v nodes in an inlineStr cell. by @aquasync in https://github.com/tafia/calamine/pull/631
- lib: expose 1900/1904 epoch for xls/xlsx/xlsb files by @jmcnamara in https://github.com/tafia/calamine/pull/630
- Use namespace-aware XML parsing for workbook. by @aquasync in https://github.com/tafia/calamine/pull/632
- de: make RowDeserializer public to allow a custom DeserializeSeed by @jmcnamara in https://github.com/tafia/calamine/pull/635
- xlsx: fix ignoring rich text after initial plain by @aquasync in https://github.com/tafia/calamine/pull/637
- xls: fix date format ignored for formula values by @aquasync in https://github.com/tafia/calamine/pull/641
- xls: fix panic parsing formulas in BIFF5 workbooks by @mogery in https://github.com/tafia/calamine/pull/643
- xlsx: fix shared formula expansion corrupting function names by @cilladev in https://github.com/tafia/calamine/pull/645
- xlsx: fix inlineStr elements that contain CDATA by @jmcnamara in https://github.com/tafia/calamine/pull/650
- docs: add deserialize examples by @jmcnamara in https://github.com/tafia/calamine/pull/649
- @aquasync made their first contribution in https://github.com/tafia/calamine/pull/631
- @mogery made their first contribution in https://github.com/tafia/calamine/pull/643
- @cilladev made their first contribution in https://github.com/tafia/calamine/pull/645
Full Changelog: https://github.com/tafia/calamine/compare/v0.34.0...v0.35.0
v0.34.0 - 2026-03-07
-
Updated benchmarking to uses the
criterion.rscrate. This removed the requirement for using+nightlyforcargo bench. PR #620. -
Updated dependencies for release 0.34.0:
quick-xml: 0.38 -> 0.39. PR #617
-
Refactored CFB to resolve special case in the caller of
fn get_chain. PR #615. -
Performance improvements:
-
Fixed capitalized workbook/book stream handling in XLS files. PR #618.
-
Fixed issue where BIFF5
LblandExternSheetrecords were incorrectly parsed as BIFF8. PR #613. -
Fixed VBA
check_variable_recordto handle optional records. PR #614. -
Fixed premature error when BIFF version is not Biff8 in XLS files. PR #619.
-
Fixed issue where XLSX cells with an empty
<v/>value returned a string with index 0 instead of an Empty value. Issue #607. -
Fixed millisecond rounding issue where 1000 milliseconds weren't rounded up to the next second. Issue #602, PR #605.
- ci: add wasm32-unknown-unknown compilation check by @Goldziher in https://github.com/tafia/calamine/pull/604
- datetime: fix millisecond rounding issue by @jmcnamara in https://github.com/tafia/calamine/pull/605
- perf: cache path and attr lookups, reuse buffers, minimise allocs by @alexander-beedie in https://github.com/tafia/calamine/pull/606
- perf: ensure
fast_float2used at all float-parsing call sites by @alexander-beedie in https://github.com/tafia/calamine/pull/608 - Fix: t=s cells with empty return strings[0] instead of Empty by @omarirfa in https://github.com/tafia/calamine/pull/610
- perf: optimise
xlssector chain reads by @alexander-beedie in https://github.com/tafia/calamine/pull/609 - fix(xls): do not prematurely error when biff != Biff8 by @sftse in https://github.com/tafia/calamine/pull/619
- deps: bump quick-xml from 0.38 to 0.39 by @jqnatividad in https://github.com/tafia/calamine/pull/617
- @Goldziher made their first contribution in https://github.com/tafia/calamine/pull/604
- @omarirfa made their first contribution in https://github.com/tafia/calamine/pull/610
Full Changelog: https://github.com/tafia/calamine/compare/v0.33.0...v0.34.0
v0.33.0 - 2026-02-04
- Added support for reading data from Pivot Tables, which involves reading data from the internal Pivot Cache. PR #559.
-
Update dependencies for release 0.33.0:
zip: 4.2.0 -> 7.0.atoi_simd: 0.16 -> 0.17
-
Fixed potential memory exhaustion issue in ODS files that could be triggered via repeated empty rows/columns.
The fix adds limits to prevent memory exhaustion from malicious ODS files that declare billions of repeated cells via
table:number-rows-repeatedandtable:number-columns-repeated attributes.The change adds the following protection layers:
- Add cap for columns per row at
MAX_COLUMNS(16,384). - Add cap for total row repeats at
MAX_ROWS(1,048,576). - Add cap for total cells at
MAX_CELLS(100 million) inget_range().
These limits match XLSX's existing row/column limits and prevent a 7KB malicious file from attempting to allocate memory for 17+ billion cells.
When MAX_CELLS is exceeded, return
OdsError::CellLimitExceededinstead of silently returning an empty range. This ensures callers are properly informed of truncation rather than receiving silent data loss. - Add cap for columns per row at
-
Fixed an issue where XLSX files with tables that had the internal
insertRowattribute set returned aDimensionsobject where the end row was less than the start row. This caused an assert/panic when trying to create aRangeobject to return the table range. Issue #589. -
Fixed an issue with XLSX files where worksheet tables used the unusual, but valid, absolute reference system like
"/xl/tables/table1.xml"instead of the common Excel generated relative system"../tables/table1.xml". Issue #587.
- xlsx: fix two table issues by @jmcnamara in https://github.com/tafia/calamine/pull/588
- ods: fix DoS via repeated rows/columns (issue #594) by @withzombies in https://github.com/tafia/calamine/pull/596
- feat: reading PivotTable (PivotCache) by @siqpush in https://github.com/tafia/calamine/pull/559
- @withzombies made their first contribution in https://github.com/tafia/calamine/pull/596
- @siqpush made their first contribution in https://github.com/tafia/calamine/pull/559
Full Changelog: https://github.com/tafia/calamine/compare/v0.32.0...v0.33.0
v0.32.0 - 2025-11-20
-
Refactored VBA reading functions to be on-demand for better performance.
-
Simplified
vba_project()function return type fromOption<Result<T>>toResult<Option<T>>for more idiomatic error handling. This is a breaking change.
-
Fixed out-of-memory vulnerabilities in XLS file parsing by bounding allocations.
-
Fixed and extended support for XLSX shared formulas with handling of ranges, absolute references, and column/row ranges in XLSX files.
-
Fixed XLSX issue with missing shared string sub-elements. Also improved error messages for shared string parsing issues.
-
Fixed acceptance of XLS
XLUnicodeRichExtendedStringrecords without reserved tags. -
Fixed various edge cases in XLS handling that could lead to parsing errors.
- typos: update list for latest version by @jmcnamara in https://github.com/tafia/calamine/pull/569
- Accept XLUnicodeRichExtendedString without reserved tag by @sftse in https://github.com/tafia/calamine/pull/571
- Oom alloc by @sftse in https://github.com/tafia/calamine/pull/575
- chore: applied some minor clippy lint suggestions by @jqnatividad in https://github.com/tafia/calamine/pull/578
- Fix issue with empty si element in xlsx shared string element by @jmcnamara in https://github.com/tafia/calamine/pull/576
- Delay reading of vba project by @sftse in https://github.com/tafia/calamine/pull/574
- Fix dragged formula multiple axes by @louisdewar in https://github.com/tafia/calamine/pull/566
- Fix absolute shared formulas by @louisdewar in https://github.com/tafia/calamine/pull/568
- refactor: dont need ref and ref mut by @sftse in https://github.com/tafia/calamine/pull/580
- XLSX: support replacing row/column ranges by @louisdewar in https://github.com/tafia/calamine/pull/582
- @louisdewar made their first contribution in https://github.com/tafia/calamine/pull/566
Full Changelog: https://github.com/tafia/calamine/compare/v0.31.0...v0.32.0
v0.31.0 - 2025-09-27
-
Upgraded
quick-xmlto v0.38. This was a significant change inquick-xmlrelative to v0.37 and required changes incalamineto entity handling. It also fixes EOL handling which may lead to regressions incalamineapplications if they expected to see"\r\n"in strings instead of the correct (for XML and Excel)"\n".For most users these will be inconsequential changes but please take note before upgrading production code.
-
Renamed the
"dates"feature flag to"chrono"since there is now some native date handling features without"chrono". The"chrono"flag is more specific and accurate. The"dates"flag is still supported as before for backward compatibility.This change also made some datatype methods related to date/times available in the
"default"feature set. They were previously hidden unnecessarily behind the "dates/"chrono" flag.
- Added a conversion function to
ExcelDateTimeto convert the inner serial Excel datetime to standard year, month, date, hour, minute, second and millisecond components. Works for 1900 and 1904 epochs.
-
Fixed issue where Excel xlsx shared formula failed if it contained Unicode characters. Issue #553.
-
Fixed issue where Excel XML escapes in strings weren't unescaped. For example
"_x000D_" -> "\r". Issue #469.
- fix: xlsx cell name handling for non-ASCII characters by @hayandev in https://github.com/tafia/calamine/pull/552
- xls: add simple Debug trait for Record struct by @jmcnamara in https://github.com/tafia/calamine/pull/554
- clippy: fix clippy warnings by @jmcnamara in https://github.com/tafia/calamine/pull/555
- clippy: ensure clippy is installed in github action by @jmcnamara in https://github.com/tafia/calamine/pull/564
- xml: make parsing changes for quick-xml v0.38 by @jmcnamara in https://github.com/tafia/calamine/pull/561
- datetime: add native conversion from excel datetime by @jmcnamara in https://github.com/tafia/calamine/pull/546
- @hayandev made their first contribution in https://github.com/tafia/calamine/pull/552
Full Changelog: https://github.com/tafia/calamine/compare/v0.30.1...v0.31.0
v0.30.1 - 2025-09-06
- Added
DebugandClonetoTablefor easier debugging. PR #547.
- Fixed issue Issue #548 for xls files where the
SSTrecord had an incorrect number of unique strings.
- feat:
#[derive(Debug, Clone)]onTableby @lukapeschke in https://github.com/tafia/calamine/pull/547 - xls: fix issue with incorrect SST record by @jmcnamara in https://github.com/tafia/calamine/pull/549
Full Changelog: https://github.com/tafia/calamine/compare/v0.30.0...v0.30.1
v0.30.0 - 2025-08-07
-
Unpinned the
zip.rsdependency from v4.2.0 to allow cargo to choose the correct version for the user's rustc version.The Rust MSRV was bumped to v1.75.0 (which it should have been for for
zip.rscompatibility in previous releases).See the discussion at Issue #527.
- small language changes to README.md by @mhogervo in https://github.com/tafia/calamine/pull/537
- Fix typos and add typos GH Actions workflow to prevent future typos by @jqnatividad in https://github.com/tafia/calamine/pull/539
- unpin zip and using MSRV-aware in CI by @Dirreke in https://github.com/tafia/calamine/pull/542
- @mhogervo made their first contribution in https://github.com/tafia/calamine/pull/537
Full Changelog: https://github.com/tafia/calamine/compare/v0.29.0...v0.30.0