Convert XML to Excel (XML to XLSX)
This free XML to Excel converter turns XML into a real .xlsx workbook entirely in your browser. Paste your XML or upload an .xml file, check the preview, and download the sheet. Nothing leaves your device, and there is no sign-up.
XML is a tree; a worksheet is a rectangle. So a conversion is really a set of decisions: which repeating element becomes the rows, whether a child element becomes a column of its own or a dotted path, whether an id="…" attribute becomes a column, what happens to a ns: prefix, and what to do with a record that has fewer fields than its neighbours. A generic file converter turns .xml into .xlsx without ever telling you which of those it chose — which is how a file with hundreds of records comes out as one enormously wide row. This page makes every one of those decisions explicit, in the report under the preview, before you download.
How to use this XML to Excel converter
- Paste your XML into the box, or upload an
.xmlor.txtfile. - Check Rows come from. The page scans the whole document, finds every element path that repeats, and preselects the best candidate. Change it in one click if your records live somewhere else.
- Choose whether Namespace prefixes are stripped (
name) or kept (ns:name), and whether Attributes become their own@idcolumns. - Decide how Repeated siblings land: indexed columns
tag[1],tag[2], or joined into one cell. And whether Mixed text — text sitting next to child elements — is kept in a#textcolumn or dropped. - Pick whether Values stay text (leading zeros and long IDs are safe) or numeric-looking cells are written as numbers. Set a Sheet name.
- Read How this table was built, then press Convert to Excel and Download .xlsx.
Why the row element is the whole conversion
Most real XML does not put its records at the top level. An API response usually looks like this:
<response> <!-- one child -->
<data> <!-- still one child -->
<records>
<record>…</record> <!-- the actual rows, three levels down -->
<record>…</record>
</records>
</data>
</response>
A converter that only inspects the top level sees a single <data> child, finds nothing repeating, gives up, and produces one very wide row. This page walks the entire document instead, collects every element path that repeats, and scores each one — preferring a path that carries structure of its own (child elements or attributes) over a path that is merely a repeated piece of text. Frequency alone is not enough: in <item><tag>a</tag><tag>b</tag></item> the inner tag appears more often than item, but item is the record. Every candidate and its score is listed in the report, and the selector lets you override the choice.
What this tool supports
Nested elements, attributes and namespaces
| In your XML | Becomes |
|---|---|
<dimensions><width>30</width></dimensions> | a column named dimensions.width — nested elements are flattened with dot notation |
<book id="b1"> | a column named @id — attributes are promoted, or ignored if you prefer |
<ns:title> | title with prefixes stripped (the default), or ns:title if you keep them |
xmlns:ns="…" | never a column — namespace declarations are not data |
<tag>a</tag><tag>b</tag> | tag[1] and tag[2], so a row with only one tag stays aligned |
<note>Hello <b>world</b></note> | Hello in a note.#text column, world in note.b — text next to elements is not thrown away |
Ragged records become a rectangle
Real exports are uneven: one record has a note, the next does not; one has three tags, the next has one. The column set is the union of every record, and a record missing a field gets an empty cell rather than a shifted row — so sorting and filtering in Excel behave. The report tells you how many records were padded and how many cells were filled in.
Every structural decision is named
Under the preview, How this table was built lists the row element that was chosen and why, every candidate path with its repeat count, how many columns came from elements versus attributes versus #text, which namespace prefixes were stripped, which sibling groups were indexed, and how many records were padded. If the sheet does not look the way you expected, the reason is written down instead of hidden.
Values, and why they default to text
XML has no type system — <id>007</id> is text, and turning it into the number 7 loses the leading zeros that fixed-width IDs depend on. So every cell is written as text by default, and the report counts the numeric-looking cells it left alone. Switch Values to Numbers as numbers when the columns really are numeric and you want to run SUM on them; leading-zero and very long values still stay text so nothing is silently mangled.
What this tool does not do
- It does not run an XSLT transform. This is a structural conversion — repeating elements to rows, children to columns — not a stylesheet engine.
- It does not split one record into several rows. If a record contains two independent repeating groups, the columns are indexed side by side rather than expanded into extra rows. The report names the groups it indexed so you can see it happen.
- It does not carry formatting. The workbook gets a plain header row and the data; fonts, colours and column widths from the original system are not in the XML to begin with.
- It does not read a DTD or schema. Element names come from the document as it is written.
- It does not batch. One document at a time, because there is no server queue to batch on.
Frequently asked questions
Is this XML to Excel converter free?
Yes. No account, no sign-up, no conversion limit and no file-size cap — the workbook is built in your browser.
My XML converted to one row. Why?
Because the repeating record element was not found, so the whole document became a single row. Open Rows come from and pick the element that actually repeats — usually the one that appears once per record, three or four levels down. The report lists every repeating path with its count, so the right one is visible.
Is my XML uploaded anywhere?
No. The file you pick is read with the browser's own File API and converted in the page. There is no request that carries your data.
How are attributes handled?
By default each attribute becomes its own column, named @ plus the attribute name — <book id="b1"> gives a column @id. Set Attributes to Ignore to leave them out. Namespace declarations (xmlns) are never treated as data.
What happens to namespace prefixes like ns:title?
They are stripped by default, so the header reads title. Switch to Keep if the prefix matters to you. The report names every prefix it found and how often it occurred.
How are nested elements handled?
They are flattened with dot notation: <dimensions><width>30</width></dimensions> becomes a column dimensions.width. Nothing is discarded — every leaf path in the record becomes a column.
What about an element that appears more than once inside one record?
By default each occurrence gets an indexed column — tag[1], tag[2] — so a record with only one tag still lines up under tag[1]. Switch Repeated siblings to Join into one cell if you would rather see them together, separated by a pipe.
Are numbers written as numbers?
Not by default — every cell is text, which keeps 007 and 18-digit IDs intact. Change Values to Numbers as numbers when you want Excel to treat numeric columns as numeric. Leading-zero values and values longer than 15 digits always stay text.
What if my records have different fields?
The column set is the union of every record, and a record without a field gets an empty cell. The report tells you how many records were padded, so a genuinely uneven file is visible rather than surprising.
Does it handle CDATA and entities?
Yes. CDATA content is read as plain text and appears in its column, and standard XML entities such as & are resolved by the browser's own XML parser.
Is there a file size limit?
There is no imposed limit. The workbook is built in your browser's memory, so very large documents depend on your device. Typical API responses and exports convert in a moment.
What if I need another format?
For comma-separated output use XML to CSV, for JSON use XML to JSON, and to go the other way use JSON to Excel or CSV to Excel.