最稳方案是用 SheetJS 的 table_to_book + writeFile,因 data: URI 方案在 Chrome 110+ 和 Safari 中已基本失效,存在长度限制、MIME 弃用、中文乱码、不支持合并单元格等问题。

直接用 table_to_book + writeFile 最稳,别碰 data: URI 方案——Chrome 110+ 和 Safari 已基本不认它,导出的文件常乱码或打不开。
为什么不能用 location.href = "data:application/vnd.ms-excel..."
这个老方案在现代浏览器里问题一堆:
-
data:URI 有长度限制(Chrome 约 2MB,Safari 更严),表格稍大就截断 -
vnd.ms-excelMIME 类型已被弃用,Excel 2016+ 打开时可能报错或丢失格式 - UTF-8 中文默认不生效,即使加了
charset=utf-8,Excel 仍常显示 #VALUE! 或乱码 - 不支持
rowspan/colspan、嵌套<div>、CSS 模拟表格等非标准结构 <h3>用 SheetJS 导出 <code>.xlsx的最小可行代码只引入一个 script,两行 JS,就能导出真正兼容 Excel 的文件:
<script src="https://cdn.sheetjs.com/xlsx-0.20.1/xlsx.full.min.js"></script> <button onclick="exportTable('my-table')">导出 Excel</button>exportTable函数只需这样写:
html-to-pptx-converter下载使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
立即学习“前端免费学习笔记(深入)”;
function exportTable(tableId) { const table = document.getElementById(tableId); if (!table) return; const wb = XLSX.utils.table_to_book(table, { sheet: "数据" }); XLSX.writeFile(wb, "export.xlsx"); }- 必须用
table元素本身(不能是div包裹的伪表格) -
<thead>和<tbody>建议显式写出,否则 SheetJS 可能误判表头 - 如果表格含
<input>或<select>,导出的是当前值(不是 placeholder),但空值会导成空白单元格
导出 CSV 作为轻量替代方案
不需要库,适合纯文本、无样式、大数据量场景:
function exportTableAsCSV(tableId) { const table = document.getElementById(tableId); let csv = ""; for (let row of table.rows) { const cells = Array.from(row.cells).map(cell => `"${cell.innerText.replace(/"/g, '""')}"` // 转义双引号 ); csv += cells.join(",") + "\n"; } const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "export.csv"; a.click(); URL.revokeObjectURL(url); // 及时释放内存 }- 中文必须用
type: "text/csv;charset=utf-8;",否则 Excel 打开是乱码 - 双引号、逗号、换行符要手动转义,不然 CSV 结构会崩
- 不处理合并单元格,所有
<td>都当独立列对待
真正麻烦的不是“怎么导”,而是表格结构本身:如果用了
display: grid或float拼出来的“表格”,SheetJS 读不到任何行列关系——导出前先确认 DOM 是真<table>,不是 div 套 div。 - 必须用


















