【问题标题】:Converting excel file to json in nodejs在nodejs中将excel文件转换为json
【发布时间】:2015-04-01 21:43:55
【问题描述】:

我正在尝试使用此 api 将 excel 文件转换为 json: convert-json 节点接口。

我可以在我的本地机器上执行此操作,但不能在我的服务器上执行此操作。只有 csv-to-json 在本地和服务器上工作。这是我的代码: https://gist.github.com/debasreedash/33efd4473ba8b344a5ac

在第一个 console.log 之后尝试解析 excel 文件时服务器崩溃。这是它的样子: http://imgur.com/lzUy8sc

我认为这是服务器上没有excel驱动程序的问题,但下载并安装后它也不起作用。有没有人遇到过这个问题?如果您需要更多信息,请告诉我。

【问题讨论】:

  • 确保您的 Excel 文件未被任何其他软件(尤其是 Excel !)打开。
  • 如果您的代码清单是正确的,并且console.log("Going to convert..."); 没有打印任何内容,那么崩溃可能发生在其他地方。尝试注释掉整个 try-catch 块并确保显示第二个日志。

标签: javascript json node.js excel


【解决方案1】:

使用此方法便于理解和解析:

npm install --save excel'



var xls = require('excel');

xls('Sheet.xlsx', function(err, data) {
  if(err) throw err;
    // data is an array of arrays
});

正如它所说,它返回的数据是一个数组数组。我们希望它是 JSON,以便我们可以用它做任何我们想做的事情。

这是一个将数组数组转换为 JSON 的函数:

function convertToJSON(array) {
  var first = array[0].join()
  var headers = first.split(',');

  var jsonData = [];
  for ( var i = 1, length = array.length; i < length; i++ )
  {

    var myRow = array[i].join();
    var row = myRow.split(',');

    var data = {};
    for ( var x = 0; x < row.length; x++ )
    {
      data[headers[x]] = row[x];
    }
    jsonData.push(data);

  }
  return jsonData;
};

然后:

xlsx('tasks.xlsx', function(err,data) {
    if(err) throw err;
    //console.log(jsonDataArray(data));
    console.log(JSON.stringify(convertToJSON(data)));
    //console.log(data);
});

【讨论】:

  • 您应该注意,您使用的excel 模块仅支持.xlsx 文件。对于较早的支持,parse-xl 效果很好。
  • 如果列中的某个值已经包含逗号 (,),则此操作失败。它也将其拆分并将值附加到下一列。你能在上面的代码中解决这个问题吗?
【解决方案2】:

关注问题第一行的前半部分:如何将Excel转换为json。

假设:Excel 电子表格是一个正方形数据,其中第一行是对象键,其余行是对象值,所需的 json 是对象列表。

对上一个答案的改进:删除不必要的拆分和连接(如果键或值包含逗号,则不必要并且可能导致无效的转换),允许键中的虚线字符串暗示嵌套对象,coffeescript,编写文件。

点表示法:包含 firstName、lastName、address.street、address.city、address.state、address.zip 的键行 (0) 将按行生成一个包含名字和姓氏的文档以及一个名为 address 的嵌入文档, 加上地址。

通过 VisioN 从How to set object property (of object property of..) given its string name in JavaScript? 分配功能

首先,加载excel模块

npm install excel --save-dev

不优雅,只是完成代码

fs = require 'fs'
excel = require 'excel'

FILES = [
  {src: 'input.xlsx', dst: 'output.json'}
  ]

# Assign values to dotted property names - set values on sub-objects
assign = (obj, key, value) ->
  # Because we recurse, a key may be a dotted string or a previously split
  # dotted string.
  key = key.split '.' unless typeof key is 'object'

  if key.length > 1
    e = key.shift()
    obj[e] = if Object.prototype.toString.call(obj[e]) is "[object Object]" then obj[e] else {}
    assign obj[e], key, value
  else
    obj[key[0]] = value

# The excel module reads sheet 0 from specified xlsx file
process = (src, dst) ->
  excel src, (err, data) ->
    throw err if err 

    keys = data[0]
    rows = data[1..]

    result = []
    for row in rows
      item = {}
      assign item, keys[index], value for value, index in row
      result.push item

    fs.writeFile dst, JSON.stringify(result, null, 2), (err) ->
      if err
        console.error("Error writing file #{dst}", err)
      else
        console.log "Updated #{dst}"

process file.src, file.dst for file in FILES

【讨论】:

    【解决方案3】:

    找到适合我的快速准确的解决方案:

    server.js

    let express = require('express'),
        app = express(),
        bodyParser = require('body-parser'),
        multer = require('multer'),
        crypto = require('crypto'),
        xlsxtojson = require('xlsx-to-json'),
        xlstojson = require("xls-to-json");
    
    let fileExtension = require('file-extension');
    
        app.use(bodyParser.json());  
    
        let storage = multer.diskStorage({ //multers disk storage settings
            destination: function (req, file, cb) {
                cb(null, './input/')
            },
            filename: function (req, file, cb) {
                crypto.pseudoRandomBytes(16, function (err, raw) {
                    cb(null, raw.toString('hex') + Date.now() + '.' + fileExtension(file.mimetype));
                    });
            }
        });
    
        let upload = multer({storage: storage}).single('file');
    
        /** Method to handle the form submit */
        app.post('/sendFile', function(req, res) {
            let excel2json;
            upload(req,res,function(err){
                if(err){
                     res.json({error_code:401,err_desc:err});
                     return;
                }
                if(!req.file){
                    res.json({error_code:404,err_desc:"File not found!"});
                    return;
                }
    
                if(req.file.originalname.split('.')[req.file.originalname.split('.').length-1] === 'xlsx'){
                    excel2json = xlsxtojson;
                } else {
                    excel2json = xlstojson;
                }
    
               //  code to convert excel data to json  format
                excel2json({
                    input: req.file.path,  
                    output: "output/"+Date.now()+".json", // output json 
                    lowerCaseHeaders:true
                }, function(err, result) {
                    if(err) {
                      res.json(err);
                    } else {
                      res.json(result);
                    }
                });
    
            })
    
        });
        // load index file to upload file on http://localhost:3000/
        app.get('/',function(req,res){
            res.sendFile(__dirname + "/index.html");
        });
    
        app.listen('3000', function(){
            console.log('Server running on port 3000');
        });
    

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <title>Excel to Json in nodejs | jsonworld</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    </head>
    <body>
    
    <div class="jumbotron text-center">
        <h1>Excel to Json in nodejs</h1>
        <p>source : <a href="https://jsonworld.com">jsonworld</a></p> 
    </div>
    
    <div class="container">
        <div class="row">
            <div class="col-sm-4 col-md-offset-4">
                <form id="form" enctype ="multipart/form-data" action="sendFile" method="post">
                <div class="form-group">
                <input type="file" name="file" class="form-control"/>
                <input type="submit" value="Upload" name="submit" class="btn btn-primary" style="float:right; margin-top:30px;">
                </form>    
            </div>
        </div>
    </div>
    
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 2016-11-27
      • 2020-11-09
      • 1970-01-01
      • 2016-12-18
      • 2023-02-14
      • 2022-10-01
      • 2023-01-19
      • 1970-01-01
      • 2022-08-11
      相关资源
      最近更新 更多