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

table_to_book 是最直接的起点,但别急着调用——它默认把所有 <th> 和 <td> 当成字符串,日期、数字、带前导零的编码(如 PSN、箱号)全会变成文本,Excel 打开后左上角带绿色小三角,后续筛选/公式全失效。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
table_to_book 导出时数字和日期变文本怎么办
- 默认行为:SheetJS 从 DOM 解析
<table>时,对单元格内容只做.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 < ws['!ref'].split(':')[1].replace(/\D/g, ''); R++) { const cellA = ws['A' + R]; // 假设 A 列是日期 if (cellA && cellA.t === 's' && /^\d{4}-\d{2}-\d{2}$/.test(cellA.v)) { cellA.t = 'd'; cellA.v = new Date(cellA.v); cellA.z = 'yyyy-mm-dd'; } }
readFile 和 read 导入时中文乱码或字段错位
- 错误现象:上传的 Excel 文件里中文显示为
???,或表头偏移一列,PSN列数据跑到箱号下 - 根本原因:没指定
type: 'binary'或type: 'array',浏览器用默认编码读取 ArrayBuffer,破坏原始字节流 - 必须写法:
- 用
FileReader读取时,必须调fr.readAsArrayBuffer(file),不能用readAsText - 传给
XLSX.read时,必须加{ type: 'array' }(推荐)或{ type: 'binary' }
- 用
- 额外注意:如果后端返回的是 base64 字符串,要用
atob转回二进制再new Uint8Array,不能直接传 base64 给read
多 sheet、合并单元格、样式导出要不要用 table_to_sheet 替代 table_to_book
-
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>/<tbody>结构差异,默认把所有行当数据行,表头需额外标记或截断
导出时最容易被跳过的一步,是确认 cell.v 的值类型是否与 cell.t 匹配。比如把字符串 "2023-05-12" 的 t 改成 'd' 却不改 v 成 Date 对象,Excel 会直接显示 NaN。这个细节在调试时几乎不会报错,只会静默失败。

















