后端代码**
service
//引入模块
import ejsexcel from 'ejsexcel';
import fs from 'fs';
async function outExcel(){
//读取excel模板
const templateBuffer = fs.readFileSync(__dirname + '/../template/demoTemplate.xlsx');
// 渲染数据生成文件流
const excelBuffer = await ejsexcel.renderExcel(templateBuffer, data);
// await fs.writeFileSync(outUrl, ejsBuffer); 创建excel文件,如果不需要保存,可以直接
//将渲染数据的文件流excelBuffer返回前端
//文件流返回
return excelBuffer;
}
controller
/ demo版优化意见导出
router.post('/demoOutXlsx', async (ctx) => {
//直接返回给不需要处理前端就行
ctx.body = await demoOutXlsx(ctx.request.body, ctx.state);
});
前端页面
// 任务//导出
export const demoOutXlsx = (data) => request({ url: '/researchTable/demoOutXlsx', method: 'post', data: data, responseType: "blob" });
let data = await demoOutXlsx({ check_id: 21 });
--------------------------------------
let data = await axios.post(
'http://127.0.0.1:4000/api/researchTable/demoOutXlsx',
{
check_id: 21
},
{ responseType: 'blob' }
);
data = data.data;
-------------------------------------------------
//上面两种不同axios请求方法效果一样,注意返回数据类型responseType: 'blob' 必须填写,不然返回的数据无法正确
识别,
//创建文件读取对象
const reader = new FileReader();
//读取文件流blob类型
reader.readAsDataURL(data);
reader.onload = e => {
//页面创建一个元素dom
const a = document.createElement('a');
//设置下载文件名称
a.download = '优化意见.xlsx';
// e.target.result 文件里的文本
a.href = e.target.result;
//将上面创建元素加入到BODY的尾部
document.body.appendChild(a);
//下载文件
a.click();
//删除元素
document.body.removeChild(a);
};