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

React应用中XLSX文件导入修改导出(保留格式)方案问询

解决方案

一、修复ExcelJS在React浏览器环境的报错问题

你遇到的Cannot read properties of undefined (reading 'F_OK')报错,是因为readFile是ExcelJS专为Node.js环境提供的API,浏览器无法直接读取本地文件路径。改用浏览器兼容的读取方式即可解决:

1. 读取项目同目录下的静态Excel文件

import ExcelJS from "exceljs";

const loadAndModifyStaticExcel = async () => {
  const workbook = new ExcelJS.Workbook();
  // 通过fetch获取文件并转为ArrayBuffer
  const response = await fetch("./PAT_report.xlsx");
  const arrayBuffer = await response.arrayBuffer();
  // 用兼容浏览器的read方法读取
  await workbook.xlsx.read(arrayBuffer);

  // 获取指定工作表(索引1对应第二个工作表,SheetNames从0开始计数)
  const worksheet = workbook.getWorksheet(1);
  // 修改F12单元格的值
  worksheet.getCell("F12").value = 100;

  // 导出修改后的文件
  const buffer = await workbook.xlsx.writeBuffer();
  const blob = new Blob([buffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
  const url = window.URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = "modified_export.xlsx";
  a.click();
  window.URL.revokeObjectURL(url);
};

2. 读取用户上传的本地Excel文件

如果需要支持用户上传文件修改,可参考以下代码:

// 假设页面有<input type="file" id="excelUpload" accept=".xlsx" />
const fileInput = document.getElementById("excelUpload");
fileInput.addEventListener("change", async (e) => {
  const file = e.target.files[0];
  if (!file) return;

  const workbook = new ExcelJS.Workbook();
  // 直接读取File对象
  await workbook.xlsx.read(file);

  // 修改单元格逻辑与上方一致
  const worksheet = workbook.getWorksheet(1);
  worksheet.getCell("F12").value = 100;

  // 导出下载
  const buffer = await workbook.xlsx.writeBuffer();
  const blob = new Blob([buffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
  const url = window.URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = `modified_${file.name}`;
  a.click();
  window.URL.revokeObjectURL(url);
});

ExcelJS原生支持保留原文件的样式,修改后导出不会丢失格式,完全符合你的需求。

二、备选免费方案:xlsx-style(SheetJS分支)

xlsx-style是你之前尝试的xlsx库的分支,专门补充了样式读写能力,用法和原生xlsx高度兼容:

安装依赖

npm install xlsx-style --save

示例代码

import * as XLSX from "xlsx-style";

const loadAndModifyExcel = async () => {
  const response = await fetch("./PAT_report.xlsx");
  const workbookArrayBuffer = await response.arrayBuffer();
  const workbook = XLSX.read(workbookArrayBuffer, { type: "array" });

  const sheetName = workbook.SheetNames[1];
  const worksheet = workbook.Sheets[sheetName];

  // 修改单元格值
  worksheet["F12"].v = 100;
  // 可选:修改单元格样式(例如设置红色字体)
  // worksheet["F12"].s = { font: { color: { rgb: "FF0000" } } };

  // 导出时保留样式
  const modifiedBuffer = XLSX.write(workbook, { type: "array", bookType: "xlsx" });
  const blob = new Blob([modifiedBuffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
  
  // 下载逻辑
  const url = window.URL.createObjectURL(blob);
  const a = document.createElement("a");
  a.href = url;
  a.download = "modified_export.xlsx";
  a.click();
  window.URL.revokeObjectURL(url);
};

注意:该库维护活跃度较低,但对于简单的样式保留和单元格修改场景足够稳定。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:10:30