Excel (.xlsx / .xlsm) → Darwin Core Archive
What you are seeing — your records are in a workbook and every publishing route seems to assume they are already in Darwin Core.
A Darwin Core Archive is a zip file containing a delimited text table of your records, a meta.xml that says which column is which Darwin Core term, and an eml.xml describing the dataset. The hard part is not the zip — it is deciding what each of your columns means, and that decision is the one that has to be right.
A workbook converts cleanly when it is one table: a single header row at the top, one record per row, no merged cells, no totals row at the bottom, and no blank spacer rows. Anything else is a layout, and a layout has to become a table before it can become anything else.
Four habits cost data. Merged cells mean the value belongs to the first cell and the others are empty, so a species name merged across five rows arrives on one row and blank on four. Units in the header — depth (m) — leave the unit outside the data, where nothing downstream can read it. Colour as meaning is invisible in every export format there is. Multiple sheets that are really one table split by year or site: whatever distinguishes the sheets is in the tab name, and a tab name is not a column. We refuse parallel sheets rather than concatenating them, because concatenating loses exactly that.
We read .xlsx and .xlsm. We do not read the older .xls or the binary .xlsb, and we refuse them by name rather than failing obscurely — open those in Excel or LibreOffice once and save as .xlsx.
You do not need to rename a single column first. We check each one against its own values, build the archive, and hand back an explicit list of everything we could not interpret — including the sheets and columns we deliberately set aside. Free until 1 September, no account, and your records are discarded after the check — we keep the column mapping, never the rows.
Check the file you have →We audited a file GBIF had already accepted and served. Their validator answers will this load; these had loaded. Figures read from ops/data.json, not typed into this page. We do not issue a rating of any kind — every finding names the rule it applied and where that rule comes from.