$Id: f0cc50a6fc6a5dd652c2b96ca9c1779f763fd6b1 $
I’m not a heavy spreadsheet user, just keeping track of expenses, household inventory, investments, that kind of thing. I mostly just use Google Sheets.
However, I really prefer to stay in a terminal if I can, so decided to review some of the options. My only requirements are that it runs in a terminal and works on Linux, but bonus points if it’s extensible (scripts, macros, plugins, etc).
I’ve tested two F/OSS and two commercial console spreadsheets. Here’s the big caveat, it might surprise you to learn (haha) that there isn’t a huge demand for console productivity software. That means these programs havn’t been actively developed for a very long time, but they were once incredibly popular.
Their userbase may now be extinct, but they’re all still mature, stable and functional.
sc is the classic UNIX spreadsheet, written by James Gosling. It’s public domain, and available in most linux distributions.
Perhaps the most interesting thing about sc is that spreadsheets are saved as sequences of commands, and a .sc
file is a human readable script. Here’s an example, if I dump the saved file from the screenshot above, you can see it looks like a scripting language:
$ cat test.sc
# This data file was generated by the Spreadsheet Calculator.
# You almost certainly shouldn't edit it.
rightstring B0 = "Cost"
rightstring C0 = "Count"
rightstring D0 = "Total"
rightstring A1 = "Screws"
let B1 = 0.02
let C1 = 23
let D1 = B1*C1
rightstring A2 = "Plates"
let B2 = 0.44
let C2 = 8
let D2 = B2*C2
label D3 = "------------"
let D4 = @sum(D0:D2)
goto D6 A0
You don’t have to enter these commands directly, as you move around and press keybindings, sc populates the command entry for you - you simply add the options and parameters. I found a particularly good introduction to using sc here. It turns out sc doesn’t have any way to import data, so I had to write a quick script to do that - but once you do get data into sc, all the standard spreadsheet features are there.
The syntax for formulas, cell references and ranges is all familiar. When working with ranges, you can select them in an interactive visual mode and then name them for use in formulas.
That said, while formula syntax, cell references/ranges (e.g. C3
, $A$1:B2
, etc) and basic navigation are all familiar, the list ends there.
You’re going to have to read the documentation to do anything more advanced than editing cells. The commands mostly make sense, but you’re not prompted for any parameters, you have to memorize the options you need from the documentation before you enter command editing mode. Good luck getting that right.
sc does support macros, so you can create a macro for commonly used options (a macro is essentially just a sc command script), and even bind it to a function key.
You can’t rebind standard movement or navigation keys, but most functionality is accessed via commands, and you can define your own.
License | Public Domain |
Platform | Portable, C |
Last Release | 2002 |
Website | None, probably comp.sources.unix |
I really don’t think I could use sc regularly, it seems like a considerable time investment to master basic worksheet manipulation, and I just don’t use a spreadsheet enough to justify that.
However, hope is not lost. There’s a fork of sc with the interface reworked to make it familiar to Vim users. Sc-im also adds desperately needed features like undo/redo, rebindable keys, and import from xls and csv files.
The main attraction for me is that I was able to guess how to do some operations without looking it up, because the bindings and commands are all inspired by Vim. Things like visual mode, yanking and pasting, searching, undo and redo, even :wq!
just work.
In the demo above, you can see me using visual mode to select a column, yanking and pasting it somewhere else, and then adjusting widths. You can also generate a simple ASCII graphs using gnuplot. To generate the graph in the screenshot I used v
to enter visual mode, moved around to choose the data, then :plot bar
.
An especially welcome feature is the formatting options, headers can be bold, negative values can be red, and so on. That makes reading a big list of numbers easier.
License | As-is |
Platform | Portable, C |
Last Release | 2017 |
Website | https://github.com/andmarti1424/sc-im |
The original GNU spreadsheet. I had to fix some bitrot to get it to compile on a modern system. The code was mostly well written, just some outdated C syntax.
Oleo uses r1c1 cell references by default. The only reason I know about r1c1 is because I saw a fun talk by Joel Spolsky who said anything else is “baby mode” 😂.
It’s worth watching the talk, most of what he says applies to any spreadsheet. Still, it feels pretty foreign if you’re not used to it, so luckily you can disable it. I guess I’m a spreadsheet baby! 👶
Where sc-im navigation feels familiar, Oleo was clearly designed with Emacs users in mind. For example, disabling r1c1 mode requires M-x set-option a0
. Still, the bindings are configurable with keymaps and macros, so you can adjust it.
There is builtin graphing, but by default it uses xterm’s tektronix mode - I don’t think any other terminals support that except real xterm. If you’re not using xterm, Oleo can save an image file that can be viewed externally. There is a simple in-cell bar chart format though.
Worksheets can update automatically, so you can make a live dashboard that ingests stock prices or other data. I think this is surprisingly unique, the other spreadsheets I’ve tested only do recalculation when you make a change. Oleo has an option called ticks
that lets you specify an automatic update frequency.
Here’s a silly demo that updates with random numbers, but I can imagine how I might make a spreadsheet that fetches live data for a dashboard.
Oleo has some major missing features, as far as I can tell there is no ability to sort a range, and there are very limited formatting options. That said, the features that are implemented are quite polished.
License | GPL-3 |
Platform | Portable, C |
Last Release | 2001 |
Website | https://www.gnu.org/software/oleo/ |
The original IBM PC killer application, with millions of active users throughout the 80s and 90s.
I was able to find a boxed copy on eBay with the original shrinkwrap for around $20, and installed it on Linux under DOSEMU2. Using ancient software with emulation won’t appeal to everyone, but I quite enjoy it. DOSEMU2 let’s old DOS software access the filesystem, run host commands as if they’re DOS commands, and makes them look indistinguishable from native ncurses applications.
Note: 1-2-3 is available from reputable historical software archives like the Internet Archive and WinWorld. Original copies are available on eBay for around $5-$20 depending on condition. I paid a little more to get a boxed copy with a printed manual.
While the UNIX spreadsheets all have a bare bones interface, the MS-DOS alternatives have very polished usability. 1-2-3 has context-sensitive help with detailed examples, menus, and dialogs to setup complex functions. If a formula or command generates an error, pressing F1
will usually give you a detailed description of the error, suggest causes and solutions.
If you’ve used any spreadsheet before, you don’t really need to read any documentation to get started. Perhaps the only thing you need to know is that the 1-2-3 menu is activated with the /
key. Interestingly, that menu was the subject of a major lawsuit in the 90s.
I don’t mind learning the common commands, but if I only want something occasionally I know I just won’t bother using it if I have to lookup the syntax every time. Here’s a good example, sc and Oleo both support column freezing (that’s where you make a column always visible as your browse around, so you can always see the headings). I could live without it, but it’s so easy to find in 1-2-3 that it’s no effort at all.
1-2-3 can import from CSV and a few other formats but with serious limitations: No line can exceed 512 characters, which seems ridiculously small to me. Worksheets can contain thousands of columns though, so I suppose you just need to import a larger CSV dataset a few columns at a time.
There are extensive formatting options, but very few of them are actually displayed in text mode. For example, you can make a label bold, but unless you print it or switch to graphical mode, it doesn’t look bold. Some options work though, like setting negative values red.
You can create a graph and give it a name (e.g. EXPENSES), then assign cell ranges to axes interactively. There are dialogs and menus to help choose display options, things like graph type (e.g. bar/pie/line), colors, and so on. The process is easy, mostly just following prompts.
You can insert the graph into the sheet, but only a placeholder is inserted - if you want to view it you need to send it to the printer or save to a file. This actually works pretty well in DOSEMU2, I can hit a key and the graph opens in my browser.
Here’s an example graph, if you want to see it.
To see how macros worked, I tried automatically updating a spreadsheet with stock prices so I wouldn’t have to enter them manually. This wasn’t too difficult with DOSEMU, first I created a quick shell script to print stock prices to stdout
.
#!/bin/bash
declare api="https://query1.finance.yahoo.com/v7/finance/quote"
declare filter=".quoteResponse.result[].regularMarketPrice"
curl -s "${api}?symbols=${1:-^GSPC}" | jq -ar "${filter}"
Now you can call it from within DOSEMU using the unix
command, like this:
C:\>unix stocks.sh GOOGL
1764.13
So an example 1-2-3 macro would look like this, where C1
is the cell I want the result stored.
{SYSTEM "UNIX stocks.sh GOOGL > %TEMP%\STOCKS.TXT"}
{OPEN "C:\TMP\STOCKS.TXT", "r"}
{READLN C1}
{CLOSE}
In the screenshot you can see I’ve called this macro {GETSTOCKS}
, and I’ve configured it to run automatically when I open the file. Note that you can hide the macros if you don’t want them to clutter up your spreadsheet.
I think this worked pretty well, who would have thought 30 year old MS-DOS abandonware could use a JSON API 😂
License | Abandonware, Originally $495 |
Platform | MS-DOS |
Last Release | 1994 (for MS-DOS) |
Website | https://web.archive.org/web/19961221020320/http://www.lotus.com/corpcomm/2612.htm |
Perhaps 1-2-3’s biggest competitor, Quattro Pro was later acquired by Corel who still develop it today. The last console version is from 1993, and I was able to find a new-old-stock copy on eBay for around $30.
Note: Quattro Pro is available from reputable historical software archives like the Internet Archive and WinWorld. Original copies are available on eBay for around $5-$20 depending on condition. I paid a little more to get a boxed copy with a printed manual.
Apparently I got some kind of limited edition copy given to the development team…?¯\_(ツ)_/¯
Like Lotus 1-2-3, I use it in Linux using DOSEMU2. I think my first impression of Quattro is how modern it looks, the Turbo Vision interface has aged remarkably well. Menus are organized how you would expect them today, things like File/Open, Edit/Copy, etc.
Quattro Pro is the only spreadsheet I’ve tested that supports box drawing characters, so you can draw cell borders. More formatting options are always welcome, and the graphs in Quattro also look pretty good. Here is the same example from Lotus 1-2-3.
All the standard features work well, and are easy to discover through the menus. The interface is very configurable, you can rearrange and edit menus and keybindings. If you wanted to use it with a mouse you can even make a toolbar.
In general, Quattro Pro has feature parity with 1-2-3, but just feels more polished. Perhaps one exception, you can import data from CSV, but astonishingly there is a maximum line length limit of just 254 characters. That just seems ridiculous.
I browsed around old usenet archives and found that Borland released an official workaround, a macro called DELREAD in their Quattro Pro Utilities collection. I guess even in 1993 people thought that limit was crazy.
License | Abandonware |
Platform | MS-DOS |
Last Release | 1993 (for MS-DOS) |
Website | https://web.archive.org/web/19961221133010/http://www.borland.com/ |
I’m a big enough nerd that I rather enjoy using retro software, and I think I’m going to start using Lotus 1-2-3. There’s no question the MS-DOS packages are the more polished of the console spreadsheets I’ve tested.
I really do like sc-im, and I’m glad it exists. I think as a vim user I could be quite efficient at basic manipulation. That said, I think there are features I like but just wouldn’t use because I’d have to look up how to use them every time. Quattro Pro is accessible enough that I can poke around in menus when I need to use a feature I’m not familiar with.
Perhaps I’ll update this article in 3 months with my experiences and describe any limitations I ran into… or if I gave up and switched to something else. 😅