Excel-CLI
A lightweight terminal-based Excel viewer with Vim-like navigation for viewing, editing, and exporting Excel data to JSON format.
English | 中文
Features
- Browse and navigate Excel worksheets with Vim-like hotkeys
- Switch between sheets in multi-sheet workbooks
- Edit cell contents directly in the terminal
- Export data to JSON format
- Delete rows, columns, and sheets
- Search functionality with highlighting
- Command mode for advanced operations
Installation & Uninstallation
Installation
Option 1: Install from Cargo (Recommended)
The package is published to crates.io and can be installed directly using:
Option 2: Download from GitHub Release
- Visit the GitHub Releases
- Download the pre-compiled binary for your operating system
- Place the executable in your system path, or run it directly from the download location
Linux and macOS users may need to add execute permissions first
Option 3: Compile from Source
Requires Rust and Cargo. Install using the following commands:
# Clone the repository
# Install to system
Uninstallation
Usage
# Open an Excel file in interactive mode
# Export all sheets to JSON and output to stdout (for piping)
# Export with custom header direction and count
# Pipe JSON output to another command
Command-line Options
--json-export,-j: Export all sheets to JSON and output to stdout (for piping)--direction,-d: Header direction in Excel: 'h' for horizontal (top rows), 'v' for vertical (left columns). Default: 'h'--header-count,-r: Number of header rows (for horizontal) or columns (for vertical) in Excel. Default: 1--lazy-loading,-l: Enable lazy loading for large Excel files (only loads data when needed)
User Interface
The application has a simple and intuitive interface:
- Title Bar with Sheet Tabs: Displays the current file name and all available sheets with the current sheet highlighted
- Spreadsheet: The main area displaying the Excel data
- Content Panel: Displays the full content of the currently selected cell
- Notification Panel: Displays operation feedback and system notifications
- Status Bar: Displays operation hints and current input commands
Keyboard Shortcuts
h,j,k,lor arrow keys: Move between cells (1 cell)[: Switch to previous sheet (stops at first sheet)]: Switch to next sheet (stops at last sheet)0: Jump to first column in current row^: Jump to first non-empty column in current row$: Jump to last column in current rowgg: Jump to first row in current columnG: Jump to last row in current columnCtrl+←(orCommand+←on Mac): If current cell is empty, jump to the first non-empty cell to the left; if current cell is not empty, jump to the last non-empty cell to the leftCtrl+→(orCommand+→on Mac): If current cell is empty, jump to the first non-empty cell to the right; if current cell is not empty, jump to the last non-empty cell to the rightCtrl+↑(orCommand+↑on Mac): If current cell is empty, jump to the first non-empty cell above; if current cell is not empty, jump to the last non-empty cell aboveCtrl+↓(orCommand+↓on Mac): If current cell is empty, jump to the first non-empty cell below; if current cell is not empty, jump to the last non-empty cell belowEnter: Edit current celly: Copy current cell contentd: Cut current cell contentp: Paste clipboard content to current cellu: Undo the last operation (edit, row/column/sheet deletion)Ctrl+r: Redo the last undone operation/: Start forward search?: Start backward searchn: Jump to next search resultN: Jump to previous search result:: Enter command mode (for Vim-like commands)
Vim Edit Mode
When editing cell content (press Enter to enter edit mode):
-
Mode Switching:
Esc: Exit Vim mode and save changesi: Enter Insert modev: Enter Visual mode
-
Navigation (in Normal mode):
h,j,k,l: Move cursor left, down, up, rightw: Move to next wordb: Move to beginning of worde: Move to end of word$: Move to end of line^: Move to first non-blank character of linegg: Move to first lineG: Move to last line
-
Editing Operations:
x: Delete character under cursorD: Delete to end of lineC: Change to end of lineo: Open new line below and enter Insert modeO: Open new line above and enter Insert modeA: Append at end of lineI: Insert at beginning of line
-
Visual Mode Operations:
y: Yank (copy) selected textd: Delete selected textc: Change selected text (delete and enter Insert mode)
-
Operator Commands:
y{motion}: Yank text specified by motiond{motion}: Delete text specified by motionc{motion}: Change text specified by motion
-
Clipboard Operations:
p: Paste yanked or deleted textu: Undo last changeCtrl+r: Redo last undone change
Search Mode
Enter search mode by pressing / (forward search) or ? (backward search):
- Type your search query
Enter: Execute search and jump to the first matchEsc: Cancel searchn: Jump to next match (after search is executed)N: Jump to previous match (after search is executed)- Search results are highlighted in yellow
- Search uses row-first, column-second order (searches through each row from left to right, then moves to the next row)
Command Mode
Enter command mode by pressing :. Available commands:
Column Width Commands
:cw fit- Auto-adjust current column width to fit content:cw fit all- Auto-adjust all column widths to fit content:cw min- Minimize current column width (max 15 or content width):cw min all- Minimize all column widths (max 15 or content width):cw [number]- Set current column width to specified value
JSON Export Commands
-
:ej [h|v] [rows]- Export current sheet data to JSON formath|v- Header direction:hfor horizontal (top rows),vfor vertical (left columns)rows- Number of header rows (for horizontal) or columns (for vertical)
-
:eja [h|v] [rows]- Export all sheets to a single JSON file- Uses the same parameters as
:ej - Creates a JSON object with sheet names as keys and sheet data as values
- Uses the same parameters as
The output filename is automatically generated in one of these formats:
- For single sheet:
original_filename_sheet_SheetName_YYYYMMDD_HHMMSS.json - For all sheets:
original_filename_all_sheets_YYYYMMDD_HHMMSS.json
The JSON files are saved in the same directory as the original Excel file.
Vim-like Commands
-
:w- Save file without exiting -
:wqor:x- Save and exit -
:q- Quit (will warn if there are unsaved changes) -
:q!- Force quit without saving See File Saving Logic for details on how files are saved. -
:y- Copy current cell content -
:d- Cut current cell content -
:putor:pu- Paste clipboard content to current cell -
:[cell]- Jump to cell (e.g.,:A1,:B10). Supports both uppercase and lowercase letters (:a1works the same as:A1)
Sheet Management Commands
:sheet [name/number]- Switch to sheet by name or index (1-based):delsheet- Delete the current sheet
Row and Column Management Commands
:dr- Delete the current row:dr [row]- Delete a specific row (e.g.,:dr 5deletes row 5):dr [start] [end]- Delete a range of rows (e.g.,:dr 5 10deletes rows 5 through 10):dc- Delete the current column:dc [col]- Delete a specific column (e.g.,:dc Aor:dc aor:dc 1all delete column A):dc [start] [end]- Delete a range of columns (e.g.,:dc A Cor:dc a cdeletes columns A through C)
Other Commands
:nohlsearchor:noh- Disable search highlighting:help- Show available commands
File Saving Logic
Excel-CLI uses a non-destructive approach to file saving:
- When you save a file (using
:w,:wq, or:x), the application checks if any changes have been made - If no changes have been made, no new file is created, and a "No changes to save" message is displayed
- If changes have been made, a new file is created with a timestamp in the filename, following the format
original_filename_YYYYMMDD_HHMMSS.xlsx - The new file is created without any styling
- The original file is never modified
Technical Stack
- Written in Rust
- Uses ratatui library for terminal UI
- crossterm for terminal input handling
- calamine library for reading Excel files
- rust_xlsxwriter for writing Excel files
- serde_json for JSON serialization
License
MIT