A fast terminal Excel viewer with an interactive TUI. Features full-text search, formula display, lazy loading for large files, clipboard support, and export to CSV/JSON. Built with Rust and ratatui.
Rust
1,506
61 commits
updated Sep 7, 2026

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.

--color/--no-color flags for piped or forced output--no-header to treat first row as data--no-column-id/--no-row-id to hide)calamine, the fastest Excel parser in Rust.xlsx, .xls, .xlsm, .xlsb, .ods, .csv, .tsv.csv/.tsv files (enabled by default; auto-detects delimiter, override with --csv-delimiter)/, navigate with n/Nc) or entire rows (C) to clipboard (OSC 52 + system clipboard, works over SSH)Ctrl+G to jump to any cell (e.g., A100, 500, 10,5)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
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
Download platform-specific binaries from the latest release:
.exegit clone https://github.com/bgreenwell/xleak.git
cd xleak
cargo install --path .
Requirements: Rust 1.88 or later
# 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 cellsEnter - View cell details (including formulas)/ - Search across all cellsn / N - Jump to next/previous search resultCtrl+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 helpq - Quitxleak quarterly-report.xlsx
# 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 ";"
# By name
xleak report.xlsx --sheet "Q3 Results"
# By index (1-based)
xleak report.xlsx --sheet 2
# Show only first 20 rows
xleak large-file.xlsx -n 20
# Show all rows
xleak file.xlsx -n 0
# 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
# 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
# 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
# Export specific sheet as CSV
xleak workbook.xlsx --sheet "Sales" --export csv > sales.csv
# 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
xleak supports configuration via a TOML file for persistent settings like default theme and keybindings.
Default: ~/.config/xleak/config.toml (or $XDG_CONFIG_HOME/xleak/config.toml)
Platform-specific fallback locations:
~/Library/Application Support/xleak/config.toml~/.config/xleak/config.toml (same as XDG)%APPDATA%\xleak\config.tomlCustom: Use --config flag to specify a different location:
xleak --config /path/to/config.toml file.xlsx -i
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
[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 palettePress t in interactive mode to cycle through themes at runtime.
[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)-i) always shows all rows with lazy loading for large filescolumn_width applies to both modes and can be overridden with -w flagxleak 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"
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-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 | Same as default profile |
Enable VIM mode:
[keybindings]
profile = "vim"
Override individual keys while keeping the profile defaults:
[keybindings]
profile = "default"
[keybindings.custom]
# Use 'x' to quit instead of 'q'
quit = "x"
# Use '?' for search instead of '/'
search = "?"
# Use 'T' (Shift+t) to toggle theme
theme_toggle = "T"
# Use Ctrl+J to jump to cell
jump = "Ctrl+j"
All customizable actions:
| Action | Default | VIM | Description |
|---|---|---|---|
quit | q | q | Exit application |
help | ? | ? | Show help |
theme_toggle | t | t | Cycle themes |
search | / | / | Search cells |
next_match | n | n | Next search result |
prev_match | N | N | Previous result |
copy_cell | c | y | Copy cell |
copy_row | C | Y | Copy row |
jump | Ctrl+g | Ctrl+g | Jump to cell |
show_cell_detail | Enter | Enter | Show details |
next_sheet | Tab | Tab | Next sheet |
prev_sheet | Shift+Tab | Shift+Tab | Previous sheet |
up | Up | k | Move up |
down | Down | j | Move down |
left | Left | h | Move left |
right | Right | l | Move right |
page_up | PageUp | Ctrl+u | Page up |
page_down | PageDown | Ctrl+d | Page down |
jump_to_top | Ctrl+Home | g | First row |
jump_to_bottom | Ctrl+End | G | Last row |
jump_to_row_start | Home | 0 | First column |
jump_to_row_end | End | $ | Last column |
Key format:
"q", "/", "Enter""Ctrl+g", "Shift+Tab", "Alt+s""Enter", "Esc", "Tab", "Home", "End", "PageUp", "PageDown", "Up", "Down", "Left", "Right"Minimal (theme only):
[theme]
default = "Nord"
VIM user:
[theme]
default = "Dracula"
[keybindings]
profile = "vim"
Custom workflow:
[theme]
default = "GitHub Dark"
[ui]
max_rows = 100
column_width = 40
[keybindings]
profile = "default"
[keybindings.custom]
quit = "x"
search = "s"
copy_cell = "Ctrl+c"
copy_row = "Ctrl+Shift+c"
Full reference: See config.toml.example for all options with detailed comments.
xleak is optimized for both small and large files:
| Tool | Format | Speed | Terminal Native | Interactive | Search | Formulas |
|---|---|---|---|---|---|---|
| xleak | ✅ xlsx/xls/ods/csv | ⚡ Fast | ✅ Yes | ✅ Full TUI | ✅ Yes | ✅ Yes |
| Excel | ✅ xlsx | ❌ Slow startup | ❌ GUI only | ✅ Yes | ✅ Yes | ✅ Yes |
| pandas | ✅ Many | ❌ Slow | ❌ Python required | ❌ No | ❌ No | ❌ No |
| csvlook | ❌ CSV only | ✅ Fast | ✅ Yes | ❌ No | ❌ No | ❌ No |
Looking to view Word documents in the terminal? Check out doxx - a terminal viewer for .docx files with similar TUI capabilities.
csv feature)"File not found"
xleak "My Report.xlsx""No sheets found"
"Sheet 'X' not found"
xleak file.xlsx (without --sheet) to see all available sheetsMIT License — see LICENSE file for details.
Made for developers who live in the terminal 🚀
496 followers · starred Nov 2025
195 followers · starred Nov 2025
309 followers · starred Dec 2025
302 followers · starred Nov 2025
A fast terminal Excel viewer with an interactive TUI. Features full-text search, formula display, lazy loading for large files, clipboard support, and export to CSV/JSON. Built with Rust and ratatui.
Rust
1,506
61 commits
updated Sep 7, 2026

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.

--color/--no-color flags for piped or forced output--no-header to treat first row as data--no-column-id/--no-row-id to hide)calamine, the fastest Excel parser in Rust.xlsx, .xls, .xlsm, .xlsb, .ods, .csv, .tsv.csv/.tsv files (enabled by default; auto-detects delimiter, override with --csv-delimiter)/, navigate with n/Nc) or entire rows (C) to clipboard (OSC 52 + system clipboard, works over SSH)Ctrl+G to jump to any cell (e.g., A100, 500, 10,5)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
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
Download platform-specific binaries from the latest release:
.exegit clone https://github.com/bgreenwell/xleak.git
cd xleak
cargo install --path .
Requirements: Rust 1.88 or later
# 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 cellsEnter - View cell details (including formulas)/ - Search across all cellsn / N - Jump to next/previous search resultCtrl+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 helpq - Quitxleak quarterly-report.xlsx
# 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 ";"
# By name
xleak report.xlsx --sheet "Q3 Results"
# By index (1-based)
xleak report.xlsx --sheet 2
# Show only first 20 rows
xleak large-file.xlsx -n 20
# Show all rows
xleak file.xlsx -n 0
# 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
# 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
# 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
# Export specific sheet as CSV
xleak workbook.xlsx --sheet "Sales" --export csv > sales.csv
# 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
xleak supports configuration via a TOML file for persistent settings like default theme and keybindings.
Default: ~/.config/xleak/config.toml (or $XDG_CONFIG_HOME/xleak/config.toml)
Platform-specific fallback locations:
~/Library/Application Support/xleak/config.toml~/.config/xleak/config.toml (same as XDG)%APPDATA%\xleak\config.tomlCustom: Use --config flag to specify a different location:
xleak --config /path/to/config.toml file.xlsx -i
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
[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 palettePress t in interactive mode to cycle through themes at runtime.
[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)-i) always shows all rows with lazy loading for large filescolumn_width applies to both modes and can be overridden with -w flagxleak 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"
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-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 | Same as default profile |
Enable VIM mode:
[keybindings]
profile = "vim"
Override individual keys while keeping the profile defaults:
[keybindings]
profile = "default"
[keybindings.custom]
# Use 'x' to quit instead of 'q'
quit = "x"
# Use '?' for search instead of '/'
search = "?"
# Use 'T' (Shift+t) to toggle theme
theme_toggle = "T"
# Use Ctrl+J to jump to cell
jump = "Ctrl+j"
All customizable actions:
| Action | Default | VIM | Description |
|---|---|---|---|
quit | q | q | Exit application |
help | ? | ? | Show help |
theme_toggle | t | t | Cycle themes |
search | / | / | Search cells |
next_match | n | n | Next search result |
prev_match | N | N | Previous result |
copy_cell | c | y | Copy cell |
copy_row | C | Y | Copy row |
jump | Ctrl+g | Ctrl+g | Jump to cell |
show_cell_detail | Enter | Enter | Show details |
next_sheet | Tab | Tab | Next sheet |
prev_sheet | Shift+Tab | Shift+Tab | Previous sheet |
up | Up | k | Move up |
down | Down | j | Move down |
left | Left | h | Move left |
right | Right | l | Move right |
page_up | PageUp | Ctrl+u | Page up |
page_down | PageDown | Ctrl+d | Page down |
jump_to_top | Ctrl+Home | g | First row |
jump_to_bottom | Ctrl+End | G | Last row |
jump_to_row_start | Home | 0 | First column |
jump_to_row_end | End | $ | Last column |
Key format:
"q", "/", "Enter""Ctrl+g", "Shift+Tab", "Alt+s""Enter", "Esc", "Tab", "Home", "End", "PageUp", "PageDown", "Up", "Down", "Left", "Right"Minimal (theme only):
[theme]
default = "Nord"
VIM user:
[theme]
default = "Dracula"
[keybindings]
profile = "vim"
Custom workflow:
[theme]
default = "GitHub Dark"
[ui]
max_rows = 100
column_width = 40
[keybindings]
profile = "default"
[keybindings.custom]
quit = "x"
search = "s"
copy_cell = "Ctrl+c"
copy_row = "Ctrl+Shift+c"
Full reference: See config.toml.example for all options with detailed comments.
xleak is optimized for both small and large files:
| Tool | Format | Speed | Terminal Native | Interactive | Search | Formulas |
|---|---|---|---|---|---|---|
| xleak | ✅ xlsx/xls/ods/csv | ⚡ Fast | ✅ Yes | ✅ Full TUI | ✅ Yes | ✅ Yes |
| Excel | ✅ xlsx | ❌ Slow startup | ❌ GUI only | ✅ Yes | ✅ Yes | ✅ Yes |
| pandas | ✅ Many | ❌ Slow | ❌ Python required | ❌ No | ❌ No | ❌ No |
| csvlook | ❌ CSV only | ✅ Fast | ✅ Yes | ❌ No | ❌ No | ❌ No |
Looking to view Word documents in the terminal? Check out doxx - a terminal viewer for .docx files with similar TUI capabilities.
csv feature)"File not found"
xleak "My Report.xlsx""No sheets found"
"Sheet 'X' not found"
xleak file.xlsx (without --sheet) to see all available sheetsMIT License — see LICENSE file for details.
Made for developers who live in the terminal 🚀
496 followers · starred Nov 2025
195 followers · starred Nov 2025
309 followers · starred Dec 2025
302 followers · starred Nov 2025