如何使用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
相关产品推荐
相关产品推荐

