You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

xlsx-js-style导出Excel在Vercel生产环境损坏无法打开

问题:Excel导出功能本地正常,部署到Vercel生产环境后文件无法打开

我使用基于SheetJS分支的xlsx-js-style库结合file-saver实现Excel文件导出,本地开发环境运行正常,但部署到Vercel等生产环境后,下载的Excel文件无法打开,打开时提示文件损坏。

错误截图:
打开文件错误截图

代码片段:

import { utils, WorkSheet, write } from "xlsx-js-style";
import { saveAs } from "file-saver";

const exportToCSV = () => {
  // 初始化工作簿
  const wb = utils.book_new();

  // 遍历数据,为每个对象创建工作表
  Object.keys(sObjectsWithDetailsData).forEach((key) => {
      if (!sObjectsWithDetailsData[key]) return;

      // 处理行数据
      const rows = sObjectsWithDetailsData[key]?.map((row) => ({
          "R/O": row.updateable ? "✓" : "☐",
          R: !row.nillable ? "*" : "",
          label: row.label ?? "",
          name: row.name ?? "",
          fieldDescription: row.fieldDescription ?? "",
          inlineHelpText: row.inlineHelpText ?? "",
          custom: row.custom ?? false,
          externalId: row.externalId ?? false,
          type: row.type ?? "",
          calculatedFormula: row.calculatedFormula ?? "",
          picklistValues:
              row.picklistValues
                  ?.map((picklist) => picklist.label)
                  .join("\n") ?? "",
      }));

      const ws = utils.json_to_sheet(rows ?? []);

      // 修改表头名称
      utils.sheet_add_aoa(
          ws,
          [
              [
                  "R/O",
                  "M",
                  "Label",
                  "API Name",
                  "Description",
                  "HelpText",
                  "Is Custom",
                  "Is External ID",
                  "Type",
                  "Formula Text",
                  "Picklist Values",
              ],
          ],
          {
              origin: "A1",
          }
      );

      utils.book_append_sheet(wb, ws, key);
  });

  // 执行导出
  const wbout = write(wb, { bookType: "xlsx", type: "binary" });
  saveAs(
      new Blob([s2ab(wbout)], { type: "application/octet-stream" }),
      "test.xlsx"
  );
};

解决方案

1. 补充s2ab函数实现

代码中调用了s2ab但未定义该函数,生产环境会因函数缺失导致Blob内容错误,添加以下二进制转换函数:

function s2ab(s) {
  const buf = new ArrayBuffer(s.length);
  const view = new Uint8Array(buf);
  for (let i = 0; i < s.length; i++) {
    view[i] = s.charCodeAt(i) & 0xFF;
  }
  return buf;
}

2. 使用标准Excel MIME类型

将Blob的type改为xlsx文件对应的标准MIME类型,避免系统识别错误:

saveAs(
  new Blob([s2ab(wbout)], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }),
  "test.xlsx"
);

3. 改用arraybuffer类型导出(推荐)

跳过二进制字符串转换步骤,直接使用arraybuffer类型生成文件,减少编码异常概率:

// 修改导出部分代码
const wbout = write(wb, { bookType: "xlsx", type: "arraybuffer" });
saveAs(
  new Blob([wbout], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }),
  "test.xlsx"
);

4. 检查生产环境打包配置

Vercel的打包工具可能对xlsx-js-style进行tree shaking,导致核心功能代码被误删,可修改导入方式为完整导入:

import * as XLSX from 'xlsx-js-style';
// 使用时替换为XLSX.utils、XLSX.write等

内容的提问来源于stack exchange,提问作者xTchan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:01:24