无法读取使用 SheetJs 生成的 XLSX 的单元格值

Can't read cell values of XLSX generated using SheetJs

我编写了一个 JS 代码,在其中导入了 SheetJS 和 js-xlsx 以对 XLSX 文件执行操作(我不能使用 nodeJs 或 npm、bower 或任何其他需要在最终用户计算机上安装的解决方案)。

很快,代码必须执行以下操作:

  1. 从用户那里获取将添加到 excel 的数据;
  2. 导入excel用户想要编辑的;
  3. 使用一个函数来确定必须在哪一行添加数据;
  4. 保存并下载包含更新数据的新文件

我写的代码的问题是,它与 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 中读取,它仍然写入并将整个单元格对象传递给它