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

JavaScript解析Excel文件时如何逐行读取单元格值并赋值给变量

问题说明

你目前基于jQuery、JSZip、xlsx库编写了前端代码,实现上传Excel文件后将表格内容解析为JSON格式并输出到文本域的功能,现有完整代码如下:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script>
  var ExcelToJSON = function() {

    this.parseExcel = function(file) {
      var reader = new FileReader();

      reader.onload = function(e) {
        var data = e.target.result;
        var workbook = XLSX.read(data, {
          type: 'binary'
        });
        workbook.SheetNames.forEach(function(sheetName) {
          var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
          var json_object = JSON.stringify(XL_row_object);
          console.log(JSON.parse(json_object));
          jQuery('#xlx_json').val(json_object);
        })
      };

      reader.onerror = function(ex) {
        console.log(ex);
      };

      reader.readAsBinaryString(file);
    };
  };

  function handleFileSelect(evt) {
    var files = evt.target.files;
    var xl2json = new ExcelToJSON();
    xl2json.parseExcel(files[0]);
  }
</script>

<form enctype="multipart/form-data">
  <input id="upload" type=file name="files[]">
</form>

<textarea class="form-control" rows=35 cols=120 id="xlx_json"></textarea>

<script>
  document.getElementById('upload').addEventListener('change', handleFileSelect, false);
</script>

你需要实现逐行读取Excel解析后每一行字段值的功能,逻辑和熟悉的C实现一致,参考C示例代码如下:

void read(string fileName) {
    // assume int a,b,c are already declared
    // assuming first row of parsed data is vector
    for (int i = 0; i < rows.size(); i++) {
        a = vector[i][0];
        b = vector[i][1];
        c = vector[i][2];
        // code for thing I am doing here(doesnt matter)
    }
}

核心需求是遍历所有行数据,按列索引将每行对应位置的单元格值赋值给预先定义的变量,需要JavaScript侧的对应实现方案。

实现方案

JavaScript完全可以实现和上述C++逻辑完全一致的逐行按索引取值能力,核心是调整xlsx库的解析输出格式:

  • 你当前使用的sheet_to_row_object_array方法会把每行解析为以表头为键的对象,无法直接通过数字索引取列值,只需要更换解析配置,让库直接输出二维数组结构即可,和C++的vector嵌套结构完全对应。
  • 具体做法是调用sheet_to_json方法时传入配置项{header: 1},返回结果的外层数组对应所有行,内层每个数组对应一行的单元格值,列索引从0开始,和你C++里的访问逻辑完全匹配。

修改后的核心解析代码如下:

this.parseExcel = function(file) {
  var reader = new FileReader();

  reader.onload = function(e) {
    var data = e.target.result;
    var workbook = XLSX.read(data, {
      type: 'binary'
    });
    workbook.SheetNames.forEach(function(sheetName) {
      // 关键配置:header:1 输出二维数组,支持行列数字索引访问
      var rowList = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], { header: 1 });
      
      // 预先定义需要赋值的变量
      let a, b, c;
      // 遍历逻辑和C++完全一致
      for (let i = 0; i < rowList.length; i++) {
        // 可选:跳过空行
        if (!rowList[i] || rowList[i].length === 0) continue;
        
        // 按列索引取值赋值
        a = rowList[i][0]; // 第i行第1列
        b = rowList[i][1]; // 第i行第2列
        c = rowList[i][2]; // 第i行第3列
        
        // 后续编写你的业务逻辑即可
        console.log('当前行取值:', a, b, c);
      }

      // 原有输出JSON到文本域的逻辑可以保留
      var json_object = JSON.stringify(rowList);
      jQuery('#xlx_json').val(json_object);
    })
  };

  reader.onerror = function(ex) {
    console.log(ex);
  };

  reader.readAsBinaryString(file);
};

补充说明

  • 如果Excel第一行是表头不需要参与业务遍历,循环初始值设为i=1即可,和C++处理方式一致。
  • 如果某行列数不足你访问的索引,对应变量会被赋值为undefined,可以根据业务需要加判空逻辑。
  • 如果不想修改原有sheet_to_row_object_array的解析逻辑,也可以遍历每行对象时通过Object.values(当前行对象)拿到值数组再按索引访问,但这种方式依赖对象键的遍历顺序,稳定性不如直接输出二维数组的方案,优先推荐前者。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:30:57