Excel to Parquet
How to convert Excel to Parquet for free
rows.page doesn't open .xlsx files, so copy the cells or save the sheet as CSV UTF-8, paste or drop it into rows.page (free, CSV up to 1.5 GB) and export zstd-compressed Parquet. To read the workbook itself, use DuckDB 1.2 or later with its excel extension, or pandas with openpyxl and pyarrow.
No file handy? Open CO2 emissions by country and year (50k rows, 14 MB).
Compare the 3 ways to convert Excel to Parquet
rows.page works in your browser on copied cells or a CSV saved from Excel. DuckDB and pandas read the .xlsx file itself on your machine.
| Method | Install needed | Reads .xlsx directly | Parquet compression |
|---|---|---|---|
| rows.page | None (browser) | No: paste cells or save as CSV | zstd |
DuckDB excel extension | DuckDB 1.2 or later | Yes, but not .xls | Snappy by default, zstd with COMPRESSION zstd |
| pandas | openpyxl and pyarrow | Yes | Snappy by default, zstd with compression='zstd' |
Method 1: Convert Excel to Parquet in your browser with rows.page
rows.page reads data files, not workbooks: a dropped .xlsx or .xls file won't open as a sheet, and pushing one returns "This looks like an Excel or zip file. Export it as CSV and push again." So get the sheet out of Excel first. The rest runs in your browser with DuckDB-WASM, with no account, and nothing is uploaded unless you press Share.
- For a range, select the cells in Excel, copy them, open rows.page and click Paste data. Excel copies cells as tab-separated text, so they open as a table.
- For a whole sheet, choose File > Save As, pick CSV UTF-8 (Comma delimited) and drop the
.csvfile on rows.page. - Optionally filter rows, hide columns in the Columns panel, or type SQL that starts with
SELECT,WITHorFROMagainst thedatatable. - Open the Export menu and choose Parquet. rows.page downloads a zstd-compressed
.parquetfile.
CSV files up to 1.5 GB open in full, and a bigger one loads partially with the note "Loaded the first N rows: the file is X, more than the browser can hold." The export follows the current view: a filtered view exports every matching row without the hidden columns, and a SQL result exports its own columns, up to 1,000,000 rows.
Method 2: Convert .xlsx to Parquet with DuckDB
DuckDB 1.2 and later reads .xlsx files with its excel extension. Run this in the DuckDB CLI:
INSTALL excel;
LOAD excel;
COPY (SELECT * FROM read_xlsx('book.xlsx', sheet = 'Sheet1'))
TO 'book.parquet' (FORMAT parquet, COMPRESSION zstd);- Leave out
sheetandread_xlsxreads the first sheet. Old.xlsfiles fail withFailed to open zip for reading. - Without
COMPRESSION zstd, DuckDB writes Snappy-compressed Parquet. - Number cells load as
DOUBLE, so cast whole-number columns, for exampleSELECT * REPLACE (CAST(id AS BIGINT) AS id) FROM read_xlsx('book.xlsx'). - A column that mixes numbers and text such as
N/Astops the read withFailed to parse cell. Addignore_errors = trueto read those cells as NULL, orall_varchar = trueto read everything as text, which turns dates into Excel serial numbers such as45296.
Method 3: Convert .xlsx to Parquet in Python with pandas
pandas reads .xlsx through openpyxl and writes Parquet through pyarrow:
pip install pandas openpyxl pyarrowimport pandas as pd
df = pd.read_excel('book.xlsx', sheet_name='Sheet1', dtype={'zip': str})
df.to_parquet('book.parquet', compression='zstd')Without dtype, pandas turns text such as 02134 into the number 2134, and without compression it writes Snappy. It reads cells such as N/A as missing values. A column that mixes dates and text stays object, and to_parquet stops with ArrowTypeError; convert it first with pd.to_datetime(df['when'], errors='coerce').
Fix Excel type problems before you export
Excel lets any cell hold any value, while each Parquet column has one type. When you convert through rows.page, check these first:
- Leading zeros: if Excel stores a ZIP code as a number, the zero is gone before any conversion. Format the column as Text in Excel, or pad it back with
lpad(CAST(zip AS VARCHAR), 5, '0'). - Mixed columns: a number column with notes such as
N/AorTBDis read as text.TRY_CAST(qty AS DOUBLE)turns it into numbers, with NULL for the notes. - Dates: copied cells and CSV files hold dates as text, such as
4/1/2019. rows.page reads a consistent format like that as a date; parse others withstrptime(col, '%d.%m.%Y'). - Long numbers: Excel keeps 15 significant digits, so a 16-digit ID stored as a number already ends in 0. Store such IDs as Text in Excel.
Fix several columns at once in the filter box, then export the SQL result as Parquet:
SELECT * EXCLUDE (__rid) REPLACE (
lpad(CAST(zip AS VARCHAR), 5, '0') AS zip,
TRY_CAST(qty AS DOUBLE) AS qty
)
FROM dataCheck the Parquet file in rows.page
Drop the .parquet file on rows.page to confirm the conversion. Parquet isn't held to the 1.5 GB limit for text files because DuckDB-WASM reads it in place, and the grid has no row limit.
- The Columns panel shows each column's type, distinct count ("N values", or "~N values" when estimated), share of empty values, and min and max for numbers and dates.
- "Search all N values" under a column finds a value such as
02134, so you can confirm leading zeros survived. FROM (SUMMARIZE data)in the filter box returns min, max, average, quartiles and the null percentage for every column.
rows.page limits and prices
| What | Limit or price |
|---|---|
| Open a file in your browser | Files up to 1.5 GB, $0, no account, nothing uploaded |
| Share a link without an account | $0, files up to 100 MB, link deleted 7 days after creation |
| Free account | $0, 10 datasets kept, last 3 versions |
| Pro | $12/month, 100 datasets, files up to 500 MB, private links |
| Max | $39/month, 1,000 datasets, files up to 2 GB, private links |
Questions
Can rows.page open an .xlsx file?
No. rows.page reads CSV, TSV, JSON, JSONL and Parquet, not .xlsx or .xls, and pushing an .xlsx returns "This looks like an Excel or zip file. Export it as CSV and push again." Copy the cells and use Paste data, or save the sheet as CSV UTF-8 first.
Does rows.page upload my data?
No. Pasted cells and opened files are read inside your browser with DuckDB-WASM. Nothing leaves your machine unless you press Share ("Upload and get a link") or push a file with curl -T book.parquet https://rows.page.
Why won't my CSV from Excel open in rows.page?
A CSV that isn't UTF-8 is read as Latin-1, but a euro sign, curly quotes or long dashes saved in a Windows encoding stop it from opening ("Couldn't open this data"). Save the sheet again as CSV UTF-8 (Comma delimited), or copy the cells and use Paste data.
Can DuckDB convert an old .xls file to Parquet?
No. The excel extension reads .xlsx only, and an .xls file fails with Failed to open zip for reading. Save it as .xlsx or CSV UTF-8 in Excel first, or read it with pandas and the xlrd package.
Is there a row limit when converting to Parquet in rows.page?
The grid has no row limit, and a filtered view exports every matching row. A CSV over 1.5 GB loads only partially, and a SQL result exports up to 1,000,000 rows.