首页 > 解决方案 > 无法读取使用 SheetJs 生成的 XLSX 的单元格值

问题描述

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

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

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

我编写的代码的问题在于,它实际上可以通过 Excel 编写的 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");
    }
});

如果我尝试将没有值 (.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 生成的文件或此代码生成的文件而崩溃,但是函数 findEmpty() 将无法按预期工作(无论单元格内有什么,dataSize 都将为 0)。

看起来我的代码无法编写正确的单元格对象。我的猜测是我应该用我保存文件的方式来解决一些问题,但是经过多次研究和尝试,我无法找到解决这个问题的方法 - 你有线索吗?

谢谢大家

标签: javascriptexcelxlsxsheetjsjs-xlsx

解决方案


以防万一这可以帮助任何人,我解决了我在 FOR 循环中更改 IF 条件的问题,如下所示:

if((dataRange[i] !== undefined) && (dataRange[i].v > 0))
                                dataSize++;

另外,我正在使用未传递 .v 属性的dataRange数组

( dataRange = [ws["C9"], ws["C10"], ... , ...])

经过几次尝试,我发现我的代码无法在它生成的文件的单元格的 .v 中读取,但它仍然写入并将整个单元格对象传递给它


推荐阅读