File formats
Detection is by filename:
.xlsx/.xls/.xlsb/.ods→ workbook path (with multi-sheet picker when needed).tsv/.tab→ tab-delimited.json→ array of objects (or{ rows: [...] })- otherwise → delimited text (CSV)
XML is not parsed. JSON is a cheap object-array path, not a nested document mapper. Workbooks use the existing SheetJS dependency (Apache-2.0 community xlsx).
Delimiter detection
For CSV-class files, the first 10 non-empty records are scored for comma, semicolon, tab, and pipe. A quoted cell that spans lines counts as one record, and separators inside it are ignored. The delimiter with the most consistent column count wins, so a title or report row without separators does not force comma and collapse a semicolon or pipe file into one column. That covers US exports (,), many European exports (;), and pipe-delimited dumps (|). UTF-8 BOM on the first header is stripped. UTF-16 LE/BE BOM files are decoded as UTF-16. There is no encoding picker. Bytes that are not valid UTF-8 are decoded as Windows-1252. The map step Separator control can set Auto, comma, semicolon, tab, or pipe for this file. It is not remembered. Delimiter detection and the header-row picker already cover title rows and EU ; files.
Semicolon files also infer European number locale under numberLocale="auto" (for example bare 1.234 as thousands). Override with numberLocale="us" or "eu" when you know the audience.
Schema template
Once fields are known, the upload step can download template.csv in the browser from the local or hosted schema. Headers are field labels, or keys when a label is empty. One example row is filled from field type (email, number, date, enum, boolean, url, string). Same client-side download helper as error export; no server file store. Paste from the clipboard uses the same delimiter detection as a CSV-class file (text/plain, including tab-separated Excel/Sheets copies) and never leaves the browser.
Headers and rows
CSV/TSV use Papa Parse. Empty lines are skipped. Fully blank rows are dropped. Headers are trimmed; blank headers become Column N; duplicate headers become Name (2), etc. The first non-empty row is the default header. If later rows match the schema better (common for Excel title rows), the map step selects that header row and lets the user override.
XLSX uses SheetJS. See Excel.
There is no hard-coded max file size or row count in the package. Very large files are limited by the browser.
Related: Excel · React component · Limits · Validation · CSV vs XLSX