node-xlsx解析含_X2069_的Excel时错误转字符,如何阻止?
如何阻止node-xlsx将
_X2069_这类序列转换为Unicode字符? 问题场景
使用Node.js搭配node-xlsx开发Excel处理工具时,发现单元格内的_X2069_序列会被自动转换为Unicode字符U+2069(Pop Directional Isolate),但_Y2069_、_Z2069_这类序列不受影响。临时替换U+2069字符的方案不够优雅,且无法覆盖潜在的其他类似转换场景,需要彻底禁用该行为。
复现代码
const xlsx = require('node-xlsx'); function getData(excelSheet) { data = []; excelData = excelSheet[0]["data"] // 过滤末尾空行,提取第一列数据 for (let i = 0; i < excelData.length; i++) { if (excelData[i][0] != undefined) { data.push([]); data[i].push(excelData[i][0]); } } return data; } const workSheet = xlsx.parse('./input.xlsx'); let rows = getData(workSheet); console.log(rows);
输入与输出
- input.xlsx第一列内容:
_X2069_ _Y2069_ _Z2069_ - 实际输出:
[ [ '\u2069' ], [ '_Y2069_' ], [ '_Z2069_' ] ]
解决方案
node-xlsx底层依赖SheetJS的xlsx库,这种_XHHHH_(HHHH为四位十六进制数)转Unicode字符的行为,是SheetJS默认开启的HTML实体解码逻辑导致的。通过在解析时添加cellHTML: false选项,即可关闭该自动转换:
修改后的代码
const xlsx = require('node-xlsx'); function getData(excelSheet) { const data = []; const excelData = excelSheet[0]["data"]; // 过滤空行并提取第一列 for (let i = 0; i < excelData.length; i++) { if (excelData[i][0] !== undefined) { data.push([excelData[i][0]]); } } return data; } // 传入cellHTML: false禁用自动解码 const workSheet = xlsx.parse('./input.xlsx', { cellHTML: false }); let rows = getData(workSheet); console.log(rows);
效果验证
修改后输出会保留原始字符串:
[ [ '_X2069_' ], [ '_Y2069_' ], [ '_Z2069_' ] ]
补充说明
cellHTML选项是控制SheetJS解析文本时是否处理HTML实体及类似Unicode转义序列的核心开关,关闭后可避免大部分非预期的字符转换问题。如果后续遇到其他类似自动转码场景,优先检查该选项的配置。
内容的提问来源于stack exchange,提问作者Frank Schmitt
相关产品推荐
相关产品推荐

