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

时间:2015-01-01 17:47:06

标签: node.js excel npm xlsx

我想读取存储为数字的电话号码的excel文件,但是当我使用SheetJS / js-xlsx(npm install xlsx)读取文件时,所有大型电话号码都转换为字符串,如

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,"

有什么方法可以避免这种转变吗?

4 个答案:

答案 0 :(得分:5)

数字919971692474通常在Excel中显示为9.19972E + 11。要强制它显示完整数字,您必须将数字格式设置为0(右键单击,格式化单元格,选择自定义类型“0”)。当你这样做时,会显示完整的数字。如果未在Excel中设置格式,则xlsx模块使用“常规”格式,该数字格式将电话号码显示为指数。

如果文件不正确,您可以通过删除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';
    }
});

答案 1 :(得分:1)

似乎在更高版本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);

答案 2 :(得分:1)

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

每个单元格的cell.w格式文本均来自cell.v和cell.z格式。

通过显式设置w的值,而不是让xlsx为我计算它,我可以删除科学记法:

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

答案 3 :(得分:0)

默认情况下 sheet_to_csv 采用格式化的数字。

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

试试这个代码

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