node.js - 如何使用 exceljs 从 Promise 中返回文档
问题描述
我的节点经验有限,所以如果这是初级的,请原谅我。
我有一个控制器方法,它应该返回一个可下载的 excel 文档。我不确定我应该如何返回要下载的文档,特别是在响应对象周围。
我不确定在哪里声明响应对象...
下载功能在我的测试快递项目中使用时效果很好......你可以看到 res 响应对象来自
function(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 项目中的一些现有控制器之后,我设置了如下所示的控制器。显然,被引用的“响应”对象不存在。
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 */
}
在这种情况下,我应该如何或在哪里声明“响应”对象以启用可下载的文档?
谢谢你。
解决方案
您在这里有两个选择:
- 从中返回工作簿
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 */
}
推荐阅读
- perl - 如何以特定格式重命名文件夹中的多个文件?
- python - 如何在正则表达式标识的两个特定列表位置之间连接列表的元素(字符串)?
- python - 从二维列表中保存的三元组单词构造句子
- reactjs - 在路径中使用参数后,两个组件在反应中混合
- css - 如果孩子有“flex:1”,css“resize:horizontal”不起作用
- python - 按照它们出现在我的驱动器上的顺序读取 csv 文件
- reactjs - React Router - 带有:id 的路径对于 HOC 包装的组件无法正常工作
- android - 从 Android Player SDK 中的 adb.exe 获取“错误:设备脱机”/设置 Unity Remote 5(已解决)
- hive - 我在尝试运行我的 sqoop 作业时出错(尝试将表从 oracle 复制到 hive)
- c# - WPF:如何将图像动态添加到数据网格?