如何将Big Endian CSV加载到sheetjs中?

问题描述 投票:0回答:1

我正在尝试将 UTF-16BE 格式(带 BOM)的 CSV 文件加载到sheetjs工作簿中:

import { read } from 'xlsx';

const buffer = await file.arrayBuffer();
const wb = read(buffer, { cellDates: true });

进入

wb
的内容不是我所期望的:它无法正确检测编码。即使我将
codepage: 1201
选项添加到
read
,问题仍然存在。如果我将相同的文件转换为 LE,sheetjs 会正确解析它。 我想念什么? (我当前的解决方法是在调用
read
之前将缓冲区从 BE 转换为 LE,但这不是最佳解决方案。)

csv parsing utf-16 sheetjs
1个回答
0
投票

因此,由于到目前为止还没有答案,我分享我的解决方法代码片段 - 希望这对某人有帮助:

import { read, type WorkBook } from 'xlsx';

async function upload(file: File) {
    function swap(val: number) {
        return ((val & 0xff) << 8) | ((val >> 8) & 0xff);
    }

    let buffer = await file.arrayBuffer();

    // converting buffer from Big Endian to Little Endian (which xlsx can read flawlessly)
    if (file.name.toLowerCase().endsWith('.csv')) {
        let ui16 = new Uint16Array(buffer);
        if (ui16[0] === 0xfffe) for (let i = 0; i < ui16.length; i++) ui16[i] = swap(ui16[i]);
    }
    let wb = read(buffer, { cellDates: true }) as WorkBook; // Excel workbook

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.