我想将 excel sheet 中的数据样本存储到 javascript 中的数组中
I want to store data samples from an excel sheet into an array in javascript
我正在使用 sheetJS 来操作 excel 工作表。我的目标是提取单元格的值并将其作为原始数据存储在数组中,以供以后进行统计分析和绘图。
函数如下所示:
function getSheetData()
{
let rawData = [];
/* set up XMLHttpRequest */
var url = "test.xlsx";
var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "arraybuffer";
oReq.send();
oReq.onload = function (e) {
var arraybuffer = oReq.response;
/* convert data to binary string */
var data = new Uint8Array(arraybuffer);
var arr = new Array();
for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
var bstr = arr.join("");
/* Call XLSX */
var workbook = XLSX.read(bstr, {
type: "binary"
});
/* DO SOMETHING WITH workbook HERE */
var sheet_name_list = workbook.SheetNames;
// var worksheet;
sheet_name_list.forEach(function(y) { /* iterate through sheets */
var worksheet = workbook.Sheets[y];
for (z in worksheet) {
/* all keys that do not begin with "!" correspond to cell addresses */
if(z[0] === '!') continue;
// console.log(z + " = " + JSON.stringify(worksheet[z].v));
rawData.push(worksheet[z].v);
}
});
/* Get worksheet */
// console.log(XLSX.utils.sheet_to_json(worksheet, {
// raw: true
// }));
console.log("raw data = " + rawData);
}
// console.log(rawData);
return rawData;
}
定义为'raw data'的console.log显示了一个数组中的所有数字,正是我所需要的。但是,名为“rawData”的数组 returns 在函数结束时未定义。
我在这里调用函数:
window.onload = function()
{
const data = getSheetData();
const BenfordTable = calculateBenford(data);
printAsTable(BenfordTable);
printAsGraph(BenfordTable);
}
我得到的数据是一个空数组
我附上了浏览器的图片window
screenshot of console results in google chrome
data
是一个空数组,因为 getSheetData()
是一个异步函数——也就是说,您正在从其中进行 XMLHttpRequest 调用。如果您将控制台日志放在您的 onload 处理程序中并且就在您的 return 语句之前,您将看到后者首先运行。问题是当你的函数 returns 时,对服务器的调用还没有 returned.
有几种不同的编写异步代码的方法,但我认为您应该首先将回调函数传递给 getSheetData()
,它将在您的 onload
处理程序中调用。此回调函数将处理 rawData
.
以下是您可以执行此操作的大致方法。为简洁起见,我省略了一些现有代码,但显然你会需要它。
function getSheetData(callback)
{
let rawData = [];
// ...other code
oReq.onload = function (e) {
var arraybuffer = oReq.response;
// ...other code
callback(rawData); // <-- add this
}
// no need to return anything!
// return rawData;
}
window.onload = function()
{
getSheetData(function () {
const BenfordTable = calculateBenford(data);
printAsTable(BenfordTable);
printAsGraph(BenfordTable);
});
}
您还可以使用其他东西来编写此类代码,例如 Promises,但这可能是其他需要研究的东西。我们也没有在这里做任何错误处理,这也是一个重要的概念。这里的主要内容是,您只在对服务器的调用完成后才处理原始数据。
我正在使用 sheetJS 来操作 excel 工作表。我的目标是提取单元格的值并将其作为原始数据存储在数组中,以供以后进行统计分析和绘图。
函数如下所示:
function getSheetData()
{
let rawData = [];
/* set up XMLHttpRequest */
var url = "test.xlsx";
var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "arraybuffer";
oReq.send();
oReq.onload = function (e) {
var arraybuffer = oReq.response;
/* convert data to binary string */
var data = new Uint8Array(arraybuffer);
var arr = new Array();
for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
var bstr = arr.join("");
/* Call XLSX */
var workbook = XLSX.read(bstr, {
type: "binary"
});
/* DO SOMETHING WITH workbook HERE */
var sheet_name_list = workbook.SheetNames;
// var worksheet;
sheet_name_list.forEach(function(y) { /* iterate through sheets */
var worksheet = workbook.Sheets[y];
for (z in worksheet) {
/* all keys that do not begin with "!" correspond to cell addresses */
if(z[0] === '!') continue;
// console.log(z + " = " + JSON.stringify(worksheet[z].v));
rawData.push(worksheet[z].v);
}
});
/* Get worksheet */
// console.log(XLSX.utils.sheet_to_json(worksheet, {
// raw: true
// }));
console.log("raw data = " + rawData);
}
// console.log(rawData);
return rawData;
}
定义为'raw data'的console.log显示了一个数组中的所有数字,正是我所需要的。但是,名为“rawData”的数组 returns 在函数结束时未定义。
我在这里调用函数:
window.onload = function()
{
const data = getSheetData();
const BenfordTable = calculateBenford(data);
printAsTable(BenfordTable);
printAsGraph(BenfordTable);
}
我得到的数据是一个空数组
我附上了浏览器的图片window
screenshot of console results in google chrome
data
是一个空数组,因为 getSheetData()
是一个异步函数——也就是说,您正在从其中进行 XMLHttpRequest 调用。如果您将控制台日志放在您的 onload 处理程序中并且就在您的 return 语句之前,您将看到后者首先运行。问题是当你的函数 returns 时,对服务器的调用还没有 returned.
有几种不同的编写异步代码的方法,但我认为您应该首先将回调函数传递给 getSheetData()
,它将在您的 onload
处理程序中调用。此回调函数将处理 rawData
.
以下是您可以执行此操作的大致方法。为简洁起见,我省略了一些现有代码,但显然你会需要它。
function getSheetData(callback)
{
let rawData = [];
// ...other code
oReq.onload = function (e) {
var arraybuffer = oReq.response;
// ...other code
callback(rawData); // <-- add this
}
// no need to return anything!
// return rawData;
}
window.onload = function()
{
getSheetData(function () {
const BenfordTable = calculateBenford(data);
printAsTable(BenfordTable);
printAsGraph(BenfordTable);
});
}
您还可以使用其他东西来编写此类代码,例如 Promises,但这可能是其他需要研究的东西。我们也没有在这里做任何错误处理,这也是一个重要的概念。这里的主要内容是,您只在对服务器的调用完成后才处理原始数据。