Skip to main content

gridcalc

PyPI Python License: MIT

A programmable spreadsheet for developers and technical users, with Excel-ish formulas, Python escape hatches, XLSX interop, goal seek, and LP/MIP solving. It ships two frontends over one engine: a curses terminal app, and a desktop window that renders the same workbook in a webview.

Inspired by Serge Zaitsev's kalk.

The terminal app: a sales report with IF/MATCH formulas, named ranges, and two spilled array results

The terminal app over example_excel.json.

The desktop app: the Optimize dialog reporting an optimal solve with shadow prices and RHS ranging

The desktop app solving example_lp.json -- the solution is written to the sheet behind the dialog.

pip install gridcalc
gridcalc budget.json        # terminal
gridcalc-web budget.json    # desktop window  (needs the [web] extra)

Documentation: https://shakfu.github.io/gridcalc/ -- install, tour, formula reference, optimization guide, file format, Python API, and the design notes.


What it gives you

  • Excel-compatible formulas (=IF(A1>=B1, A1*0.05, 0)) and arrays (=SUM(A1:A10 * B1:B10)) without leaving the terminal.

  • Multi-sheet workbooks with cross-sheet refs (=Sheet2!A1) and a proper dep graph.

  • Three formula modes per file: strict Excel, Excel-plus-py.*, or full Python eval with numpy/pandas.

  • xlsx interop via OpenXLSX C++ -- read every sheet's formulas + values; export with cached values.

  • Linear, mixed-integer & quadratic programming built in via HiGHS -- :opt max B4 vars A4:A5 st D4:D6 solves from cells in the sheet, with shadow prices, infeasibility diagnosis, and RHS sweeps. Models persist in the workbook.

  • Goal-seek -- :goal B10 = 100 by A1 adjusts a variable so a formula hits a target value.

  • Vim-style command line (:w, :e, :q, /search, y/p, visual selection, undo), with system-clipboard copy/paste -- yank pushes values as TSV, paste pulls TSV in from other apps.

  • A desktop app as well as a terminal one -- the same engine behind a mouse-driven grid with menus, a Ctrl-K command palette, and solver results painted onto the sheet. Most : commands are a shared registry both frontends dispatch, so they behave identically in each.

Install

pip install gridcalc            # core: zero third-party runtime deps
pip install 'gridcalc[extras]'  # adds numpy, pandas, pygments
pip install 'gridcalc[web]'     # adds the desktop window (gridcalc-web)

Or with uv: uv tool install 'gridcalc[extras]'.

The core install has zero third-party runtime dependencies on Linux and macOS -- the full 300+ Excel function library (statistical distributions, financial functions, LINEST/TREND regression, ...) works on stdlib alone. Details in the install guide.

A taste

Cells hold a number, a label (any non-=-prefixed string), or a formula (prefixed with =):

        A          B          C
1  Revenue   Cost       Margin
2  1000      600        =(A2-B2)/A2*100      <- formula
3  1200      700        =(A3-B3)/A3*100
4  Total     =SUM(B2:B3) =AVG(C2:C3)

Press : for the command line -- :w saves, :o opens, :q quits, v selects, u undoes, / searches. The quick tour covers the rest, and the command reference lists every command.

Try the shipped examples:

gridcalc example_excel.json          # sales report, named ranges, IF/MATCH
gridcalc example_excel.xlsx          # the same workbook saved as xlsx
gridcalc example_hybrid.json         # progressive tax via py.* + aggregations
gridcalc example.json                # PYTHON: numpy/pandas, list-comprehensions
gridcalc example_multisheet.json     # 3-sheet budget, cross-sheet formulas
gridcalc example_lp.json             # LP/MIP demo -- type :opt to solve
gridcalc example_goal.json           # goal-seek demo -- :goal B1 = 11 by A1

Scripting it

Any operation flag turns the same command line into a batch run that never opens a window -- so the solver is reachable from cron, a Makefile, or CI:

gridcalc plan.json --solve                       # run the workbook's saved model
gridcalc plan.json --solve --sens                # ... with shadow prices
gridcalc plan.json --sweep 'D5 6:24 9'           # parametric right-hand side
gridcalc book.json --goal 'B10 = 100 by A1'      # goal seek
gridcalc book.json --eval '=SUM(A1:A10)'         # evaluate a formula
gridcalc book.xlsx --convert book.json           # format conversion

Results go to stdout as JSON with a documented schema, and the exit code separates "the answer is no" (2 -- infeasible, unbounded, did not converge) from "the job is broken" (1). Nothing is written back unless you pass --apply. Full reference: https://shakfu.github.io/gridcalc/reference/cli/

Documentation

Topic
Install, extras, source builds https://shakfu.github.io/gridcalc/install/
Quick tour https://shakfu.github.io/gridcalc/tour/
Desktop app (web frontend) https://shakfu.github.io/gridcalc/desktop/
Formulas, functions, named ranges https://shakfu.github.io/gridcalc/guide/formulas/
Optimization (LP/MIP/QP, sensitivity, sweeps) https://shakfu.github.io/gridcalc/guide/optimization/
Headless CLI (solve/goal/sweep/eval/convert) https://shakfu.github.io/gridcalc/reference/cli/
File format https://shakfu.github.io/gridcalc/reference/file-format/
Python API https://shakfu.github.io/gridcalc/reference/api/
Design notes (recalc, security, web frontend) https://shakfu.github.io/gridcalc/topological/

The pages are built from docs/ with MkDocs; make docs-serve previews them locally.

Development

make build      # rebuild the C++ extensions (_core, _opt)
make test       # unit tests
make qa         # lint + typecheck + test + format (Python and TypeScript)
make web-build  # compile the desktop app's React client
make docs       # build the documentation site
make wheel      # cpXX-cpXX wheel for current Python

The full target list is in the development guide, and make help prints it.

Prior Art

  • sc-im: A ncurses spreadsheet program for terminal

  • sheets: A terminal based spreadsheet tool

  • rustxl: A fast, keyboard-driven spreadsheet with vim-style navigation and Excel-compatible formulas.

License

MIT

Metadata

Release files for gridcalc 0.10.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for gridcalc 0.10.0
File
gridcalc-0.10.0-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details
gridcalc-0.10.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 abi3 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
gridcalc-0.10.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.12 abi3 Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 Details
gridcalc-0.10.0-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details
gridcalc-0.10.0-cp312-abi3-macosx_10_15_x86_64.whl CPython 3.12 abi3 macOS 10.15+ x86-64 Details

Total release size: 15.7 MB

Release files / gridcalc-0.10.0-cp312-abi3-win_amd64.whl

Download URL gridcalc-0.10.0-cp312-abi3-win_amd64.whl
Size 2.9 MB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
a105e1ec1a809d76a9e186f32dd8540d6dbb5e358df48aab38ee9a55a6aa764a
BLAKE2b-256 checksum
How to use checksums
8019d516ee249f8c7329892dfecfc51478d8ffbabe2a33d2ce367e75980bb9c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.7

Release files / gridcalc-0.10.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL gridcalc-0.10.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 3.7 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
f4fa3b2bedfca2c93bdb58149a4e01a4e2b1ec8d6c0ae295bcf05b7666159e08
BLAKE2b-256 checksum
How to use checksums
a3c17cd52e74f7fc96245d3f935bfa4f23d4ffeb4105e4e13a378cc14ca9cf2d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.7

Release files / gridcalc-0.10.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL gridcalc-0.10.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 3.5 MB
Tags CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
852dc23008d518bd4e87549f124cbed5760e3c764ab935d4a6d478c72338fb67
BLAKE2b-256 checksum
How to use checksums
a6361fa9235d0ba02dcb1aa4fd4ca75a3f99b2785bcf3be7ef3b246ce053985c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.7

Release files / gridcalc-0.10.0-cp312-abi3-macosx_11_0_arm64.whl

Download URL gridcalc-0.10.0-cp312-abi3-macosx_11_0_arm64.whl
Size 2.7 MB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b47ef7b7a93a7259c767d4db36e22f38a5c9c919bf70c17f04e39c9a6bd0d5dc
BLAKE2b-256 checksum
How to use checksums
46b37aeab478857b10423ee153256a5cd2395e5f57946d93fc06e524eb1a7095
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.7

Release files / gridcalc-0.10.0-cp312-abi3-macosx_10_15_x86_64.whl

Download URL gridcalc-0.10.0-cp312-abi3-macosx_10_15_x86_64.whl
Size 2.9 MB
Tags CPython 3.12 abi3 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
c24245edccaafbbd4887bfe1ac7fef5475791b94a9a8bf06f100993e4e15f3c9
BLAKE2b-256 checksum
How to use checksums
46b321270fd638085dcb487e22fa1a00923080951e6fdc60c6987220ba0206c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.7

Release history Release notifications | RSS feed

This release

0.10.0 This release

5 release files

0.9.0

5 release files

0.8.0

5 release files

0.7.0

5 release files

0.6.2

5 release files

0.6.1

5 release files

0.5.1

26 release files

0.5.0

26 release files

0.4.0

26 release files

0.3.3

25 release files

0.3.0

26 release files

0.2.0

26 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page