Excel to HTML, with markup that is actually accessible
This converter reads a sheet from an .xlsx workbook and writes an HTML table with the structure a table is supposed to have: <thead> and <tbody>, <th scope="col"> on every header cell, and a <caption> prefilled from the sheet name. Most converters in this space emit <tr> and <td> and nothing else, which renders in a browser and is not accessible. Merged cells come through as colspan and rowspan, so they survive here and are lost in Markdown, JSON and SQL. Ampersands are escaped before angle brackets, which is the ordering that prevents double-escaped output. The file is never uploaded.
One option is deliberately off. <th scope="row"> turns the first column into row headers, and whether that column really labels its rows is a question about what the data means rather than how it is shaped. The file cannot answer it. A column of names might be row headers and might be ordinary data, so offering the switch is right and assuming it is not. Turn it on when you know it is true.
Five characters need care and two of them are conditional. &, < and > are escaped everywhere. Quotes are escaped inside attribute values and left alone in text content, because escaping them there puts visible entity codes on the rendered page. Order matters more than the list does. Escape the ampersand first, or escaping < to < and then escaping ampersands turns your own output into &lt;. That is the classic double-escape bug and the ordering is the entire fix.
A cell containing a script tag is escaped and lands in the output as visible text. The preview on this page never injects cell content as live markup, so nothing in your file is ever executed. There are fewer warnings here than on the sibling converters, and that is correct rather than a gap: HTML constrains less than SQL or JSON, so duplicate headers are fine and need no message, and ragged rows are padded and counted. Dates are formatted from the serial numbers Excel stores, where 45292 is 2024-01-01. The Excel serial date converter explains that numbering.