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

