【发布时间】:2021-03-19 14:10:48
【问题描述】:
我编写了一个 JS 代码,在其中导入了 SheetJS 和 js-xlsx 以对 XLSX 文件执行操作(我不能使用 nodeJs 也不能使用 npm、bower 或任何其他需要在最终用户计算机上进行任何安装的解决方案)。
简而言之,代码必须执行以下操作:
- 从用户那里获取要添加到excel中的数据;
- 导入用户要编辑的excel;
- 使用函数来确定必须在哪些行中添加数据;
- 保存并下载包含更新数据的新文件
我编写的代码的问题在于,它在 Excel 中运行良好,实际上是通过 Excel,但如果用户导入以前由我的代码生成和下载的 XLSX,则会崩溃。
这是代码的sn-p:
// user choose the source excel
$('#xlf').change(function(e) {
var reader = new FileReader();
reader.readAsArrayBuffer(e.target.files[0]);
reader.onload = function(e) {
var data = new Uint8Array(reader.result);
var wb = XLSX.read(data, {
type: 'array',
cellDates: true,
cellStyles: true,
sheetStubs: true,
raw: true
});
var fSN = wb.SheetNames[0];
var ws = wb.Sheets[fSN];
function findEmpty() {
// this function check all the values in a specific range of cells (C9:C25)
// In order to do so, I included them into an array where I stored the value of the cells;
// later I loop the array and add 1 to the counter *dataSize* anytime I found a value > 0
var dataRange = [ws["C9"].v, ws["C10"].v, ws["C11"].v, , ws["C12"].v, ws["C13"].v, ws["C14"].v, ws["C15"].v, ws["C16"].v, ws["C17"].v, ws["C18"].v, ws["C19"].v, ws["C20"].v, ws["C21"].v, ws["C22"].v, ws["C23"].v, ws["C24"].v, ws["C25"].v];
var dataSize = 0;
var row;
for (i = 0; i < dataRange.length; i++) {
if (dataRange[i] > 0)
dataSize++;
}
row = 8 + dataSize; // 8 is the row of C9 (0 index-based)
return row;
}
var firstEmpty = findEmpty();
var header = ["a", "b", "c", "d", "e", "f"];
//origin is firstEmpty
XLSX.utils.sheet_add_json(ws, [{
a: $('#from').val(),
b: $('#to').val(),
c: $("#differenza").val(),
e: $("#comm").val()
}], {
header: header,
origin: firstEmpty,
skipHeader: true
});
// save file
XLSX.writeFile(wb, "test.xlsx");
}
});
如果我尝试将没有值 (.v) 的单元格存储在 dataRange 中:
var dataRange = [ws["C9"], ws["C10"], ws["C11"], ws["C12"], ws["C13"], ws["C14"], ws["C15"], ws["C16"], ws["C17"], ws["C18"], ws["C19"], ws["C20"], ws["C21"], ws["C22"], ws["C23"], ws["C24"], ws["C25"]];
它不会因 Excel 生成的文件或 this-code-generated 文件而崩溃,但是函数 findEmpty() 将无法按预期工作(无论在细胞)。
看起来我的代码无法编写正确的单元格对象。 我的猜测是我应该用我保存文件的方式来解决一些问题,但经过多次研究和尝试,我无法找到解决这个问题的方法 - 你有线索吗?
谢谢大家
【问题讨论】:
标签: javascript excel xlsx sheetjs js-xlsx