Reading an Excel Workbook of Well Data
A native .xlsx is read directly — unzipped and scanned in this browser tab, with nothing sent anywhere. This page is the workbook-shaped half of the import rules: which sheet, where the header is, what happens to dates and formulas, and which spreadsheet files are not workbooks at all. The rules about what each column has to look like are the same for a workbook and a text file, so they live once, on the CSV page.
A workbook is unzipped and scanned here, in this tab
An .xlsx is a zip archive of XML. Reading one means inflating the archive and scanning the parts that matter: the workbook itself for the sheet list and the date system, the shared string table, the style table, and then the worksheet. All of that happens in the browser, on your machine, by code that was downloaded with the page.
That is not a technical detail for its own sake. It is the reason dropping a client’s monitoring workbook here does not send it anywhere: there is no server that could receive it and no request that carries it. The reader is loaded only when a file turns out to be a workbook, so somebody who pastes a CSV never downloads it at all.
Numbers are not reformatted on the way through. A northing stored as 4791220.1400000001 arrives as exactly that string, because a product whose promise is that it does not quietly change your data cannot begin by rewriting coordinates.
| In your file | What happens to it |
|---|---|
| A native .xlsx workbook | Read end to end, and identified as an Excel workbook in the ingest report. |
| The same sheet saved as a CSV instead | Produces the same wells and the same columns. The two paths meet at the table. |
| A top-of-casing column and a depth-to-water column in a workbook | The head is computed exactly as it is from a CSV. The arithmetic lives below the seam the two readers meet at. |
| A cell holding rich text — part bold, part not | The runs are joined back into one string, so MW- and 1 do not become two cells. |
| XML entities in a cell | Resolved, including numeric ones. |
| A sheet wider than twenty-six columns | Columns are resolved from each cell’s own reference rather than by counting, so a sparse row cannot shift everything to its right. |
Which sheet, and where the header row is
The first sheet with anything on it is read, visible sheets before hidden ones, and which one it was is stated in the report along with the ones that were passed over. Only one sheet can be a site. A hidden sheet is still tried rather than refused, because a workbook whose only data is on one is a real thing and "nothing found" would be the worse answer.
The header row does not have to be row 1. A site name across the top, a units row, a revision line and a blank or two are all normal on a real gauging sheet, and the reader looks past them for the row that actually heads the data.
| In your file | What happens to it |
|---|---|
| A title row above the real headers | Skipped. The header row is found underneath it. |
| A workbook with a Notes sheet and a Wells sheet | One is read and the report says which — and which were not. |
- A workbook whose site data is split across one sheet per quarter is not merged. One sheet is read and the others are named as not read. Put the rounds in one sheet with a date column, which is also the shape the change map and the trend map need.
- A pivot table, a chart sheet or a sheet of formatted summary blocks is not a table. What is read is a rectangle of cells with a header row over it.
Dates, which is where a workbook does most of its damage
A date in Excel is a number wearing a costume. 2026-03-14 is stored as 46095 with a date format attached, and a reader that ignores the format gets a column of five-digit integers. So the style table is read and a number carrying a date format is decoded as a date.
Two traps come with that, and both are pinned. The first is that Excel believes 29 February 1900 existed; it did not, and a conversion that ignores the phantom day is out by one for every date before March 1900. The second is that a workbook saved by older Mac Excel counts from 1904 instead — the same serial is then four years and a day LATER, which looks exactly like a data-entry error rather than an epoch problem, so a workbook using it is called out in the report rather than silently shifted.
The style reader takes its formats from the cell formats and never from the cell STYLE formats, which are a different element with the same child name and routinely different contents. A reader that takes every one of them resolves every style wrongly, which is the kind of bug that turns a currency column into dates.
| In your file | What happens to it |
|---|---|
| A cell formatted as a date | Decoded as a date rather than left as a five-digit serial. |
| A currency or a quoted literal containing a d or an m | Not mistaken for a date format. |
| Serial 59 and serial 61 | 28 February 1900 and 1 March 1900. The day Excel believes is between them does not exist. |
| A workbook saved under the 1904 date system | Named in the report. The same serial is 1,462 days later under that epoch. |
| Cell formats and cell style formats in the same style table | Only the cell formats are read, because the two elements share a child name and rarely share contents. |
- A date typed as text in a workbook is read the way the CSV page describes, day and month order decided from the whole column. Mixing genuine dates and text dates in one column is common in a sheet several people have edited, and it is the case worth checking in the detection table.
Formulas, blanks and the cells that are not numbers
A formula cell gives you the value Excel last calculated and stored beside it. Nothing here evaluates a formula, so a workbook saved with stale results reads as those stale results — recalculate and save before exporting if that is a risk.
An error cell — #DIV/0!, #N/A — comes through as its own text and is then treated as no measurement rather than as a broken row. A boolean becomes TRUE or FALSE. A cell with nothing in it is a blank, and a blank is never a zero.
Cell colour, borders, conditional formatting, comments and merged cells carry no meaning to this reader. A workbook where "the yellow rows are the up-gradient wells" needs a column saying so, because a colour cannot be contoured.
- A merged cell is read as its top-left value with the rest blank. A header merged across three columns therefore names one of them, which is usually not what was meant.
- Nothing checks that a column of numbers stored as text is numbers stored as text. It reads fine here; it is worth knowing because it is the usual reason the same column behaves differently in Excel itself.
Spreadsheet files that are not workbooks, and what to do
Several things that look like a spreadsheet to a person are not an .xlsx to a reader. Each is recognised by what it actually is and named in plain words, with the fix, because the difference between a useful product and a frustrating one is entirely in whether the message says what the file is.
| In your file | What happens to it |
|---|---|
| A legacy .xls, from before 2007 | Named as a legacy Excel file, with Save As offered as the fix. It is a different format, not a broken workbook. |
| An OpenDocument .ods | Named as OpenDocument, with the conversion suggested. |
| A binary .xlsb | Named. It is a zip like an .xlsx and holds a binary sheet part rather than XML. |
| A zipped shapefile, which a GIS user will try first | Recognised as a shapefile and told plainly that no reader for one is built. |
| A CSV that somebody renamed to .xlsx | Read as text, and the report says that is what happened. |
| A zip full of something else entirely | The contents are listed, so you can see what you actually dropped. |
| An empty file | Said, in one sentence. |
- A password-protected or encrypted workbook cannot be opened here. It is an OLE2 container rather than a zip, so it is named the same way a legacy .xls is; remove the protection in Excel and save again.
- A workbook is capped at a million spreadsheet rows walked, and the parse takes two hundred thousand data rows from what that finds. A file past either is truncated with the truncation stated rather than refused.
What you dropped is shown back to you as text
A workbook that has been read is also rendered back into a tab-separated block in the "or paste it instead" box. That is not decoration: it is the sheet as this reader saw it, so a header that was mangled is visible rather than inferred from a wrong map, and an edit to it re-reads as ordinary text.
It is also where you answer "did it read the right sheet". The answer is on screen rather than in a report line.
Where these claims come from
Every line in the tables above is asserted by an automated test in this site’s own suite, and the build fails when one of them stops being true. The files are listed so that somebody who wants the receipts can go and read the assertion rather than take a sentence on trust.
src/core/spatial/__tests__/ingest.test.tssrc/core/spatial/__tests__/date.test.tssrc/core/spatial/__tests__/parse.test.ts
What is stated here without a test behind it
These pages describe other people’s file formats and other people’s software as well as this site’s own behaviour, and the boundary between "there is a test for this" and "this is what the documentation says" is invisible to a reader unless somebody draws it. This is where it is drawn.
- The two Excel date systems and the 1900 leap-year bug are stated from the file format specification and from Microsoft’s own documentation of the behaviour, and the arithmetic for both is pinned by tests here. Which system a particular workbook uses is read from the workbook rather than assumed.
- Nothing on this page has been checked against a workbook exported by a commercial laboratory information system. Every fixture behind it is a workbook built by the test suite itself, because no client data of any kind is allowed into this repository.
- The list of unreadable formats is the list this reader recognises by name. A spreadsheet format not on it will be reported as an unrecognised file rather than identified.
Common questions
- Do I have to save my workbook as a CSV first?
- No. Drop the .xlsx in. Saving to CSV is worth doing only when the workbook is a legacy .xls, an .ods or an .xlsb, all of which are named as such if you try them.
- Which sheet will it read?
- The first one with anything on it, visible sheets before hidden ones, and it tells you which. If that is the wrong sheet, move the data or delete the ones in front of it — there is no sheet picker, and adding one would be a question asked before you had seen anything.
- Is the workbook uploaded to be unzipped?
- No. The zip is inflated and the XML scanned in this browser tab, by code that came with the page. There is no server to send it to.
- My dates came out as five-digit numbers somewhere else. Will they here?
- Not if the cells are formatted as dates in the workbook, which is what the style table is read for. A column of serials with no date format on it is a column of numbers, and those are decoded only where they fall in a date column and land inside a believable monitoring window.
Where to go next
- What a CSV has to look like — the column rules in full — headers, non-detects, coordinates, wide and long
- How to make a potentiometric surface map — what to do with the workbook once it reads
- Potentiometric surface map — drop the workbook in and read the detection table on your own data
- Privacy — how to check that the workbook really did not go anywhere
Written 2026-08-15.