后端代码**

    service

    1. //引入模块
    2. import ejsexcel from 'ejsexcel';
    3. import fs from 'fs';
    4. async function outExcel(){
    5. //读取excel模板
    6. const templateBuffer = fs.readFileSync(__dirname + '/../template/demoTemplate.xlsx');
    7. // 渲染数据生成文件流
    8. const excelBuffer = await ejsexcel.renderExcel(templateBuffer, data);
    9. // await fs.writeFileSync(outUrl, ejsBuffer); 创建excel文件,如果不需要保存,可以直接
    10. //将渲染数据的文件流excelBuffer返回前端
    11. //文件流返回
    12. return excelBuffer;
    13. }

    controller

    1. / demo版优化意见导出
    2. router.post('/demoOutXlsx', async (ctx) => {
    3. //直接返回给不需要处理前端就行
    4. ctx.body = await demoOutXlsx(ctx.request.body, ctx.state);
    5. });

    前端页面

    1. // 任务//导出
    2. export const demoOutXlsx = (data) => request({ url: '/researchTable/demoOutXlsx', method: 'post', data: data, responseType: "blob" });
    3. let data = await demoOutXlsx({ check_id: 21 });
    4. --------------------------------------
    5. let data = await axios.post(
    6. 'http://127.0.0.1:4000/api/researchTable/demoOutXlsx',
    7. {
    8. check_id: 21
    9. },
    10. { responseType: 'blob' }
    11. );
    12. data = data.data;
    13. -------------------------------------------------
    14. //上面两种不同axios请求方法效果一样,注意返回数据类型responseType: 'blob' 必须填写,不然返回的数据无法正确
    15. 识别,
    16. //创建文件读取对象
    17. const reader = new FileReader();
    18. //读取文件流blob类型
    19. reader.readAsDataURL(data);
    20. reader.onload = e => {
    21. //页面创建一个元素dom
    22. const a = document.createElement('a');
    23. //设置下载文件名称
    24. a.download = '优化意见.xlsx';
    25. // e.target.result 文件里的文本
    26. a.href = e.target.result;
    27. //将上面创建元素加入到BODY的尾部
    28. document.body.appendChild(a);
    29. //下载文件
    30. a.click();
    31. //删除元素
    32. document.body.removeChild(a);
    33. };