我正在尝试从xlsx文件中获取json数据,但偶然发现了奇怪的“ js-xlsx”行为。如果标题中有合并单元格的表,那么从该表的输出中只会得到第一行数据。如果我手动删除此行(在EXCEL中),那么我将获得应有的所有数据。如果我手动取消合并此单元格,则再次:json中的所有数据。
所以问题出在合并的单元格上,任务是跳过它\避免在导出中\删除它\做其他任何事情...
我试图通过'js-xlsx'删除该行,从SO接受的答案中获取了一些代码,但这无济于事,处理合并的单元格似乎有点奇怪:
const XLSX = require('xlsx');
let workbook = XLSX.readFile('./downloads/wb_sales.xlsx');
var worksheet = workbook.Sheets[workbook.SheetNames[0]];
function ec(r, c){
return XLSX.utils.encode_cell({r:r,c:c});
}
function delete_row(ws, row_index){
var variable = XLSX.utils.decode_range(ws["!ref"])
for(var R = row_index; R < variable.e.r; ++R){
for(var C = variable.s.c; C <= variable.e.c; ++C){
ws[ec(R,C)] = ws[ec(R+1,C)];
}
}
variable.e.r--
ws['!ref'] = XLSX.utils.encode_range(variable.s, variable.e);
}
// trying to delete first row
delete_row(worksheet,0)
// here I get just the first row of data
console.log(XLSX.utils.sheet_to_json(worksheet));
尝试worksheet[!'merged']=''
-清除单元格,但合并状态保持不变。
尝试
var range = XLSX.utils.decode_range(worksheet['!ref']);
range.s.r = 1; // <-- skipping first row with merged cell, but not working either.
worksheet['!ref'] = XLSX.utils.encode_range(range);
不好。输出相同。
尝试worksheet['A1']=worksheet['A2']
会复制内容,但合并停留。
关于上述内容:
感谢所有人:)
答案 0 :(得分:0)
我设法通过范围编码排除了具有合并单元格的行。当您使用鼠标手动选择单元格时,情况最相似。不幸的是,这是半解决方案,因为它不能解决表中随机位置处的合并单元格,并且它们仍然保持合并状态,从而导致问题。无论如何,如果有人愿意,这是简单的范围解决方案。
var range = XLSX.utils.decode_range(worksheet['!ref']); //<-- start "select"
range.s.r = 1; // <-- start row
range.e.r = 12; // <-- end row
worksheet['!ref'] = XLSX.utils.encode_range(range); //<-- end "select"
UPD:好的,所以我通过一些奇怪的技术来管理它。 1.取值范围2.导出到json 3.创建新工作簿4.将json导出到工作表5.将工作表追加到工作簿6.另存为新的xlsx对象。
所以这是下一个程序段:
let ws_json = XLSX.utils.sheet_to_json(worksheet)
var wb = XLSX.utils.book_new();
var ws = wb.Sheets[workbook.SheetNames[0]];
let js = XLSX.utils.json_to_sheet(ws_json)
XLSX.utils.book_append_sheet(wb, js, '');
XLSX.writeFile(wb,'./downloads/wb_sales_new.xlsx')
如果有人找到直接的解决方案,请更新。