Changelog
V0.7.0 (FEBRUARY 2026)
Alignment & batch formatting, multi-range batching, search optimization, and token reduction.
- Added alignment support (
--horizontal,--vertical,--wrap-text) and batch formatting (--batch/--batch-file) for applying multiple styles in a single call - Optimised multi-range reads — batches via a single file open with in-memory slicing instead of N separate readers, with automatic header resolution
- Improved search performance on large files (>10 MB) — full-load-then-slice heuristic avoids slow sequential
skip_rowsin fastexcel/calamine - Added
--no-metaglobal flag to suppress_data_originandfile_size_humanfields from output - Added
--briefprobe mode for condensed column profiles and--precisionflag for float rounding - Detects uncached formula cells and surfaces
has_uncached_formulashint so agents don't misinterpret empty cached values as missing data - Truncates long strings in probe samples/summaries and classifies free-text columns compactly to prevent token explosions on wide sheets
- Relativized
output_filepaths in write/format responses - Updated skill and README documentation for new flags
V0.6.0 (FEBRUARY 2026)
Format shorthands, structured error handling, and reliability fixes.
- Added format shorthand flags (
--bold,--italic,--font-size,--font-color,--fill-color) and multi-range format support in a single call - Added
write --valuefor shell-safe negative numbers and--from-jsonfor file-based 2D array input - Added
probe --head-colsto limit column profiling on wide files - Added structured CLI error handling — emits JSON with actionable
suggestionfields instead of raw tracebacks - Fixed
EmptyCellcrash in--formulasmode, multi-range--outputoverwrites informat, and OOB column range crashes inread - Fixed openpyxl 3.1+ compatibility — replaced private
_cf_rulesand_hyperlinksaccessors with stable public APIs - Integrated
tytype checker into CI and pre-commit hooks - Added ~3,700 lines of new tests across 13 test modules
V0.5.1 (FEBRUARY 2026)
Bug fixes from real-world agent pipeline testing.
- Fixed
--formulawith--jsonand--from-csv— no longer prepends=to all strings in batch mode. Plain text stays plain; only strings starting with=are written as formulas. Single-cell--formulabehavior unchanged - Fixed
--columnsby header name when combined with--range— row-1 headers are now resolved even in range-scoped searches (both Polars and openpyxl paths) - Fixed
--headerson multi-range reads — column letters are now resolved to row-1 header names with per-sheet caching, matching single-range behavior - Fixed
resolve_column_letters()to prioritise header name lookup over column letter matching — prevents purely alphabetic header names (e.g."Formula") from being misinterpreted as column letters - Updated
--formuladescription in command reference to reflect batch vs single-cell semantics - Added 6 regression tests for mixed formula/text writes, header name + range search, and multi-range header resolution
V0.5.0 (FEBRUARY 2026)
Search precision, write auto-create, and developer experience.
- Added
--columns/-cflag tosearch— filter results to specific columns by letter (A,B,C) or header name ("Indicator Name") - Added
--limit/-lflag tosearch— cap result count (default 25, max 1000) - Added
--rangeflag tosearch— restrict search to a cell range (e.g.A1:D100orSheet!A1:D100). Composes with--columnsand--limit - Added
--headersflag toread— resolves column letters to row-1 header names in range reads, withcolumn_mapin output - Added write auto-create — writing to a non-existent
.xlsxor.xlsmfile now creates it automatically. Emits"created": truein output - Extended
--formulaflag inwriteto work with--jsonand--from-csv(previously single-cell only). Adds=prefix to strings missing it - Added write size guard —
--outputon files larger than 20 MB fails fast withFILE_TOO_LARGE; in-place writes on large files emit a warning - Added
file_size_humanfield toprobe,read, andsearchoutput — human-readable file size for agent timeout calibration - Added
INVALID_COLUMNandFILE_TOO_LARGEstructured error codes - Added pre-commit hooks —
ruff check --fixandruff formaton commit, full pytest suite on push - Added
ruff format --checkto CI publish workflow - Added 37 tests across
test_write.py,test_search.py, andtest_read.py
V0.4.0 (FEBRUARY 2026)
Security hardening, untrusted-data tagging, and engine unification.
- Added
_data_origin: untrusted_spreadsheetfield to all structured JSON responses — provides per-call provenance context for agent consumers acrossread,search,probe,overview,inspect,format --read,export --format json, andvba - Added
--json-envelopeflag toexport— wraps CSV and Markdown stdout in a JSON envelope with_data_originfor agent pipelines that need provenance on all output formats - Added automatic VBA security pre-check before every macro execution — macros with
risk_level=highare blocked and raiseMacroBlockedError; use--allow-riskyto override when the file source is explicitly trusted - Added extension gate to
vba --run— macro execution now requires.xlsmor.xlsb; plain.xlsxfiles are rejected with a structured error - Added macro name validation to
vba --run— rejects names containing path separators or shell meta-characters - Added XXE protection —
defusedxml.defuse_stdlib()is activated at import time, hardening all stdlib XML parsers used by openpyxl and oletools against entity expansion and DTD retrieval attacks - Fixed chart export filename sanitisation — strips path separators and
..sequences to prevent path traversal via crafted chart names - Fixed
copy_formatting()missing the writable-extension guard (now consistent withwrite_cells()andapply_formatting()) - Fixed
ASPOSE_LICENSE_DATAwarning — now emitted on env-var presence, even whenASPOSE_LICENSE_PATHtakes precedence, since the env var remains visible in process listings - Unified engine auto-detection order across
objects,recalc, andscreenshot— priority is now consistently Aspose → Excel → LibreOffice via a sharedresolve_engineutility - Added 26 security regression tests covering data-origin tagging, VBA gates, and credential warning behaviour
- Added lint-and-test CI gate before PyPI publish; pinned all GitHub Actions to immutable commit SHAs
V0.3.0 (FEBRUARY 2026)
Date handling overhaul, docs site, and reliability fixes.
- Added documentation site with full command reference, backend guide, and changelog
- Overhauled date handling — index-based detection now works correctly in
--no-headermode acrossread,search,export, andprobe. Midnight datetimes normalised to date-only strings - Added
INVALID_REGEXstructured error for malformed regex patterns insearch --regex(including Rust regex engine incompatibilities) - Further optimised print area handling in LibreOffice
_prepare_sheet_for_exportfor better PDF export - Added save-path guard in
formatandsheetcommands — non-writable extensions now fall back to.xlsxinstead of silently saving OOXML content with the original extension - Updated skill and command reference docs for output format clarity (
--format csv|markdown),--in-formulasoutput schema, and engine availability per command
V0.2.0 (FEBRUARY 2026)
Non-tabular data support, multi-range reads, and compact output.
- Added
--no-headerflag toprobe,read,search, andexportfor non-tabular sheets (P&L reports, dashboards). Treats row 1 as data and uses column letters (A, B, C) as headers - Added
--compact/--no-compactmode toreadandexport(default: on). Drops fully-null columns to reduce token waste - Added
--all-sheetsflag toreadfor reading the same range(s) from every sheet - Added multi-range read support — comma-separated ranges like
"Sheet1!A1:C10,E1:G10" - Added
--range/-roption flag toscreenshot(alternative to positional RANGE arg) - Added
--vbaand--format/-fflags toinspect - Changed auto-detection priority — Aspose is now checked first for
screenshotandrecalc(was Excel first) - Added shell-escaped cell reference normalisation for zsh compatibility (
\!in ranges) - Fixed xlwings screenshot transparency — PNGs are now opaque (flattened onto white background)
- Enhanced LibreOffice multi-page PDF rendering and print area optimisation
- Improved formula detection in compact mode
- Added
aspose-cells-pythonas a direct dependency
V0.1.1 (FEBRUARY 2026)
CLI polish release.
- Added
-h/--helpflag support across all commands - Added
--version/-Vflag to display the installed version - Removed shell completion clutter from help output
- Fixed
-oflag conflict onread --offset - Fixed double period in help text descriptions
V0.1.0 (FEBRUARY 2026)
Initial release.
- 14 commands:
probe,overview,inspect,read,search,write,sheet,format,export,screenshot,objects,recalc,vba,license - 5 adapters: Polars + fastexcel for data reads, openpyxl for metadata and writes, xlwings for Excel rendering, Aspose.Cells for cross-platform rendering, LibreOffice for free rendering
- Polars + fastexcel for fast data reads (7-10x faster than openpyxl)
- openpyxl for metadata inspection and write operations
- xlwings / Aspose / LibreOffice for screenshots, objects, and recalculation
- oletools for VBA macro inspection and extraction
- Structured JSON output to stdout, optimised for AI context windows
- Auto date detection — converts Excel serial numbers to ISO 8601 strings
- 5 formats —
.xlsx,.xlsm,.xlsb,.xls,.ods - Agent Skill support — works with Claude Code, Cursor, and other AI agents via skill files