我想读取存储为数字的电话号码的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,"
有什么方法可以避免这种转变吗?
答案 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 });