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

React中使用SheetJS读取大型XLSX文件如何获取最后100行数据

问题根源

你当前的代码存在3个核心问题,是导致读取异常、页面崩溃的原因:

  • API调用错误:浏览器端解析ArrayBuffer格式的文件数据应该用XLSX.read(),XLSX.readFile是Node.js环境专属方法,浏览器端调用会存在兼容问题。
  • 配置逻辑完全相反:sheetRows: 100参数的作用是从工作表第一行开始,仅读取前100行内容,加了这个配置你根本拿不到文件末尾的行数据。
  • range硬编码失效:1048576是XLSX格式单工作表的理论最大行号,不是你当前上传文件的实际有效数据末尾行号,直接用这个值作为读取起点,会把该位置到文件末尾的所有空行、冗余脏数据全部解析出来,内存占用过高直接导致页面崩溃。
可行实现方案

核心逻辑是先解析工作表的实际有效数据范围,计算出最后100行的准确位置,再定向读取目标范围的数据,从根源上避免冗余数据解析。
完整可运行代码如下:

const handleFile = async(e) => {
  const file = e.target.files[0];
  if (!file) return;
  const data = await file.arrayBuffer();
  // 读取文件时不要加sheetRows限制,先拿到完整的表结构元数据
  const workbook = XLSX.read(data, { type: 'array' });
  const worksheet = workbook.Sheets[workbook.SheetNames[0]];

  // 解析当前工作表真实的有效数据范围
  const validRange = XLSX.utils.decode_range(worksheet['!ref']);
  const lastRowIndex = validRange.e.r; // 有效数据最后一行的索引(从0开始计数)
  // 计算读取起始位置:取最后100行,文件总行数不足100时从第一行开始读
  const startRowIndex = Math.max(0, lastRowIndex - 99);
  // 构造目标读取范围:列范围保持和原表一致,行范围为计算出的最后100行
  const readRange = {
    s: { r: startRowIndex, c: validRange.s.c },
    e: { r: lastRowIndex, c: validRange.e.c }
  };

  // 仅解析目标范围内的数据
  const jsonData = XLSX.utils.sheet_to_json(worksheet, {
    raw: false,
    range: readRange,
    defval: '' // 空单元格赋值为空字符串,避免出现undefined导致后续渲染报错
  });

  setChartData(jsonData);
}

适配表头场景的补充调整

如果你的工作表第一行是固定表头,需要把表头和最后100行数据一起返回,只需要调整起始行计算逻辑即可:

// 表头固定在第0行的场景:数据行从第1行开始算,取最后100条数据
const dataStartRow = Math.max(1, lastRowIndex - 99);
const readRange = {
  s: { r: 0, c: validRange.s.c }, // 从第0行(表头)开始读
  e: { r: lastRowIndex, c: validRange.e.c }
};

如果是超过100MB的超大型XLSX文件,可以把解析逻辑放到Web Worker中执行,避免主线程阻塞导致页面卡顿。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:51:13