XLTM to CSV

Nothing you choose here leaves your browser, and nothing is downloaded to make it work. An XLSX is a ZIP of XML; your browser already does the unzipping, and this page reads the rest.

…or drop one anywhere on this page.

A macro-enabled TEMPLATE is a workbook. This reads it as one.

A .xlsm is an .xlsx with one extra part in it — vbaProject.bin, the macro project. The sheets are identical, which is why this page needed nothing written for it. The macros are never read and never run: a macro is a program, and a program that arrived in a spreadsheet is the commonest way an office network is attacked. What you download has none. A template differs from an ordinary workbook only in the content type recorded inside the package, which tells Excel to start a new file from it rather than edit it in place. The sheets are the sheets.

A date in a spreadsheet is a number, and that is where it goes wrong

There is no date type in a spreadsheet. The 15th of January 2026 is stored as 46037 — the number of days since the end of 1899 — and the only thing that marks it as a date rather than a quantity is a style index pointing at a number format somewhere else in the file. A converter that does not read the styles writes 46037 into your output, and it looks like data rather than like a fault.

This page reads the styles. It also knows that Excel believes 1900 was a leap year — it was not, but Lotus 1-2-3 thought so and files had to keep working — so dates before March 1900 are handled rather than being a day out.

How this was checked

Four real spreadsheets were read and every value compared against openpyxl, which is a completely separate implementation: 1,818 cells, zero mismatches. Two of the files were written by openpyxl, one was written by Excel and downloaded, and one was built by hand to exercise shared strings — because those three store text in three different ways and a reader that handles one works perfectly on whichever files its author happened to have.

Files written by this page were opened with openpyxl and checked with the unzip command. What has not been done is opening one in Excel itself, which is not available here — so if you are producing something important, open it once before relying on it.

What it will not do

It reads .xlsx, which is the format Excel has written since 2007. It does not read the older .xls, which is a completely different binary format, nor .ods. It does not open password-protected or encrypted workbooks, and it says so rather than failing obscurely.

It does not calculate. A formula is converted as the value it last calculated to, because that is what is stored in the file — a workbook saved without calculating gives you blanks, and that is the file's doing rather than this page's.

Where to go next