如何避免在 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 });
我想读取 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 });