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

如何让ExcelJs读取CSV时将所有值按文本格式解析?

问题描述

原始代码

import exceljs from "exceljs";
import { log } from "node:console";

const { Workbook } = exceljs;
const workbook = new Workbook();

const file = 'files/simpleNameValues.csv';
const worksheet = await workbook.csv.readFile(file);
worksheet.eachRow((row, rowNumber) => {
    log(row.values);
});

CSV文件内容

vessel_name,voyage_no
CMA CGM Mumbai,C2901R
OOCL Montreal,81E2

遇到的问题

解析CSV时,81E2被自动识别为科学计数法,转换为数字8100。即使给CSV中的81E2添加双引号,结果仍未改变。尝试配置parserOptions: { raw: true }也无效,需要实现让ExcelJS将所有值按纯文本格式解析。


解决方案

要避免ExcelJS自动转换科学计数法格式的内容,可通过自定义parserOptions.valueConverters覆盖默认类型转换逻辑,强制保留原始字符串:

import exceljs from "exceljs";
import { log } from "node:console";

const { Workbook } = exceljs;
const workbook = new Workbook();

const file = 'files/simpleNameValues.csv';
const worksheet = await workbook.csv.readFile(file, {
  parserOptions: {
    valueConverters: {
      // 针对识别为数字的单元格,返回原始字符串
      number: (value, context) => context.rawValue,
      // 其他类型保持原有值
      default: (value) => value
    }
  }
});

worksheet.eachRow((row, rowNumber) => {
    log(row.values);
});

说明

  • ExcelJS默认会自动推断CSV单元格的数据类型,81E2会被判定为科学计数法数字并转换为8100。
  • valueConverters中的number转换器通过context.rawValue获取CSV中的原始字符串内容,直接返回即可保留81E2的文本格式。
  • 若CSV中存在布尔值,可额外添加boolean转换器,将其转为字符串:
    boolean: (value) => value.toString()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:06:11