All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.3.1 - 2026-04-24
- TUI
:helpcommand — opens a scrollable, structured key-reference overlay with all navigation, editing, and command-mode shortcuts.
- TUI visual refresh: cleaner title bar with branding and inline row/column stats, single-line status bar, and a consistent dark theme across panels.
checkscans are more efficient and report findings with A1-style cell ranges.
1.3.0 - 2026-04-22
check <file>workbook and sheet quality scans with a stable JSON summary, stats, and findings contract.- Fixed v1.3.0 rule registry covering
blank_headers,duplicate_headers,blank_rows,blank_columns,null_ratio,duplicate_values,type_drift, andformula_presence. - TUI findings panel support for browsing quality-check results without leaving the terminal.
- Regression coverage for rule positives and negatives, workbook and sheet targeting, threshold filtering, finding order, and exit-code behavior.
1.2.0 - 2026-04-21
read rowscolumn selection with--select <col1,col2>.read rowsandread recordsfiltering with repeated--filter field:op:valueconditions combined with AND semantics.- Filter operators for equality, inequality, numeric comparisons, string contains, regular expressions, null checks, and non-null checks.
- Pagination controls with
--limitand--offset. --non-emptyto drop all-empty rows from read results.read records <file>for header-keyed records by default.--output-shape rows|records|jsonlon row and record reads.- JSON Lines output for stream-friendly record processing.
- Read-only TUI query preview with
:previewand:pv. - Regression coverage for filtering, output shapes, invalid query errors, no-match results, help text, and query preview behavior.
- Enriched read metadata now reports applied filters, selected columns, returned row count, truncation, and output shape.
1.1.0 - 2026-04-21
inspect columns <file> --sheet <name>to profile column headers, generated safe names, duplicate headers, inferred types, non-null ratios, formula ratios, and sample values.inspect tables <file> --sheet <name>to detect table-like regions with ranges, header rows, dimensions, and confidence scores.- Regression coverage for structure inspection cases including duplicate headers, blank headers, preamble sections, late headers, multi-table sheets, mixed-type columns, formula columns, and non-ASCII column names.
1.0.0 - 2026-04-20
- New explicit subcommand architecture:
inspect,read,check,uiinspect workbook <file>— list all sheets with metadatainspect sheet <file> --sheet <name>/--sheet-index <n>— sheet metadatainspect sample <file> --sheet <name> [--range] [--rows]— sampled dataread cell <file> --sheet <name> --cell <A1>— single cell valueread range <file> --sheet <name> --range <A1:F20>— rectangular rangeread rows <file> --sheet <name> [--range] [--header-row auto|N]— row-oriented dataui <file>— explicit interactive TUI entry (replaces bare file path)check <file> --rule <rule>— namespace reserved for v1.3.0 quality checks
- Unified success/error JSON envelope with stable schema
- Success:
schema_version,command,file,target,meta,data,warnings - Error:
schema_version,command,file,errorwithcode,message,details
- Success:
- Stable exit code taxonomy: 0 (success), 1 (check findings), 2 (invalid args), 3 (file error), 4 (parse error), 5 (target not found), 6 (invalid query), 7 (internal error)
--sheetand--sheet-indexare now independent and explicit (no ambiguity with numeric sheet names)--format json|textwithjsonas the default for all headless commands- Header row auto-detection with
header_candidatesandrecommended_header_rowininspect sheet - New internal
src/cli/module for command parsing, dispatch, envelope, and error handling
- CLI entry is now subcommand-based; bare file path is rejected with exit code 2
jsonis the default headless output format (wastext)stdoutonly contains results;stderronly contains errors- All headless outputs use the unified envelope structure
- Old positional-file-plus-flags public CLI surface (
--sheets,--peek,--cell,--json-export,--direction,--header-count) - No backward-compatibility layer for old flags
0.5.2 - 2026-04-20
- Remove redundant
.max(0)calls aftersaturating_subto satisfy clippy'sunnecessary_min_or_maxlint without changing behavior.
0.5.1 - 2026-04-17
- Prevent process panic when opening malformed XLSX files with invalid shared-string references. Parser panics from
calamineare now caught and converted into controlledanyhowerrors with a non-zero exit code.
0.5.0 - 2026-04-17
- Added AI-friendly headless inspect/query commands:
--sheetsto list all sheets--sheet <sheet>to show sheet metadata--peek <sheet>!<range>to preview a cell range--cell <sheet>!<cell>to read a single cell value--sheet <sheet> --json-exportto export a single sheet to JSON
- Added
--format <text|json>flag for inspect commands - Added A1 notation parsing helpers for range and cell references
- Added
Workbook::resolve_sheetandWorkbook::get_used_rangeutilities
--json-exportnow also supports--sheetto export a single sheet instead of the whole workbook- Inspect commands output only data to stdout and errors to stderr with stable exit codes
- Out-of-bounds peek ranges are clamped to actual sheet bounds
- Empty cells output empty string in text mode and
nullin JSON mode
0.4.2 - 2026-03-10
- Prevent command parsing from panicking on non-ASCII sheet names such as
:addsheet test1
0.4.1 - 2026-03-10
- Publish crates.io release with the correct crate version after the
v0.4.0GitHub release
0.4.0 - 2026-03-10
- Added
:addsheet <name>to create a new sheet after the current sheet - Added undo and redo support for sheet creation
- Load all lazy-loaded sheets before saving to avoid writing unloaded sheets as blank
- Count sheet name length by characters so non-ASCII names such as Chinese sheet names are validated correctly
0.3.0 - 2025-05-07
- Support dimming other areas while editing
- Remember the selected cell when switching between sheets
- Added optional lazy loading for xlsx and xlsb files to improve performance with large files (enabled with -l flag)
- Fixed the issue where row numbers are not fully displayed when exceeding 100,000
- Edit cell content using vim shortcuts
- Multiple UI improvements
- Replace ratatui_textarea with tui_textarea
- Upgraded calamine to version 0.27.0
0.2.0 - 2025-04-27
- Added restriction to require
-jor--json-exportflag when using pipe redirection - Added undo and redo functionality, supporting operation history for cell editing, row/column deletion, and sheet deletion
- Added support for Command + arrow key navigation on Mac, similar to Ctrl + arrow key functionality
- Fixed the issue where cells outside the maximum range of sheet data cannot be edited
- No longer reports an error when deleting rows or columns outside the sheet's data range
- Changed the cell content panel and notification panel to vertical layout
- Export JSON files to the same directory as the original Excel file
- Some minor UI adjustments
- Downgraded Rust edition version to 2021
0.1.1 - 2025-04-24
- improve installation instructions in README
0.1.0 - 2025-04-24
This is the initial release of excel-cli, a lightweight terminal-based Excel viewer with Vim-like navigation.
- Browse and switch between worksheets in multi-sheet workbooks
- Delete worksheets from multi-sheet workbooks
- Delete column and row functionality
- Edit cell contents with a text editor
- Save changes to Excel files
- Export data to JSON format with customizable header options
- Vim-like commands for navigation and operations:
h,j,k,lfor cell navigation0,^,$for row navigationgg,Gfor column navigationCtrl+←→↑↓for jumping to non-empty cells/,?for searching withn,Nfor navigation between matches:for command mode with various commands
- Copy, cut, and paste functionality with
y,d, andpkeys - Support for pipe operator when exporting to JSON