node.js - 如何使用 exceljs 从 Promise 中返回文档

标签 node.js api exceljs

我的 Node 经验有限,所以如果这是初级的,请原谅我。

我有一个 Controller 方法,它应该返回一个可下载的 Excel 文档。 我不确定应该如何返回文档以供下载,特别是围绕响应对象。

我不知道在哪里声明响应对象...

在我的测试 Express 项目中使用时,下载功能非常有用...因为您可以看到来自

的 res 响应对象

函数(req、res){}

然后我可以从中返回文档。

var Excel = require('exceljs');

app.get('/doexcel/', function (req, res) {
  var nameVal1 = req.params.name1;

  user.user.model('Contact').find({}, function (err, users1) {

    var workbook = new Excel.Workbook();
    var worksheet = workbook.addWorksheet('My Sheet');


    worksheet.addRow(['09/05/2019', 'Test Msg Title example ' + i, 'Test Message Body Example Example']);

    var filename = 'C:\\myStuff\\TestProjects\\NodeTestProjects\\ExpressExample\\files\\ExampleWriteFile.xlsx';
    workbook.xlsx.writeFile(filename)
      .then(function () {
        // done
        //res.send(200);
        console.log('written file');
      });

    /*stream file for download */
    res.status(200);
    res.setHeader('Content-Type', 'text/xlsx');
    res.setHeader(
      'Content-Disposition',
      'attachment; filename=teststream.xlsx'
    );
    workbook.xlsx.write(res)
      .then(function () {
        res.end()
      });

    /*stream file for download */

  });
});

因此,根据 PROD 项目中的一些现有 Controller ,我设置了如下所示的 Controller 。显然,所引用的“响应”对象不存在。

var Excel = require('exceljs');

//Controller Method
function getReport(clientId, query) {
    return new Promise(function (resolve, reject) {

        if (!query.filter.noteId) {
            return reject(new apiError.BadRequest("NoteId is a mandatory query parameter, usage: <url>?noteId=note123&<optional params>"));
        }

        //get report data from datasource
        var reportData = getReportData(clientId, query);

        //Build Workbook using exceljs
        var dataWorkbook = CreateWorkbook(reportData);

        return resolve(dataWorkbook);
    });
}

//Create Excel workbook
function CreateWorkbook(reportDataVal) 
{
    var datetime = new Date();
    var workbook = new Excel.Workbook();
    var worksheet = workbook.addWorksheet('Data_Report_' + datetime);

    worksheet.properties.outlineProperties = {
        summaryBelow: false,
        summaryRight: false,
        showDetail: false,
    };

    worksheet.addRow(['Random Data', 'More Random Data']);

    /*stream file for download */

    response.status(200);
    response.setHeader('Content-Type', 'text/xlsx');
    response.setHeader(
        'Content-Disposition',
        'attachment; filename=teststream.xlsx'
    );
    workbook.xlsx.write(response)
        .then(function () {
            response.end()
        });

    /*stream file for download */
}

在这种情况下,我应该如何或在哪里声明“响应”对象才能返回可下载的文档?

谢谢。

最佳答案

这里有两个选择:

  1. CreateWorkbook 返回工作簿,然后在路由处理程序中执行以下代码:
response.status(200);
response.setHeader('Content-Type', 'text/xlsx');
response.setHeader(
    'Content-Disposition',
    'attachment; filename=teststream.xlsx'
);
workbook.xlsx.write(response)
    .then(function () {
       response.end()
    });
  • 将 res 对象从路由处理程序传递到 CreateWorkbook 并在那里使用它:
  • //Create Excel workbook
    function CreateWorkbook(reportDataVal, res) 
    {
        var datetime = new Date();
        var workbook = new Excel.Workbook();
        var worksheet = workbook.addWorksheet('Data_Report_' + datetime);
    
        worksheet.properties.outlineProperties = {
            summaryBelow: false,
            summaryRight: false,
            showDetail: false,
        };
    
        worksheet.addRow(['Random Data', 'More Random Data']);
    
        /*stream file for download */
    
        response.status(200);
        response.setHeader('Content-Type', 'text/xlsx');
        response.setHeader(
            'Content-Disposition',
            'attachment; filename=teststream.xlsx'
        );
        workbook.xlsx.write(response)
            .then(function () {
                response.end()
            });
    
        /*stream file for download */
    }
    

    关于node.js - 如何使用 exceljs 从 Promise 中返回文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56160749/

    相关文章:

    node.js - {{#each ...}} 中的 Expressjs app.locals 无法访问

    javascript - 如何在 Electron 渲染的网页上调用 JavaScript 函数?

    web-services - 如何在一个soap对象中添加两个数组,用于magento中的帐单和送货地址?

    node.js - 在 exceljs 包中的 worksheet.eachRow() 中使用 wait 调用异步函数

    javascript - ExcelJS 卡住行

    node.js - 无法使用 Sequelize 连接到 GCP Postgres 数据库

    node.js - Apollo/Graphql、Postgres - 为什么此查询返回空值?

    security - RESTful API 中的 API key 、HTTP 身份验证与 OAuth

    c# - 是否可以直接从 C# 使用 Profiling API?

    exceljs - 货币格式为excelJS