A terminal spreadsheet powered by Python formulas
Project description
gridcalc
A terminal spreadsheet powered by Python formulas. Based on Serge Zaitsev's kalk, reimplemented in pure Python from pktcalc.
Uses Python's eval() for formula evaluation. Reads and writes JSON. File-compatible with pktcalc.
$ gridcalc budget.json
Install
From PyPI (requires Python 3.10+):
pip install gridcalc
Or with uv:
uv tool install gridcalc
Then run:
gridcalc # new spreadsheet
gridcalc budget.json # open a file
From source
git clone https://github.com/shakfu/gridcalc.git
cd gridcalc
uv run gridcalc
File format
Spreadsheets are stored as JSON:
{
"code": "def margin(rev, cost):\n return (rev - cost) / rev * 100\n",
"names": {
"revenue": "A1:A12",
"costs": "B1:B12"
},
"cells": [
["Revenue", "Cost", "Margin"],
[1000, 600, "=margin(A1, B1)"],
[1200, 700, "=margin(A2, B2)"]
],
"format": {
"width": 10
}
}
- cells: 2D array of cell values (numbers, strings, formulas, or null)
- code (optional): Python code executed before formulas (functions, imports, constants)
- names (optional): named ranges mapping names to cell ranges
- format (optional): display settings (currently only
width)
Usage
Arrow keys navigate. Type a number or = to enter data. Formulas start
with = and are Python expressions. Anything else is a label.
Press : for the command line (vim-style):
:q Quit
:q! Force quit (no save prompt)
:w [file] Save
:wq [file] Save and quit
:e Edit code block in $EDITOR
:o [file] Open file
:b Blank current cell
:clear Clear entire sheet
:f <fmt> Format/style cell (b u i L R I G D $ % * or Python spec)
:gf <fmt> Set global format
:width <n> Set column width (4-40)
:dr Delete row
:dc Delete column
:ir Insert row
:ic Insert column
:m Move row/column (arrow keys to drag)
:r Replicate (copy with relative refs)
:name <n> [range] Define named range
:names List named ranges
:unname <n> Remove named range
:tv/:th/:tb/:tn Lock/unlock title rows/columns
Other keys:
> Go to cell (type reference)
! Force recalculation
" Enter label
Backspace Clear cell
Tab Next column
Enter Next row
Home Jump to A1
Ctrl-B Toggle bold
Ctrl-U Toggle underline
Ctrl-Z Undo
Ctrl-Y Redo
Ctrl-C Quit
Formulas
Formulas are Python expressions prefixed with =. Cell references like
A1, B3, AA10 are available as variables.
=A1 + B1 * 2
=(A1 + A2) / 2
=A1 ** 2
=SQRT(A3 + A2)
Range syntax
Use : to reference a range of cells. Ranges expand into arrays (Vec)
that support element-wise arithmetic.
=SUM(A1:A10)
=AVG(B1:B3)
=SUM(A1:A3 * B1:B3)
Named ranges
Define a name for a cell range with :name, or in the JSON file's
names field. Names are injected as arrays and can be used directly in
formulas.
=SUM(revenue)
=SUM(revenue - costs)
=MAX(revenue)
=sum([x**2 for x in revenue])
Custom functions
Use :e to open the code block in $EDITOR. The editor must block
until the file is closed (e.g., vim, nano, or subl -w for Sublime
Text). Define Python functions, import modules, set constants:
import statistics
def margin(rev, cost):
return (rev - cost) / rev * 100
def compound(principal, rate, years):
return principal * (1 + rate) ** years
TAX_RATE = 0.21
Then use them in formulas: =margin(A1, B1), =compound(1000, 0.05, 10).
Built-in functions
SUM(x) Sum of array or scalar
AVG(x) Average
MIN(x) Minimum
MAX(x) Maximum
COUNT(x) Number of elements
ABS(x) Absolute value (element-wise for arrays)
SQRT(x) Square root (element-wise for arrays)
INT(x) Truncate to integer (element-wise for arrays)
Math functions are preloaded: sin, cos, tan, exp, log,
log2, log10, floor, ceil, pi, e, inf. The math module
is also available for anything else (=math.factorial(10)).
Python builtins like sum, min, max, abs, len also work.
Arrays
A formula can return an array. The cell displays the first element and
the count, e.g. 3.0[12]. The full array is shown in the status bar.
Element-wise arithmetic works between arrays and scalars:
=revenue * 1.1
=revenue + costs
Cell references
References adjust automatically on replicate, insert, and delete.
Use $ for absolute references: $A$1 (fixed), $A1 (fixed column),
A$1 (fixed row).
Formatting
Use :f to set the display format or style of a cell. All formats
and styles are persisted when saving.
Text styles
Toggle with :f or keyboard shortcuts. Styles can be combined
in a single command:
:f b Toggle bold (also Ctrl-B)
:f u Toggle underline (also Ctrl-U)
:f i Toggle italic
:f bi Toggle bold + italic
:f bui Toggle bold + underline + italic
Number formats
:f $ Dollar (2 decimal places)
:f % Percentage (value * 100, 2 decimal places)
:f I Integer (truncate decimals)
:f * Bar chart (asterisks proportional to value)
:f L Left-align
:f R Right-align
:f G General (default)
:f D Use global format
Use :gf to set the global default format for all cells.
Python format specs
For more control, pass any Python format specification:
:f ,.2f 1,234.50 (comma thousands, 2 decimals)
:f ,.0f 1,234,567 (comma thousands, no decimals)
:f .1% 15.7% (percentage with 1 decimal)
:f .4f 3.1416 (fixed 4 decimal places)
:f .2e 1.23e+04 (scientific notation)
These use Python's format() builtin. Any valid
format spec
works.
Development
make test # run tests
make lint # ruff check
make format # ruff format
make typecheck # mypy
make qa # lint + typecheck + test + format
Publishing
make check # build and check dist with twine
make publish-test # upload to TestPyPI
make publish # upload to PyPI
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gridcalc-0.1.1.tar.gz.
File metadata
- Download URL: gridcalc-0.1.1.tar.gz
- Upload date:
- Size: 28.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6409f60983c77bc7aea102db0a145cdc4a9defa5dd202c6d4775a2bb73ceadf6
|
|
| MD5 |
bd2c3d9037382eebb0333e26b96623e9
|
|
| BLAKE2b-256 |
59539998c480369f30056e8b46ba28079457c62c61815f07c0a933e7ce8ce41b
|
File details
Details for the file gridcalc-0.1.1-py3-none-any.whl.
File metadata
- Download URL: gridcalc-0.1.1-py3-none-any.whl
- Upload date:
- Size: 31.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2a328487d8afc73c46f6186445229bc4789a4abab9441adca61c3611e4140a5
|
|
| MD5 |
422afe8883c8c2786385b1969b2be04a
|
|
| BLAKE2b-256 |
9be064b06851a7717e2272a4cebcaa5cf23a194016af7d5dd6130ec4615e9894
|