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

如何使用xlsx包获取Excel非表头单元格的类型?

获取Excel单元格原始类型的解决方案

默认的sheet_to_json方法会自动转换单元格值,丢失原始类型信息。要获取除表头外所有单元格的类型,需要直接操作工作表的单元格对象,利用xlsx库提供的单元格元数据来实现。

核心思路

工作表对象(ws)中的每个单元格都包含t属性,该属性标记了单元格的原始类型。结合工作表的范围信息,跳过表头行后遍历所有数据行,即可提取每个单元格的类型。

代码实现

import * as XLSX from 'xlsx';

const wb = XLSX.read(data, { type: 'binary' });
const ws = wb.Sheets['Sheet'];

// 解析工作表的单元格范围
const range = XLSX.utils.decode_range(ws['!ref']);
const headerRowIndex = range.s.r; // 表头行的索引(默认从0开始)
const dataStartRow = headerRowIndex + 1; // 数据行的起始索引

const cellTypeList = [];

// 遍历所有数据行
for (let row = dataStartRow; row <= range.e.r; row++) {
  const rowTypeMap = {};
  // 遍历当前行的所有列
  for (let col = range.s.c; col <= range.e.c; col++) {
    // 生成单元格地址(如A2、B3)
    const cellAddr = XLSX.utils.encode_cell({ r: row, c: col });
    const cell = ws[cellAddr];

    if (cell) {
      // 获取当前列对应的表头字段名
      const headerCellAddr = XLSX.utils.encode_cell({ r: headerRowIndex, c: col });
      const fieldName = ws[headerCellAddr].v;

      // 映射单元格类型为可读文本
      let cellType;
      switch (cell.t) {
        case 's': cellType = '字符串'; break;
        case 'n': cellType = '数字'; break;
        case 'b': cellType = '布尔值'; break;
        case 'd': cellType = '日期'; break;
        case 'z': cellType = '空值'; break;
        default: cellType = '未知类型';
      }

      rowTypeMap[fieldName] = cellType;
      // 可选:同时保留单元格原始值
      // rowTypeMap[fieldName] = { value: cell.v, type: cellType };
    }
  }
  cellTypeList.push(rowTypeMap);
}

console.log(cellTypeList);

单元格类型对应说明

  • 's': 字符串类型
  • 'n': 数字类型(包含整数、浮点数)
  • 'b': 布尔值类型(true/false)
  • 'd': 日期类型(内部存储为数字,xlsx会自动解析为Date对象)
  • 'z': 空单元格类型

补充提示

如果你的表头行不是默认的第0行,可手动修改headerRowIndex的值。若需要同时保留单元格的原始值和类型,可使用代码中注释的赋值逻辑替换当前的类型赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 09:20:03