【问题标题】:Reading Excel file using node.js使用 node.js 读取 Excel 文件
【发布时间】:2015-03-04 17:16:38
【问题描述】:

好的,所以我正在使用FileUploader 模块将我的文件从角度上传到我的REST API

var uploader = $scope.uploader = new FileUploader({
    url: api.getUrl('uploadCompetence',null)
});

这被发送到以下POST函数:

        router.route('/api/uploadCompetence')
        .post(function (req, res) {

        // This is where i want to read the file

            var competence = Competence.build(req.body.location);
            competence.add(function (success) {
                    res.json({message: 'quote created!'});
                },
                function (err) {
                    res.status(err).send(err);
                });
        })

现在我的目标是读取excel 文件,然后将每一行添加到我的数据库中。

但是我不太确定如何从Node.js 读取文件我已经调试了我的服务器并且无法在任何地方找到该文件,但是从我的Angular 应用程序调用了 api

谁能把我推向正确的方向? :)

【问题讨论】:

  • 通过excel,你是什么意思?分号分隔的 CSV 文件,还是 .xlsx 文件?
  • 今天偶然发现:github.com/guyonroche/exceljs
  • @aludvigsen xlsx 但我不完全确定它实际上是在发送文件我在哪里可以检查你知道吗?
  • 我在我的一个项目中使用了node-xlsx。很容易使用。

标签: javascript angularjs node.js import-from-excel


【解决方案1】:

有几个不同的库可以解析 Excel 文件 (.xlsx)。我将列出两个我觉得有趣且值得研究的项目。

节点-xlsx

Excel 解析器和生成器。它是一个流行项目 JS-XLSX 的包装器,它是来自 Office Open XML 规范的纯 javascript 实现。

node-xlsx project page

解析文件示例

var xlsx = require('node-xlsx');

var obj = xlsx.parse(__dirname + '/myFile.xlsx'); // parses a file

var obj = xlsx.parse(fs.readFileSync(__dirname + '/myFile.xlsx')); // parses a buffer

ExcelJS

读取、操作电子表格数据和样式并将其写入 XLSX 和 JSON。这是一个活跃的项目。在撰写本文时,最新的提交是 9 小时前。我自己没有测试过这个,但是这个 api 看起来很广泛,有很多可能性。

exceljs project page

代码示例:

// read from a file
var workbook = new Excel.Workbook();
workbook.xlsx.readFile(filename)
    .then(function() {
        // use workbook
    });

// pipe from stream
var workbook = new Excel.Workbook();
stream.pipe(workbook.xlsx.createInputStream());

【讨论】:

    【解决方案2】:

    你也可以使用这个名为js-xlsx的节点模块

    1) 安装模块
    npm install xlsx

    2) 导入模块+代码sn-p

    var XLSX = require('xlsx')
    var workbook = XLSX.readFile('Master.xlsx');
    var sheet_name_list = workbook.SheetNames;
    var xlData = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);
    console.log(xlData);
    

    【讨论】:

    • 你将如何追加?
    • 对样式的支持很差。
    • @Charitha 请帮我检索每个数组中的标题列或空列值。
    • 它不适用于最近创建的文件或同时创建和读取。也不能使用二进制文件 excel 类型。 XLSX.readFile("recently_created_excelFilePath");
    • 我想将此数据添加到 mongo DB。我该怎么做?
    【解决方案3】:

    安装exceljs并使用以下代码,

    var Excel = require('exceljs');
    
    var wb = new Excel.Workbook();
    var path = require('path');
    var filePath = path.resolve(__dirname,'sample.xlsx');
    
    wb.xlsx.readFile(filePath).then(function(){
    
        var sh = wb.getWorksheet("Sheet1");
    
        sh.getRow(1).getCell(2).value = 32;
        wb.xlsx.writeFile("sample2.xlsx");
        console.log("Row-3 | Cell-2 - "+sh.getRow(3).getCell(2).value);
    
        console.log(sh.rowCount);
        //Get all the rows data [1st and 2nd column]
        for (i = 1; i <= sh.rowCount; i++) {
            console.log(sh.getRow(i).getCell(1).value);
            console.log(sh.getRow(i).getCell(2).value);
        }
    });
    

    【讨论】:

    • 不支持在表格中间插入包含合并单元格的新行。
    【解决方案4】:

    您可以使用 read-excel-file npm。

    在那, 您可以指定 JSON SchemaXLSX 转换为 JSON 格式。

    const readXlsxFile = require('read-excel-file/node');
    
    const schema = {
        'Segment': {
            prop: 'Segment',
            type: String
        },
        'Country': {
            prop: 'Country',
            type: String
        },
        'Product': {
            prop: 'Product',
            type: String
        }
    }
    
    readXlsxFile('sample.xlsx', { schema }).then(({ rows, errors }) => {
        console.log(rows);
    });
    

    【讨论】:

      【解决方案5】:

      有用的链接

      https://ciphertrick.com/read-excel-files-convert-json-node-js/

       var express = require('express'); 
          var app = express(); 
          var bodyParser = require('body-parser');
          var multer = require('multer');
          var xlstojson = require("xls-to-json-lc");
          var xlsxtojson = require("xlsx-to-json-lc");
          app.use(bodyParser.json());
          var storage = multer.diskStorage({ //multers disk storage settings
              destination: function (req, file, cb) {
                  cb(null, './uploads/')
              },
              filename: function (req, file, cb) {
                  var datetimestamp = Date.now();
                  cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1])
              }
          });
          var upload = multer({ //multer settings
                          storage: storage,
                          fileFilter : function(req, file, callback) { //file filter
                              if (['xls', 'xlsx'].indexOf(file.originalname.split('.')[file.originalname.split('.').length-1]) === -1) {
                                  return callback(new Error('Wrong extension type'));
                              }
                              callback(null, true);
                          }
                      }).single('file');
          /** API path that will upload the files */
          app.post('/upload', function(req, res) {
              var exceltojson;
              upload(req,res,function(err){
                  if(err){
                       res.json({error_code:1,err_desc:err});
                       return;
                  }
                  /** Multer gives us file info in req.file object */
                  if(!req.file){
                      res.json({error_code:1,err_desc:"No file passed"});
                      return;
                  }
                  /** Check the extension of the incoming file and 
                   *  use the appropriate module
                   */
                  if(req.file.originalname.split('.')[req.file.originalname.split('.').length-1] === 'xlsx'){
                      exceltojson = xlsxtojson;
                  } else {
                      exceltojson = xlstojson;
                  }
                  try {
                      exceltojson({
                          input: req.file.path,
                          output: null, //since we don't need output.json
                          lowerCaseHeaders:true
                      }, function(err,result){
                          if(err) {
                              return res.json({error_code:1,err_desc:err, data: null});
                          } 
                          res.json({error_code:0,err_desc:null, data: result});
                      });
                  } catch (e){
                      res.json({error_code:1,err_desc:"Corupted excel file"});
                  }
              })
          }); 
          app.get('/',function(req,res){
              res.sendFile(__dirname + "/index.html");
          });
          app.listen('3000', function(){
              console.log('running on 3000...');
          });
      

      【讨论】:

        【解决方案6】:

        安装'spread_sheet'节点模块,它将从本地电子表格中添加和获取行

        【讨论】:

        • 一个例子有助于回答这个问题
        猜你喜欢
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多