后台要导报表,前端要解析用户上传的表格,第一方案多半是 js-xlsx,也就是 SheetJS 的社区版。npm 项目里 npm install xlsx 装包,纯浏览器页面引一个 script 文件就能用,不依赖后端。它的 API 不算优雅,但胜在稳,示例多,遇到问题基本能搜到现成答案。

读取文件拿数据

上传框拿到 File 对象后转成 ArrayBuffer,交给 XLSX.read 解析,再从工作簿里挑 sheet 转成 JSON 数组:

const wb = XLSX.read(data, {type: 'array', cellDates: true});  const ws = wb.Sheets[wb.SheetNames[0]];  const rows = XLSX.utils.sheet_to_json(ws, {defval: ''});

cellDates 设为 true,日期列会转成 Date 对象,否则读到的是一串日期序列号。defval 把空单元格补成空串,每行的字段就能对齐,不然某行少一列,遍历时要自己判空。File 对象用 FileReader 的 readAsArrayBuffer 读出数据,记得在 onload 里再处理。

导出成 xlsx 文件

const ws2 = XLSX.utils.json_to_sheet(rows);  const wb2 = XLSX.utils.book_new();  XLSX.utils.book_append_sheet(wb2, ws2, '报表');  XLSX.writeFile(wb2, '导出结果.xlsx');

writeFile 在浏览器里触发下载,在 Node 里直接落盘。要调列宽就给 ws2 加 !cols 数组,要合并单元格用 !merges,都是往 sheet 对象上挂属性。

几个容易翻车的点

  • 合并单元格只有左上角有值,其余格子读出来是空,需要按 range 自己补。
  • 带公式的列默认拿到的是上次保存时的缓存结果,不是公式本身。
  • 几万行的大表解析偏慢,超大数据量放服务端处理,前端只做展示。

取舍很直接:中小数据量的导入导出,js-xlsx 够用也省事;要复杂样式、图表、几十万行,换后端组件或者上商业版。