Skip to content
CAI
Software that uses CAICheck a score

jsonkenl/xlsxir

59.6

Adequate · 18 September 2026

1.7k

lines of production code

Elixir

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

Xlsxir is an Elixir library designed for parsing Excel (.xlsx) files with a focus on memory efficiency and performance. It utilizes SAX-based streaming to process large workbooks without loading them entirely into memory, offering APIs for row streaming and peeking. The system manages its internal state via OTP supervisors and ETS tables, supporting complex features like shared strings, styles, and multiple worksheets.

Behavioural changes

Migrate configuration system to Elixir 1.10+ syntax

The application's configuration file has been updated to use the modern \import Config\ syntax, replacing the deprecated \use Mix.Config\. This change aligns the project with current Elixir standards and removes legacy configuration patterns, ensuring that configuration loading behaves according to the latest runtime expectations.

config · high confidence

Replaced DOM-based XML parsing with SAX streaming for improved performance and memory efficiency

The library has switched from loading entire XML files into memory (using SweetXml) to a SAX-based event-driven parser (using Erlsom). This change allows Xlsxir to process large Excel files with significantly lower memory usage and better performance, as XML content is parsed in chunks. The new architecture introduces dedicated modules for parsing shared strings, styles, workbooks, and worksheets, storing intermediate results in ETS tables. Users benefit from robust handling of missing styles or shared strings files, support for parsing inline strings, and the ability to stream worksheet rows without loading the entire file into memory.

lib/xlsxir · high confidence

Xlsxir becomes an OTP application with new streaming and peeking APIs

The Xlsxir library is now an OTP application that automatically starts a StateManager supervisor, ensuring proper lifecycle management for ETS tables. The main API has been refactored to delegate parsing to the XlsxFile module, introducing a new \stream\_list/3\ function for memory-efficient row streaming (extracting XML to files by default) and a \peek/4\ function to extract only the first N rows. Existing extraction functions like \extract/3\ and \multi\_extract/3\ remain available but now support options to control extraction targets (memory vs. file) and row limits.

lib · high confidence

Test coverage

Added comprehensive test coverage for Xlsxir parsing capabilities; Added test fixtures for Excel workbooks with multiple sheets and styles; Added test fixtures for complex strings and invalid files.

Dependencies

Upgrade to Elixir 1.9 and switch XML parsing to Erlsom

Xlsxir now requires Elixir 1.9 (up from 1.2) and replaces the sweet\_xml dependency with Erlsom (\~\> 1.5) for XML parsing. The project also adds ExDoc for documentation generation and updates its Hex package metadata, including a new description, license, and maintainer information.

(dependencies) · high confidence

Housekeeping

Updated API documentation to version 1.6.3

The generated HTML documentation has been rebuilt and updated to reflect the Xlsxir v1.6.3 release. This update includes refreshed reference pages for core modules such as \Xlsxir.ConvertDate\, \Xlsxir.ConvertDateTime\, \Xlsxir.ParseString\, \Xlsxir.ParseStyle\, \Xlsxir.ParseWorkbook\, \Xlsxir.ParseWorksheet\, \Xlsxir.SaxParser\, and \Xlsxir.StateManager\, ensuring that function signatures, parameters, and examples are current with the latest codebase.

doc · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 60.

Lenses

  • Code Health 100
  • Architecture 100
  • Maturity 50
  • Readiness 42
  • Security 100

Changes since last survey

  • 277 commits — 229 feature/other, 48 fixes

By area

  • lib/xlsxir — 94 commits
  • (root) — 91 commits
  • (repo) — 55 commits
  • lib/xlsxir.ex — 15 commits
  • test/test_data — 5 commits
  • doc/dist — 4 commits
  • doc/404.html — 3 commits
  • config/config.exs — 2 commits
  • doc/Xlsxir.Parse.html — 2 commits
  • doc/Xlsxir.html — 1 commit
  • doc/changelog.html — 1 commit
  • doc/fonts — 1 commit
  • doc/overview.html — 1 commit
  • lib/.xlsxir.ex.swp — 1 commit
  • lib/example.xlsx — 1 commit

Notable commits

  • fix: Bug fixes and doc updates to prepare for v1.5 Hex release
  • fix: Fix ConvertDate.from_serial using :calendar
  • fix: Fix FunctionClauseError when datetime type value exists in the cell
  • fix: Fix MatchError when no styles exist for cell
  • fix: Fix args error and add docs
  • fix: Fix deprecation warnings related to singled quoted strings
  • fix: Fix get_cell returns nil for non-existent cells
  • fix: Fix incorrect return in initialize_stream/2 - raise an exeption rather than return a tuple
  • fix: Fix iso date better.
  • fix: Fix sax parser test
  • fix: Fix sax parser test
  • fix: Fixed "Enum.into" warning
  • fix: Fixed :file_not_found bug for worksheets with no strings
  • fix: Fixed ConvertDate module and added documentation.
  • fix: Fixed broken Xlsxir functions
  • fix: Fixed broken Xlsxir functions
  • fix: Fixed bug in Xlsxir.multi_extract/3 docs
  • fix: Fixed bug where Xlsxir.ParseWorksheet struct needed to be reset after parsing each cell
  • fix: Fixed bug with deps.
  • fix: Fixed custom date format bug
  • …and 257 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

jsonkenl/xlsxir was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 18 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit efef58989b47337540bbad91e358976888aa4f3f — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-5d04157a340d.