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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:03:26