无法读取使用 SheetJs 生成的 XLSX 的单元格值
Can't read cell values of XLSX generated using SheetJs
我编写了一个 JS 代码,在其中导入了 SheetJS 和 js-xlsx 以对 XLSX 文件执行操作(我不能使用 nodeJs 或 npm、bower 或任何其他需要在最终用户计算机上安装的解决方案)。
很快,代码必须执行以下操作:
- 从用户那里获取将添加到 excel 的数据;
- 导入excel用户想要编辑的;
- 使用一个函数来确定必须在哪一行添加数据;
- 保存并下载包含更新数据的新文件
我写的代码的问题是,它与 Excels 一起工作得很好,事实上,通过 Excel,但是如果用户导入之前生成的 XLSX 和通过我的代码下载。
这是代码片段:
// 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");
}
});
如果我尝试在 dataRange 中存储没有值 (.v) 的单元格:
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 生成的文件和 此代码生成的 文件而崩溃,但是函数 findEmpty() 将无法按预期工作(dataSize将是 0,无论单元格内是什么)。
看来我的代码无法编写正确的单元格对象。
我的猜测是,我应该通过保存文件的方式来解决一些问题,但经过多次研究和尝试后,我无法找到解决此问题的方法 - 你有线索吗?
感谢大家
以防万一这可以帮助任何人,我解决了我的问题,如下所示更改 FOR 循环中的 IF 条件:
if((dataRange[i] !== undefined) && (dataRange[i].v > 0))
dataSize++;
此外,我使用的是 dataRange 数组,但我没有传递 .v 属性
(dataRange = [ws["C9"], ws["C10"], ... , ...]
)
经过几次尝试后,我发现我的代码无法在它生成的文件的单元格的 .v 中读取,它仍然写入并将整个单元格对象传递给它
我编写了一个 JS 代码,在其中导入了 SheetJS 和 js-xlsx 以对 XLSX 文件执行操作(我不能使用 nodeJs 或 npm、bower 或任何其他需要在最终用户计算机上安装的解决方案)。
很快,代码必须执行以下操作:
- 从用户那里获取将添加到 excel 的数据;
- 导入excel用户想要编辑的;
- 使用一个函数来确定必须在哪一行添加数据;
- 保存并下载包含更新数据的新文件
我写的代码的问题是,它与 Excels 一起工作得很好,事实上,通过 Excel,但是如果用户导入之前生成的 XLSX 和通过我的代码下载。
这是代码片段:
// 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");
}
});
如果我尝试在 dataRange 中存储没有值 (.v) 的单元格:
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 生成的文件和 此代码生成的 文件而崩溃,但是函数 findEmpty() 将无法按预期工作(dataSize将是 0,无论单元格内是什么)。
看来我的代码无法编写正确的单元格对象。 我的猜测是,我应该通过保存文件的方式来解决一些问题,但经过多次研究和尝试后,我无法找到解决此问题的方法 - 你有线索吗?
感谢大家
以防万一这可以帮助任何人,我解决了我的问题,如下所示更改 FOR 循环中的 IF 条件:
if((dataRange[i] !== undefined) && (dataRange[i].v > 0))
dataSize++;
此外,我使用的是 dataRange 数组,但我没有传递 .v 属性
(dataRange = [ws["C9"], ws["C10"], ... , ...]
)
经过几次尝试后,我发现我的代码无法在它生成的文件的单元格的 .v 中读取,它仍然写入并将整个单元格对象传递给它