后端代码**
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 => {//页面创建一个元素domconst 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);};
