我正在尝试将 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,但这不是最佳解决方案。)
因此,由于到目前为止还没有答案,我分享我的解决方法代码片段 - 希望这对某人有帮助:
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
...
}