我想将 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,但这可能是其他需要研究的东西。我们也没有在这里做任何错误处理,这也是一个重要的概念。这里的主要内容是,您只在对服务器的调用完成后才处理原始数据。