table_to_book导出时数字和日期变文本,需手动遍历worksheet修正cell.t与cell.v类型:日期设t='d'并v转date对象,纯数字设t='n',前导零编码设t='s'且z='@'。

table_to_book 是最直接的起点,但别急着调用——它默认把所有 <th> 和 <code><td> 当成字符串,日期、数字、带前导零的编码(如 PSN、箱号)全会变成文本,Excel 打开后左上角带绿色小三角,后续筛选/公式全失效。<hr>
<h3>
<code>table_to_book 导出时数字和日期变文本怎么办
- 默认行为:SheetJS 从 DOM 解析
<table> 时,对单元格内容只做 <code>.innerText提取,不识别语义,"2023-05-12"、"00123"、"1.5E6"全进cell.t = 's'(字符串类型) - 正确做法:导出前手动遍历
ws,按列或内容规则修正类型 - 常见修复逻辑:
- 检查列名是否含 “日期”、“Date”、“Code”,匹配正则
/^\d{4}-\d{2}-\d{2}$/或/^\d{4}\/\d{2}\/\d{2}$/→ 设cell.t = 'd'+cell.z = 'yyyy-mm-dd' - 检查内容是否为纯数字且无小数点/科学计数法 → 设
cell.t = 'n' - 检查内容以
"0"开头且长度 > 1(如"00123")→ 保留t = 's',但加cell.z = '@'(文本格式),防止 Excel 自动转义
- 检查列名是否含 “日期”、“Date”、“Code”,匹配正则
- 示例片段:
const ws = XLSX.utils.table_to_book(document.getElementById('table'))['Sheet1']; for (let R = 1; R - 错误现象:上传的 Excel 文件里中文显示为
???,或表头偏移一列,PSN列数据跑到箱号下 - 根本原因:没指定
type: 'binary'或type: 'array',浏览器用默认编码读取 ArrayBuffer,破坏原始字节流 - 必须写法:
- 用
FileReader读取时,必须调fr.readAsArrayBuffer(file),不能用readAsText - 传给
XLSX.read时,必须加{ type: 'array' }(推荐)或{ type: 'binary' }
- 用
- 额外注意:如果后端返回的是 base64 字符串,要用
atob转回二进制再new Uint8Array,不能直接传 base64 给read -
table_to_book只生成单 sheet,且丢弃所有样式、合并、列宽信息 -
table_to_sheet返回单个Worksheet对象,可手动注入到新建Workbook中,适合:- 需要多 sheet:自己创建多个
Worksheet,再用XLSX.utils.book_new()+XLSX.utils.book_append_sheet() - 需要控制列宽:
ws['!cols'] = [ { wpx: 120 }, { wch: 20 } ] - 需要合并单元格:
ws['!merges'] = [ { s: { r: 0, c: 0 }, e: { r: 0, c: 2 } } ]
- 需要多 sheet:自己创建多个
- 但注意:
table_to_sheet同样不解析语义,仍需手动修类型;而且它不处理<thead>/</thead> <tbody> 结构差异,默认把所有行当数据行,表头需额外标记或截断<hr> <p>导出时最容易被跳过的一步,是确认 <code>cell.v的值类型是否与cell.t匹配。比如把字符串"2023-05-12"的t改成'd'却不改v成Date对象,Excel 会直接显示NaN。这个细节在调试时几乎不会报错,只会静默失败。
Excel XLSX Formula Cleanup下载诊断并修复涉及公式、命名范围、Power Query 刷新、数据透视表、VBA/宏保存等问题的 Microsoft Excel XLSX 工作簿
readFile 和 read 导入时中文乱码或字段错位
多 sheet、合并单元格、样式导出要不要用 table_to_sheet 替代 table_to_book
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










