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.

.csv.parquet
Drop a file here
Stays in your browserUp to 1.5 GB

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.

Excel to Parquet conversion methods
MethodInstall neededReads .xlsx directlyParquet compression
rows.pageNone (browser)No: paste cells or save as CSVzstd
DuckDB excel extensionDuckDB 1.2 or laterYes, but not .xlsSnappy by default, zstd with COMPRESSION zstd
pandasopenpyxl and pyarrowYesSnappy 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.

  1. 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.
  2. For a whole sheet, choose File > Save As, pick CSV UTF-8 (Comma delimited) and drop the .csv file on rows.page.
  3. Optionally filter rows, hide columns in the Columns panel, or type SQL that starts with SELECT, WITH or FROM against the data table.
  4. Open the Export menu and choose Parquet. rows.page downloads a zstd-compressed .parquet file.

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:

sql
INSTALL excel;
LOAD excel;
COPY (SELECT * FROM read_xlsx('book.xlsx', sheet = 'Sheet1'))
TO 'book.parquet' (FORMAT parquet, COMPRESSION zstd);
  • Leave out sheet and read_xlsx reads the first sheet. Old .xls files fail with Failed to open zip for reading.
  • Without COMPRESSION zstd, DuckDB writes Snappy-compressed Parquet.
  • Number cells load as DOUBLE, so cast whole-number columns, for example SELECT * REPLACE (CAST(id AS BIGINT) AS id) FROM read_xlsx('book.xlsx').
  • A column that mixes numbers and text such as N/A stops the read with Failed to parse cell. Add ignore_errors = true to read those cells as NULL, or all_varchar = true to read everything as text, which turns dates into Excel serial numbers such as 45296.

Method 3: Convert .xlsx to Parquet in Python with pandas

pandas reads .xlsx through openpyxl and writes Parquet through pyarrow:

bash
pip install pandas openpyxl pyarrow
python
import 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/A or TBD is 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 with strptime(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:

sql
SELECT * EXCLUDE (__rid) REPLACE (
  lpad(CAST(zip AS VARCHAR), 5, '0') AS zip,
  TRY_CAST(qty AS DOUBLE) AS qty
)
FROM data

Check 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

WhatLimit or price
Open a file in your browserFiles 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.