如何避免在 nodejs excel 文件读取中将大数转换为指数

how to avoid large numbers from converting to Exponential in nodejs excel file read

我想读取 excel 文件,其中 phone 数字存储为数字,但是当我使用 SheetJS/js-xlsx (npm install xlsx) 读取文件时,所有大 phone 数字被转换为字符串,如

9.19972E+11 

919971692474  --> 9.19972E+11

我的密码是

var workbook = XLSX.readFile(req.files.fileName.path);
var sheet_name_list = workbook.SheetNames;
var csvFile = XLSX.utils.sheet_to_csv(workbook.Sheets[sheet_name_list[0]]);
console.log(csvFile2);

控制台输出是

customer_phone,product_name
9.19972E+13,"Red Belly Shoes,"

有什么办法可以避免这种转换?

数字919971692474在Excel中正常显示为9.19972E+11。要强制它显示完整数字,您必须将数字格式设置为 0(右键单击,设置单元格格式,选择自定义类型“0”)。当您这样做时,会显示完整的数字。如果您没有在 excel 中设置格式,则 xlsx 模块使用 "General" 格式,并且该数字格式将 phone 数字显示为指数。

如果文件不正确,您可以通过删除 w 键并添加与所需数字格式相对应的 z 键来覆盖 CSV 格式。例如,要更改单元格 A2:

var sheet = workbook.Sheets[workbook.SheetNames[0]];
delete sheet.A2.w;
sheet.A2.z = '0';

如果您想对所有数字单元格执行此操作,只需循环:

Object.keys(sheet).forEach(function(s) {
    if(sheet[s].w) {
        delete sheet[s].w;
        sheet[s].z = '0';
    }
});

好像以后的版本w没有了。这就是在最近的版本中可以做到的。

const ws = XLSX.utils.json_to_sheet(data);

Object.keys(ws).forEach(function(s) {
    if(ws[s].t === 'n') {
        ws[s].z = '0';
        ws[s].t = 's';
    }
});

const csv = XLSX.utils.sheet_to_csv(ws);

使用 sheet[s].z = '0'; 可以删除科学计数法,但它也会删除您可能想要保留的所有小数位。来自 readme:

The cell.w formatted text for each cell is produced from cell.v and cell.z format.

我能够通过显式设置 w 的值而不是让 xlsx 为我计算它来删除科学记数法:

if (cell.t === 'n') {
  cell.w = cell.v;
}

默认sheet_to_csv采用格式化数字。

- 要避免格式化值并采用原始输入(原始值),您必须在 sheet_to_csv 方法中添加参数,您必须将 rawNumbers 设置为 true

试试这个代码

var csvFile = XLSX.utils.sheet_to_csv(workbook.Sheets[sheet_name_list[0]], { rawNumbers: true });