CSV to Excel
How to open a CSV in Excel correctly: UTF-8, zeros and dates
Excel caps a sheet at 1,048,576 rows; import a CSV with File Origin 65001 to keep accents and Do not detect data types to keep leading zeros. Both settings are in Data > Get Data > From Text/CSV; double-clicking the file skips them. Trim bigger files in rows.page first: it's free with no signup and opens CSVs up to 1.5 GB.
No file handy? Open CO2 emissions by country and year (50k rows, 14 MB).
Why double-clicking a CSV in Excel breaks your data
Excel opens a double-clicked CSV without asking about encoding, delimiter or column types. It guesses, and saving the file writes the damaged values back out.
Excel only assumes UTF-8 when a CSV starts with a UTF-8 byte order mark (BOM), and many tools, rows.page included, export UTF-8 without one. Excel also turns anything that looks numeric into a number: leading zeros vanish, digits past the 15th become zeros, and codes with slashes or hyphens turn into dates.
| Problem | What you see | Fix |
|---|---|---|
| UTF-8 without a BOM | é shows up as é and other symbols turn to junk | Import with From Text/CSV and set File Origin to 65001: Unicode (UTF-8) |
| Wrong delimiter | Every row sits in column A with semicolons, tabs or pipes visible | Pick the right Delimiter in the From Text/CSV preview |
| Dropped leading zeros | ZIP code 02134 becomes 2134 | Set Data Type Detection to Do not detect data types, or make the column Text in Transform Data |
| Numbers over 15 digits | A long ID shows in scientific notation and digits past the 15th become 0 | Load the column as Text |
| Automatic dates | Codes like 10-12 or 3/4 turn into dates | Load the column as Text |
| More than 1,048,576 rows | Rows past the sheet limit are missing | Trim the file in rows.page, or load it into the Data Model |
Open a CSV in Excel with Data > Get Data > From Text/CSV
Skip the double-click and import the file instead. This works for any CSV, including rows.page exports, which are UTF-8 without a BOM.
- In a blank workbook, choose Data > Get Data > From File > From Text/CSV (some ribbons show Data > From Text/CSV directly).
- Pick the
.csvfile and open it. - In the preview, set File Origin to 65001: Unicode (UTF-8) and check that accented characters look right.
- Check the Delimiter. Excel detects it, but you can pick Comma, Semicolon, Tab or another character.
- To keep leading zeros, long IDs and date-like codes, set Data Type Detection to Do not detect data types, which loads every column as Text.
- To change only some columns, select Transform Data instead, click the type icon in each ID, ZIP or code column header and choose Text. If Excel asks, choose Replace current so the original text is kept.
- Select Load (Close & Load in the editor), then save the workbook as Excel Workbook (
.xlsx) with File > Save As.
Saving as .xlsx matters: a .csv stores plain text only, so the column types you set are lost if you save back to CSV.
When the CSV is too big or messy for Excel: trim it in rows.page
An Excel sheet holds 1,048,576 rows by 16,384 columns. For a bigger file, or one you want to clean first, open it in rows.page: it's free, needs no account and reads the file inside your browser with DuckDB-WASM.
CSV and TSV files up to 1.5 GB open in full, and a bigger file loads partially with the note "Loaded the first N rows: the file is X, more than the browser can hold." The sniffer detects comma, semicolon, tab and pipe delimiters and the header row. A file that isn't UTF-8 is read as Latin-1, unless it holds Windows-only characters such as the euro sign or curly quotes, in which case it doesn't open.
Narrow the rows with the filter box (country:NL, price:>20, or -name:* for empty values) or by clicking a histogram bar in the Columns panel. To aggregate, type SQL into the same box; the table is called data:
SELECT country, status, count(*) AS orders, sum(total) AS revenue
FROM data
WHERE status != 'cancelled'
GROUP BY country, status
ORDER BY revenue DESCA SQL result shows and exports up to 1,000,000 rows, which fits in one sheet, while a filtered view exports every matching row. To keep every row inside Excel instead, choose Load To in the From Text/CSV dialog, pick Only Create Connection and tick Add this data to the Data Model.
Formula-safe CSV exports from rows.page
rows.page doesn't write .xlsx files. It exports your filtered view or SQL result as a CSV that Excel imports cleanly:
- Comma-delimited with a header row.
- UTF-8 without a BOM, so use the File Origin step above; there is no option for another delimiter, encoding or a BOM.
- Text cells that start with
=,+,-,@, a tab or a carriage return get a leading apostrophe so Excel doesn't run them as formulas. - Filtered views export every matching row; SQL results stop at 1,000,000 rows.
To hand over the data without a spreadsheet, press Share ("Upload and get a link") or push the file from a terminal. One push is capped at 100 MB, and the link expires after 7 days unless you press Keep it on the dataset page.
curl -T data.csv https://rows.pageConvert CSV to .xlsx without Excel: DuckDB or pandas
To produce an .xlsx file in a script, DuckDB 1.2 and later writes one with its excel extension. This keeps a long order ID as text so Excel can't round it:
INSTALL excel;
LOAD excel;
COPY (
SELECT * REPLACE (CAST(order_id AS VARCHAR) AS order_id)
FROM read_csv('data.csv')
) TO 'data.xlsx' (FORMAT xlsx, HEADER true);DuckDB keeps a ZIP code such as 02134 as text on its own, and it refuses to write more than 1,048,576 rows to a sheet, header row included. In pandas (pip install pandas openpyxl), pass dtype for the columns that must stay text:
import pandas as pd
df = pd.read_csv('data.csv', dtype={'zip': str, 'order_id': str})
df.to_excel('data.xlsx', index=False)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
Why do my 16-digit order IDs end in zeros in Excel?
Excel keeps 15 significant digits, so digits from the 16th on become 0 when the column loads as a number. Import the CSV with Data > Get Data > From Text/CSV and load the ID column as Text.
Why does Excel show é instead of é when I open a CSV?
The file is UTF-8 without a BOM, and Excel read it with another encoding on a double-click. Import it with Data > Get Data > From Text/CSV and choose 65001: Unicode (UTF-8) under File Origin.
Can rows.page export an .xlsx file?
No. rows.page does not read or write .xlsx or .xls files. It exports CSV (comma-delimited, UTF-8 without a BOM), Parquet, JSON, JSONL or Markdown (first 1,000 rows), and you save the CSV as .xlsx in Excel.
How do I open a CSV with more than 1,048,576 rows?
A sheet can't hold more. Load the file into Excel's Data Model (Load To, Only Create Connection, Add this data to the Data Model), or open it in rows.page, which reads CSV files up to 1.5 GB, and export a filtered or aggregated CSV that fits.
Does rows.page upload my CSV when I open it?
No. Opening a file is free, needs no account and happens inside your browser with DuckDB-WASM. The file is uploaded only if you press Share or push it with curl or the MCP server.