# Read a spreadsheet

Acquire / file

read Excel, ODS, Google Sheets

Page: <https://meridian.online/operations/read-a-spreadsheet>

## Status

Runs as a SQL step.

arcform carries it as a `sql:` step today, with the `excel` extension.

## The DuckDB step

a sheet whose first data cell is empty, read as text then typed

```sql
INSTALL excel; LOAD excel;
COPY (SELECT * FROM (VALUES (NULL, 1.0), ('north', 2.0)) t(region, total)) TO '<your_scratch_dir>/nullfirst.xlsx' (FORMAT xlsx, HEADER true);
CREATE TEMP TABLE result AS
SELECT region, TRY_CAST(total AS DOUBLE) AS total FROM read_xlsx('<your_scratch_dir>/nullfirst.xlsx', all_varchar = true);
SELECT * FROM result;
SELECT CASE WHEN ((SELECT count(*) = 2 AND count(region) = 1 AND max(region) = 'north' AND sum(total) = 3 FROM result)) THEN 'as expected' ELSE error('the sheet did not read as one empty region, one north, totalling 3') END AS verdict;
```

Replace `<your_scratch_dir>` with a directory of your own that you can write to before running the statement.

The statement writes `nullfirst.xlsx` itself, in `<your_scratch_dir>`.

It needs the `excel` extension.

## Variants

- Read a sheet of a workbook: Read a sheet or range of an Excel workbook into a table.
- [Read an online spreadsheet](https://meridian.online/operations/read-a-spreadsheet/read-an-online-spreadsheet): Read a sheet or range from a spreadsheet held in a cloud service through its API.
- [List a workbook's sheets](https://meridian.online/operations/read-a-spreadsheet/list-a-workbooks-sheets): Return the names of the sheets in a workbook rather than their contents.
- Read an OpenDocument spreadsheet: Read a sheet of an ODS workbook into a table.

## What other tools call it

Meridian's classification; an independent blind rating agreed on 86.2% of 312 rows (exact class, version 2).

- Azure Data Factory: [`Excel format (source)`](https://learn.microsoft.com/en-us/azure/data-factory/format-excel) (read 2026-09-27)
- Alteryx Designer: [`Google Sheets Input`](https://help.alteryx.com/current/en/designer/tools/connectors/google-sheets-input-tool.html) (read 2026-09-27)
- Duckle: [`Excel (XLSX)`](https://github.com/slothflowlabs/duckle/blob/f85f8960edfb6efbf4cb89d58a7b32e16df0e867/website/docs/components.html) (read 2026-09-25)
- EasyMorph: [`Import Excel spreadsheet`](https://help.easymorph.com/doku.php?id=transformations:importexcel) (read 2026-09-27)
- EasyMorph: [`Import Google Sheets`](https://help.easymorph.com/doku.php?id=transformations:importgooglesheets) (read 2026-09-27)
- Apache Hop: [`Excel input`](https://hop.apache.org/manual/latest/pipeline/transforms/excelinput.html) (read 2026-09-27)
- Apache Hop: [`Google Sheets input`](https://hop.apache.org/manual/latest/pipeline/transforms/google-sheets-input.html) (read 2026-09-27)
- KNIME Analytics Platform: [`Excel Reader`](https://api.hub.knime.com/nodes/*I129Ntc6bhMN6EpL?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`Google Sheets Connector`](https://api.hub.knime.com/nodes/*R_Hu91aCOa8RFibu?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`Google Sheets Reader`](https://api.hub.knime.com/nodes/*poHAFve1qUYVbcyD?details=full) (read 2026-09-27)
- KNIME Analytics Platform: [`Read Excel Sheet Names`](https://api.hub.knime.com/nodes/*pSZxsfdYwqHb7ecJ?details=full) (read 2026-09-27)
- Apache NiFi: [`ExcelReader`](https://nifi.apache.org/components/org.apache.nifi.excel.ExcelReader/) (read 2026-09-27)
- OpenRefine: [`Excel spreadsheet (XLS or XLSX)`](https://openrefine.org/docs/manual/starting#create-a-project-by-importing-data) (read 2026-09-27)
- OpenRefine: [`Google data`](https://openrefine.org/docs/manual/starting#google-data) (read 2026-09-27)
- OpenRefine: [`OpenDocument spreadsheet (ODS)`](https://openrefine.org/docs/manual/starting#create-a-project-by-importing-data) (read 2026-09-27)
- Pentaho Data Integration: [`Microsoft Excel Input`](https://docs.pentaho.com/pdia-data-integration/9.3-data-integration/pdi-transformation-steps-reference-overview) (read 2026-09-27)
- Polars: [`read_excel`](https://docs.pola.rs/api/python/stable/reference/io.html) (read 2026-09-27)
- Polars: [`read_ods`](https://docs.pola.rs/api/python/stable/reference/io.html) (read 2026-09-27)
- Power Query M: [`Excel.CurrentWorkbook`](https://learn.microsoft.com/en-us/powerquery-m/accessing-data-functions) (read 2026-09-27)
- Power Query M: [`Excel.Workbook`](https://learn.microsoft.com/en-us/powerquery-m/accessing-data-functions) (read 2026-09-27)
- RapidMiner Studio: [`List Google Sheets`](https://docs.rapidminer.com/latest/studio/operators/data_access/cloud_storage/google_sheets/google_sheets_iterator.html) (read 2026-09-27)
- RapidMiner Studio: [`Read Excel`](https://docs.rapidminer.com/latest/studio/operators/data_access/files/read/read_excel.html) (read 2026-09-27)
- RapidMiner Studio: [`Read Excel Sheet Names`](https://docs.rapidminer.com/latest/studio/operators/extensions/Operator%20Toolbox/data_access/read_excel_sheetnames.html) (read 2026-09-27)
- RapidMiner Studio: [`Read Google Sheets`](https://docs.rapidminer.com/latest/studio/operators/data_access/cloud_storage/google_sheets/google_sheets_reader.html) (read 2026-09-27)
- Talend: [`tFileInputExcel`](https://help.qlik.com/talend/en-US/components/8.0/excel/excel-component) (read 2026-09-27)
- VisiData: [`gsheets (loader)`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/experimental/gsheets.py#L8) (read 2026-09-23)
- VisiData: [`ods (loader)`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/loaders/odf.py#L5) (read 2026-09-23)
- VisiData: [`xls (loader)`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/loaders/xlsx.py#L16) (read 2026-09-23)
- VisiData: [`xlsb (loader)`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/loaders/xlsb.py#L12) (read 2026-09-23)
- VisiData: [`xlsx (loader)`](https://github.com/saulpw/visidata/blob/7609212ec2febafa9caba7183cbebfaf49627909/visidata/loaders/xlsx.py#L21) (read 2026-09-23)
