使用Node解析XLSX并创建json

Mat*_*ood 43 javascript excel json xlsx node.js

好的,所以我发现这个记录非常好,node_module名为js-xlsx

问题: 如何解析xlsx以输出json

以下是Excel工作表的样子:

在此输入图像描述

最后,json应如下所示:

[
   {
   "id": 1,
   "Headline": "Team: Sally Pearson",
   "Location": "Austrailia",
   "BodyText": "...",
   "Media: "..."
   },
   {
   "id": 2,
   "Headline": "Team: Rebeca Andrade",
   "Location": "Brazil",
   "BodyText": "...",
   "Media: "..."
   }
]
Run Code Online (Sandbox Code Playgroud)

index.js:

if(typeof require !== 'undefined') {
    console.log('hey');
    XLSX = require('xlsx');
}
var workbook = XLSX.readFile('./assets/visa.xlsx');
var sheet_name_list = workbook.SheetNames;
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(y + "!" + z + "=" + JSON.stringify(worksheet[z].v));

  }

});
XLSX.writeFile(workbook, 'out.xlsx');
Run Code Online (Sandbox Code Playgroud)

use*_*377 82

你也可以使用

var XLSX = require('xlsx');
var workbook = XLSX.readFile('Master.xlsx');
var sheet_name_list = workbook.SheetNames;
console.log(XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]))
Run Code Online (Sandbox Code Playgroud)

  • 请注意,它应该是 `XLSX.utils.sheet_to_json(sheet, {defval: ""})` 而不是 `XLSX.utils.sheet_to_json(sheet, {defVal=""})` (6认同)
  • 为了包含空值,您还可以向XLSX.utils.sheet_to_json(sheet,{defVal =“”})提供`defval =“”`。 (3认同)
  • 是的,默认情况下它不处理空白单元格,但通过将可选参数传递给 XLSX.readFile 函数是一种解决方法。var workbook = XLSX.readFile('Master.xlsx', {sheetStubs: true}); 可选对象中的 sheetStubs 参数允许库列出默认情况下被库的数据处理实用程序忽略的单元格。 (2认同)

Par*_*jat 44

改进版"Josh Marinacci"的答案,它将超越Z列(即AA1).

var XLSX = require('xlsx');
var workbook = XLSX.readFile('test.xlsx');
var sheet_name_list = workbook.SheetNames;
sheet_name_list.forEach(function(y) {
    var worksheet = workbook.Sheets[y];
    var headers = {};
    var data = [];
    for(z in worksheet) {
        if(z[0] === '!') continue;
        //parse out the column, row, and value
        var tt = 0;
        for (var i = 0; i < z.length; i++) {
            if (!isNaN(z[i])) {
                tt = i;
                break;
            }
        };
        var col = z.substring(0,tt);
        var row = parseInt(z.substring(tt));
        var value = worksheet[z].v;

        //store header names
        if(row == 1 && value) {
            headers[col] = value;
            continue;
        }

        if(!data[row]) data[row]={};
        data[row][headers[col]] = value;
    }
    //drop those first two rows which are empty
    data.shift();
    data.shift();
    console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

  • 我希望在两年过去之后你不再调用变量`y`,`z`,`tt`,更新你的代码真是太痛苦了 (9认同)
  • 这里到底发生了什么?z是什么?tt是什么? (3认同)

Jos*_*cci 35

我认为这段代码会做你想要的.它将第一行存储为一组头,然后将其余的存储在一个数据对象中,您可以将其作为JSON写入磁盘.

var XLSX = require('xlsx');
var workbook = XLSX.readFile('test.xlsx');
var sheet_name_list = workbook.SheetNames;
sheet_name_list.forEach(function(y) {
    var worksheet = workbook.Sheets[y];
    var headers = {};
    var data = [];
    for(z in worksheet) {
        if(z[0] === '!') continue;
        //parse out the column, row, and value
        var col = z.substring(0,1);
        var row = parseInt(z.substring(1));
        var value = worksheet[z].v;

        //store header names
        if(row == 1) {
            headers[col] = value;
            continue;
        }

        if(!data[row]) data[row]={};
        data[row][headers[col]] = value;
    }
    //drop those first two rows which are empty
    data.shift();
    data.shift();
    console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

打印出来

[ { id: 1,
    headline: 'team: sally pearson',
    location: 'Australia',
    'body text': 'majority have…',
    media: 'http://www.youtube.com/foo' },
  { id: 2,
    headline: 'Team: rebecca',
    location: 'Brazil',
    'body text': 'it is a long established…',
    media: 'http://s2.image.foo/' } ]
Run Code Online (Sandbox Code Playgroud)

  • 你就是那个男人乔什!我对保存文件进行了一些编辑。享受你的赏金 (2认同)
  • 次要错字:`for(工作表中的var z) (2认同)

小智 5

**podria ser algo asi en react y electron**

 xslToJson = workbook => {
        //var data = [];
        var sheet_name_list = workbook.SheetNames[0];
        return XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list], {
            raw: false,
            dateNF: "DD-MMM-YYYY",
            header:1,
            defval: ""
        });
    };

    handleFile = (file /*:File*/) => {
        /* Boilerplate to set up FileReader */
        const reader = new FileReader();
        const rABS = !!reader.readAsBinaryString;

        reader.onload = e => {
            /* Parse data */
            const bstr = e.target.result;
            const wb = XLSX.read(bstr, { type: rABS ? "binary" : "array" });
            /* Get first worksheet */
            let arr = this.xslToJson(wb);

            console.log("arr ", arr)
            var dataNueva = []

            arr.forEach(data => {
                console.log("data renaes ", data)
            })
            // this.setState({ DataEESSsend: dataNueva })
            console.log("dataNueva ", dataNueva)

        };


        if (rABS) reader.readAsBinaryString(file);
        else reader.readAsArrayBuffer(file);
    };

    handleChange = e => {
        const files = e.target.files;
        if (files && files[0]) {
            this.handleFile(files[0]);
        }
    };
Run Code Online (Sandbox Code Playgroud)