使用JavaScript将Excel文件读入数组

3

我想要读取一个excel文件,并用javascript创建一个多维数组。 excel文件的样式如下:

AA11 AA22 AN65
AB11 AB22 AN64
...

我需要创建一个类似这样的数组:
[
    [AA11, AA22, AN65],
    [AB11, AB22, AN64]
]

到目前为止,我已经成功弹出了文件选择窗口,并且我认为它正在读取文件,但是我认为它可能没有正确地将数据放入数组中。这是我的进展:

    <script type="text/javascript">
        $(function () {
            $("#input").on("change", function () {
            var excelFile,
            var array = [[],[]];
                fileReader = new FileReader();

            $("#result").hide();

            fileReader.onload = function (e) {
                var buffer = new Uint8Array(fileReader.result);

                $.ig.excel.Workbook.load(buffer, function (workbook) {
                    var column, row, newRow, cellValue, columnIndex, i,
                        worksheet = workbook.worksheets(0),
                        columnsNumber = 0,
                        gridColumns = [],
                        data = [],
                        worksheetRowsCount;
                    while (worksheet.rows(0).getCellValue(columnsNumber)) {
                        columnsNumber++;
                    }
                    for (columnIndex = 0; columnIndex < columnsNumber; columnIndex++) {
                        column = worksheet.rows(0).getCellText(columnIndex);
                        gridColumns.push({ headerText: column, key: column });
                    }
                    for (i = 1, worksheetRowsCount = worksheet.rows().count() ; i < worksheetRowsCount; i++) {
                        newRow = {};
                        row = worksheet.rows(i);

                        for (columnIndex = 0; columnIndex < columnsNumber; columnIndex++) {
                            cellValue = row.getCellText(columnIndex);
                            //newRow[gridColumns[columnIndex].key] = cellValue;
                            array[row,columnIndex] = cellValue;
                        }

                        window.alert(array[0][0]);
                        data.push(array);
                    }

    </script>

任何帮助都将不胜感激。


1
当您说“Excel文件”时,是指.xls / .xlsx文件还是.csv文件? - Stephen P
1
看起来你正在使用某种第三方库来帮助你读取工作簿。你可能想要[编辑]你的问题,将该库的名称包含在问题中(如果存在,则包含在标签中)。 - Heretic Monkey
一行代码 `let input = "A B C DD EE FF"; // tab 分隔符 \tlet clean = input.replace(/^/g, '["').replace(/\t/g, '","').replace(/(?:\r\n|\r|\n)/g, '"], ["').replace(/, [$/, ''); clean = clean.substring(0, clean.length-4); let arr = JSON.parse('['+clean+']')` - David d C e Freitas
2个回答

18

不确定您用的是什么解析Excel的工具,是IgniteUI吗?值得一提的是,SheetJS的免费社区版js-xlsx提供了一些函数,可以根据您提供的电子表格生成所需的输出。

文档有点凌乱,但是它们是完整的,最适合这种用例的部分是:解析工作簿下的浏览器文件上传表单元素XLSX.utils.sheet_to_json。您可以在下面的代码示例中使用您提供的电子表格类型运行测试:

$("#input").on("change", function (e) {
   var file = e.target.files[0];
   // input canceled, return
   if (!file) return;
   
   var FR = new FileReader();
   FR.onload = function(e) {
     var data = new Uint8Array(e.target.result);
     var workbook = XLSX.read(data, {type: 'array'});
     var firstSheet = workbook.Sheets[workbook.SheetNames[0]];
     
     // header: 1 instructs xlsx to create an 'array of arrays'
     var result = XLSX.utils.sheet_to_json(firstSheet, { header: 1 });
     
     // data preview
     var output = document.getElementById('result');
     output.innerHTML = JSON.stringify(result, null, 2);
   };
   FR.readAsArrayBuffer(file);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.14.5/xlsx.full.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="file" id="input" accept=".xls,.xlsx,.ods">
<pre id="result"></pre>


这段代码中哪些行将数组写入文档?我想让它只将数组存储为变量a,但我不知道如何使其不写入文档。 - Prerona Kundu
@PreronaKundu,你说的“到文档”是什么意思?在注释// data preview下面的代码将变量result(其中存储了xlsx数据)的JSON输出写入<pre>标签中。如果你想重新导出为xlsx格式,可以查找xlsx-js文档中的xlsx.utils.aoa_to_sheet - webketje
不要将JSON输出写入<pre>标签,我想简单地将数组数据存储在一个名为a的变量中,以便我可以在另一个函数中继续使用这些数据。 - Prerona Kundu
当然可以。在上面的代码中它被称为“result”,但你可以将其标记为“a”... - webketje
是的,但我不想让它打印出<pre>标签到页面上。我不想在视觉上看到数组,我只想将其存储在变量中。有没有一种方法可以在没有<pre>标签的情况下实现这一点,或者使标签不出现在文档中? - Prerona Kundu
显示剩余2条评论

0

这里是完整的解决方案,此外我还添加了按类别分组的函数,以演示我们可以将函数应用于JSON数组。

(async() => {
  const url = "./yourfile.xlsx";
  const data = await (await fetch(url)).arrayBuffer();
  /* data is an ArrayBuffer */
  const workbook = XLSX.read(data);

  const firstSheetName = workbook.SheetNames[0];
  const worksheet = workbook.Sheets[firstSheetName];
  const sheetValues = XLSX.utils.sheet_to_json(worksheet);

  const groupByCategory = sheetValues.reduce((group, product) => {
  const { category } = product;
  group[category] = group[category] ?? [];
  group[category].push(product);
  return group;
  }, {});

  console.log(groupByCategory)
  /* DO SOMETHING WITH workbook HERE */
})();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接