【问题标题】:How to send buffer data in express?如何快速发送缓冲区数据?
【发布时间】:2018-12-06 09:03:18
【问题描述】:

我正在尝试创建一个 excel 文件并将其发送给客户端。客户端应该通过ajax请求下载文件,因为我需要过滤参数。

我正在使用 excel4node 包创建一个 excel 文件。

我编写了下面的代码,它现在可以工作,但我怀疑如果我的数据大于缓冲区会怎样。这是使用缓冲区的正确方法吗? (请用 writeToBuffer 方法检查该行)

    const xl = require('excel4node');

    const excelCreator = function (data) {...}

    app.post('/api/excel', jsonParser, (req, res) => {

      let reqObj = {
        method: 'post',
        url: apiUrl + '/MemberService';,
        headers: {
          'Content-Type': 'application/json'
        },
        data: req.body
      };

      axios(reqObj)
        .then(response => {
          res.body = responseHandler(response); // a helper function to set res object

          let data = res.body.Data;

          res.setHeader('Content-Disposition', 'attachment; filename=' + 'excel.xlsx');
          res.type('application/octet-stream');
          res.body.Data = null;

          excelCreator(data).writeToBuffer().then(function (buffer) {
            res.body.Data = buffer;
            res.send(res.body);
          });

        })
        .catch(...);
    });

【问题讨论】:

    标签: node.js express buffer


    【解决方案1】:
               Package used:
               npm install xlsx --save
    
    
                import * as XLSX from 'xlsx';
    
                var json =[
                    {
                    'Fullname' : "Ram Shrestha",
                    'Date Of Birth':"1996-06-01",
                    'Gender': "Male",
                    'Salary':"80000",
                    'Designation':"Senior"
                   },
                   {
                    'Fullname' : "Ramesh Shrestha",
                    'Date Of Birth':"1997-06-01",
                    'Gender': "Male",
                    'Salary':"90000",
                    'Designation':"Senior"
                  }
               ];
    
                const fileName = "Sample";
    
                const workBook: XLSX.WorkBook = XLSX.utils.book_new();
                
                const workSheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json);
        
                XLSX.utils.book_append_sheet(workBook, workSheet, `${excelFileName}`)
                const buffer = XLSX.write(workBook, { bookType: 'xlsx', bookSST: false, type: 'base64' });
        
                res.writeHead(200, [
                    ['Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
                    ["Content-Disposition", "attachment; filename=" + `${fileName}.xlsx`]
                ]);
                res.end(Buffer.from(buffer, 'base64'));
    

    希望它有效。

    【讨论】:

      【解决方案2】:

      先安装SheetJS js-xlsx

      npm --save install xlsx
      

      然后您可以使用 Express 发送此响应:

      const xlsx = require('xlsx')
      
      var wb = xlsx.utils.book_new();
      
      var table = [['a', 'b', 'c'], ['1', '2', '3']]
      var ws = xlsx.utils.aoa_to_sheet(table);
      xlsx.utils.book_append_sheet(wb, ws, 'test');
      
      // write options
      const wopts = { bookType: 'xlsx', bookSST: false, type: 'base64' };
      const buffer = xlsx.write(wb, wopts);
      
      res.writeHead(200, [['Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']]);
      res.end(new Buffer(buffer, 'base64'));
      

      请随时查看文档 https://www.npmjs.com/package/xlsx

      【讨论】:

      • 谢谢。我花了大约 3 个小时来研究为什么“二进制”响应在以快递方式发送时无法正确打开。
      • 不推荐使用新的缓冲区格式。你可以使用“res.end(new Buffer(buffer, 'base64'))”;
      • 使用缓冲区的新方法:stackoverflow.com/a/52257416/4435313
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      相关资源
      最近更新 更多