javascript - 无法读取使用 SheetJs 生成的 XLSX 的单元格值
问题描述
我编写了一个 JS 代码,在其中导入了 SheetJS 和 js-xlsx 以对 XLSX 文件执行操作(我不能使用 nodeJs 也不能使用 npm、bower 或任何其他需要在最终用户计算机上进行任何安装的解决方案)。
很快,代码必须执行以下操作:
- 从用户那里获取将添加到 excel 中的数据;
- 导入用户想要编辑的 excel;
- 使用函数来确定必须在哪些行中添加数据;
- 保存并下载包含更新数据的新文件
我编写的代码的问题在于,它实际上可以通过 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)。
看起来我的代码无法编写正确的单元格对象。我的猜测是我应该用我保存文件的方式来解决一些问题,但是经过多次研究和尝试,我无法找到解决这个问题的方法 - 你有线索吗?
谢谢大家
解决方案
以防万一这可以帮助任何人,我解决了我在 FOR 循环中更改 IF 条件的问题,如下所示:
if((dataRange[i] !== undefined) && (dataRange[i].v > 0))
dataSize++;
另外,我正在使用未传递 .v 属性的dataRange数组
( dataRange = [ws["C9"], ws["C10"], ... , ...]
)
经过几次尝试,我发现我的代码无法在它生成的文件的单元格的 .v 中读取,但它仍然写入并将整个单元格对象传递给它
推荐阅读
- ios - 如何在没有调用者 UUID 的情况下从自定义 UI 结束 CallKit 调用?
- go - 在 VS Code 开发过程中调试 Go 包
- javascript - Firebase 消息 (FCM) - 没有通知权限的应用内消息
- node.js - 使用 Firebase Cloud Functions 创建 Node.js REST API,而不使用 Express?
- django - Django Permission 类被调用两次
- java - Spring boot 2中配置Sql server 2019数据库时出错
- sql - Oracle Sql 在插入语句时向 to_date 添加小时和分钟
- javascript - 解析 Visual Studio Code Extensions API 上的每个变量(来自 C 文件)
- c++ - 地图,C++中的矢量
- image - 在移动应用程序中自动压缩图像