xleak


Expose Excel files in your terminal - no Microsoft Excel required!
Inspired by doxx, xleak brings Excel spreadsheets to your command line with beautiful rendering, powerful export capabilities, and a feature-rich interactive TUI.
Features
Core Functionality
- Beautiful terminal rendering with formatted tables
- Interactive TUI mode - full keyboard navigation with ratatui
- Smart data type handling - numbers right-aligned, text left-aligned, booleans centered
- Multi-sheet support - seamlessly navigate between sheets (Tab/Shift+Tab)
- Excel Table support - list and extract named tables (.xlsx only)
- Multiple export formats - CSV, JSON, plain text with customizable delimiters
- Color control -
--color/--no-color flags for piped or forced output
- No-header mode -
--no-header to treat first row as data
- Row/column IDs - sticky column-letter row and row-number column in interactive mode (
--no-column-id/--no-row-id to hide)
- Blazing fast - powered by
calamine, the fastest Excel parser in Rust
- Multiple file formats - supports
.xlsx, .xls, .xlsm, .xlsb, .ods, .csv, .tsv
- CSV/TSV support - read and interactively view
.csv/.tsv files (enabled by default; auto-detects delimiter, override with --csv-delimiter)
Interactive TUI Features
- Full-text search - search across all cells with
/, navigate with n/N
- Clipboard support - copy cells (
c) or entire rows (C) to clipboard (OSC 52 + system clipboard, works over SSH)
- Formula display - view Excel formulas in cell detail view (Enter key)
- Jump to row/column - press
Ctrl+G to jump to any cell (e.g., A100, 500, 10,5)
- Large file optimization - lazy loading for files with 1000+ rows
- Progress indicators - real-time feedback for long operations
- Visual cell highlighting - current row, column, and cell clearly marked
Installation
Package Managers
macOS / Linux (Homebrew):
brew install bgreenwell/tap/xleak
Windows (Scoop):
scoop bucket add bgreenwell https://github.com/bgreenwell/scoop-bucket
scoop install xleak
Windows (WinGet): (Coming soon - pending initial PR merge)
winget install bgreenwell.xleak
Debian/Ubuntu
xleak is officially packaged for Debian as
rust-xleak and is
available in Forky or later:
sudo apt install xleak
Arch Linux (AUR):
# Using yay
yay -S xleak-bin
# Or using paru
paru -S xleak-bin
NetBSD:
pkgin install xleak
Cargo (all platforms):
cargo install xleak
Nix:
# Run directly
nix run github:bgreenwell/xleak -- file.xlsx
# Install with flakes
nix profile install github:bgreenwell/xleak
Quick Install Scripts
macOS / Linux:
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/bgreenwell/xleak/releases/latest/download/xleak-installer.sh | sh
Windows (PowerShell):
irm https://github.com/bgreenwell/xleak/releases/latest/download/xleak-installer.ps1 | iex
Pre-built Binaries
Download platform-specific binaries from the latest release:
- macOS: Universal binary (Apple Silicon + Intel)
- Linux: x86_64 (glibc and musl)
- Windows: x86_64 MSI installer or standalone
.exe
Build from Source
git clone https://github.com/bgreenwell/xleak.git
cd xleak
cargo install --path .
Requirements: Rust 1.70 or later
Usage
Interactive TUI Mode (Recommended)
# Launch interactive viewer
xleak quarterly-report.xlsx -i
# Start on a specific sheet
xleak report.xlsx --sheet "Q3 Results" -i
# View formulas by default
xleak data.xlsx -i --formulas
# Enable horizontal scrolling for wide files (auto-size columns)
xleak wide-data.xlsx -i -H
TUI Keyboard Shortcuts:
↑ ↓ ← → - Navigate cells
Enter - View cell details (including formulas)
/ - Search across all cells
n / N - Jump to next/previous search result
Ctrl+G - Jump to specific row/cell (e.g., 100, A50, 10,5)
c - Copy current cell to clipboard (OSC 52 + system clipboard, works over SSH)
C - Copy entire row to clipboard (tab-separated)
Tab / Shift+Tab - Switch between sheets
? - Show help
q - Quit
Non-Interactive Mode
View a spreadsheet
xleak quarterly-report.xlsx
View CSV/TSV files
# CSV and TSV files work just like spreadsheets
xleak data.csv
xleak data.tsv -i
# Override the field delimiter (e.g. semicolon-separated)
xleak data.csv --csv-delimiter ";"
View a specific sheet
# By name
xleak report.xlsx --sheet "Q3 Results"
# By index (1-based)
xleak report.xlsx --sheet 2
Limit displayed rows
# Show only first 20 rows
xleak large-file.xlsx -n 20
# Show all rows
xleak file.xlsx -n 0
Export data
# Export to CSV
xleak data.xlsx --export csv > output.csv
# Export to JSON
xleak data.xlsx --export json > output.json
# Export as plain text (tab-separated)
xleak data.xlsx --export text > output.txt
# Custom delimiter for CSV/text export
xleak data.xlsx --export csv --delimiter ";" > output.csv
xleak data.xlsx --export text --delimiter "|" > output.txt
Control output formatting
# Disable colored output (useful for piping)
xleak data.xlsx --no-color
# Force colored output even when piped
xleak data.xlsx --color | less -R
# Treat first row as data (no headers)
xleak data.xlsx --no-header
# Generate column headers (A, B, C...) instead of using first row
xleak data.xlsx --no-header -n 5
# Hide the column-letter row or row-number column in interactive mode
xleak data.xlsx -i --no-column-id
xleak data.xlsx -i --no-row-id
Work with Excel Tables (.xlsx only)
# List all tables in a workbook
xleak workbook.xlsx --list-tables
# Extract a specific table as JSON (default)
xleak workbook.xlsx --table "Sales"
# Extract table as CSV
xleak workbook.xlsx --table "Sales" --export csv > sales.csv
# Extract table as plain text
xleak workbook.xlsx --table "Employees" --export text
Combine options
# Export specific sheet as CSV
xleak workbook.xlsx --sheet "Sales" --export csv > sales.csv
Examples
# Launch interactive viewer
xleak quarterly-report.xlsx -i
# Quick preview in non-interactive mode
xleak quarterly-report.xlsx
# See specific sheet with limited rows
xleak financial-data.xlsx --sheet "Summary" -n 10
# Interactive mode with formulas visible
xleak data.xlsx -i --formulas
# Export all data from a sheet
xleak survey-results.xlsx --sheet "Responses" --export csv -n 0
Configuration
xleak supports configuration via a TOML file for persistent settings like default theme and keybindings.
Config File Location
Default: ~/.config/xleak/config.toml (or $XDG_CONFIG_HOME/xleak/config.toml)
Platform-specific fallback locations:
- macOS:
~/Library/Application Support/xleak/config.toml
- Linux:
~/.config/xleak/config.toml (same as XDG)
- Windows:
%APPDATA%\xleak\config.toml
Custom: Use --config flag to specify a different location:
xleak --config /path/to/config.toml file.xlsx -i
Quick Start
-
Copy the example:
mkdir -p ~/.config/xleak
cp config.toml.example ~/.config/xleak/config.toml
-
Or create a minimal config:
mkdir -p ~/.config/xleak
cat > ~/.config/xleak/config.toml << 'EOF'
[theme]
default = "Dracula"
[ui]
max_rows = 50
column_width = 30
[keybindings]
profile = "vim"
EOF
-
Test your config:
xleak file.xlsx -i
Configuration Options
Theme Settings
[theme]
# Default theme to use on startup
default = "Dracula"
Available themes:
"Default" - Clean light theme with subtle colors
"Dracula" - Popular dark theme with purple accents
"Solarized Dark" - Precision colors for machines and people
"Solarized Light" - Light variant of Solarized
"GitHub Dark" - GitHub's dark color scheme
"Nord" - Arctic, north-bluish color palette
Press t in interactive mode to cycle through themes at runtime.
UI Settings
[ui]
# Default maximum rows to display in non-interactive mode (0 = all)
max_rows = 50
# Default maximum column width in characters
column_width = 30
Notes:
max_rows only affects non-interactive display mode (xleak file.xlsx)
- Interactive TUI mode (
-i) always shows all rows with lazy loading for large files
column_width applies to both modes and can be overridden with -w flag
Keybindings
xleak supports two built-in profiles plus custom keybindings:
[keybindings]
# Profile: "default" or "vim"
profile = "default"
# Optional: override individual keys
[keybindings.custom]
quit = "x"
search = "?"
copy_cell = "y"
Keybinding Profiles
Default Profile
Standard keybindings for terminal applications:
| Action | Key | Description |
|---|
| Navigation | | |
| Move up/down/left/right | ↑ ↓ ← → | Navigate cells |
| Page up/down | PgUp PgDn | Scroll by page |
| Jump to top/bottom | Ctrl+Home Ctrl+End | Jump to first/last row |
| Jump to row start/end | Home End | Jump to first/last column |
| Actions | | |
| View cell details | Enter | Show formula and full value |
| Jump to cell | Ctrl+G | Jump to specific row/cell |
| Search | / | Full-text search |
| Next/prev match | n N | Navigate search results |
| Copy cell | c | Copy cell to clipboard |
| Copy row | C (Shift+c) | Copy entire row |
| Sheets | | |
| Next/prev sheet | Tab Shift+Tab | Switch between sheets |
| General | | |
| Toggle theme | t | Cycle through themes |
| Show help | ? | Display help screen |
| Quit | q | Exit application |
VIM Profile
VIM-style keybindings for efficient keyboard navigation:
| Action | Key | Default Key | Description |
|---|
| VIM Navigation | | | |
| Move left/down/up/right | h j k l | ← ↓ ↑ → | VIM-style movement |
| Page up/down | Ctrl+u Ctrl+d | PgUp PgDn | Half-page scrolling |
| Jump to top | gg | Ctrl+Home | Jump to first row |
| Jump to bottom | G (Shift+g) | Ctrl+End | Jump to last row |
| Jump to row start/end | 0 $ | Home End | First/last column |
| VIM Actions | | | |
| Yank cell | y | c | Copy cell (yank) |
| Yank row | Y (Shift+y) | C | Copy row (yank) |
| Standard | | | |
| Quit | q | q | Same as default |
| Search | / | / | Same as default |
| Next/prev match | n N | n N | Same as default |
| All other keys | | | |