文章目录


前言

实现前端页面基于 Vue, 后端基于 JAVA ,最终通过前台页面点击下载excel模板文件,调用后端接口返回模板文件的输出流,将模板excel下载到本地。

需要注意的是:因为在实际应用场景中,后端是用SpringBoot打Jar包的方式部署到服务器中,所以需要后端适配对应的模板文件能够在服务器中,能够正常读取;本地运行代码的时候,需要注意,先使用 mvn clean,然后再 mvn install之后再运行代码,不然可能会报找不到对应的excel模板文件


一、JAVA后端接口设计

1.引入excel模板文件

存在excel模板文件的路径(resources目录下):

template/excel/template.xlsx

 

2.excel模板下载接口实现

controller层接口设计:

@RestController
@RequiredArgsConstructor
@Api(tags = "excel:excel操作相关控制")
@RequestMapping("/api/excel")
public class ExcelController {

    @Autowired
    private IExcelService excelService;

    @GetMapping("/excelTemplate")
    @ApiOperation("下载药物的excel导入模板")
    public void downloadExcelTemplate(HttpServletResponse response) throws IOException {
        excelService.downloadExcelTemplate(response);
    }
}

具体的业务实现逻辑:

package me.zhengjie.modules.excel.service.impl;

import cn.hutool.core.io.IoUtil;
import me.zhengjie.modules.excel.service.IExcelService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URLEncoder;


@Service
public class ExcelServiceImpl implements IExcelService {

    private static final Logger LOGGER = LoggerFactory.getLogger(ExcelServiceImpl.class);

    private static final String EXCEL_TEMPLATE_PATH = "template/excel/template.xlsx";


    @Override
    public void downloadExcelTemplate(HttpServletResponse response) {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(EXCEL_TEMPLATE_PATH);

        ServletOutputStream out = null;
        BufferedInputStream bis = new BufferedInputStream(inputStream);
        int buffer = 1024 * 10;
        byte[] data = new byte[buffer];
        try {
            String fileName = URLEncoder.encode("template.xlsx", "UTF-8");
            response.setContentType("multipart/form-data");
            response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
            int read;
            out = response.getOutputStream();
            while ((read = bis.read(data)) != -1) {
                out.write(data, 0, read);
            }
            out.flush();
        } catch (Exception ex) {
            IoUtil.close(out);
            LOGGER.error("下载excel导入模板失败", ex);
        } finally {
            IoUtil.close(inputStream);
        }
    }
}

3.启动后端服务

后端的接口读取Excel设计成从Jar包的路径中获取的,所以本地启动的时候,先执行 mvn clean, 然后再执行 mvn install, 最后再启动程序

 

 

二、Vue前端页面设计

1.excel模板下载接口定义

export function downloadExcelTemplate() {
  return request({
    url: '/api/excel/excelTemplate',
    method: 'get',
    responseType: 'blob'
  })
}

2.前端的下载按钮设计

    <el-button
      slot="left"
      type="warning"
      size="mini"
      style="margin-left: 60px"
      @click="downLoadTemplate()"
    >
      导出模板
    </el-button>

3.vue下载模板文件的方法

downLoadTemplate() {
      downloadExcelTemplate().then(res => {
        console.log(res)
        const fileName = '模板文件'
        const url = window.URL.createObjectURL(new Blob([res]))
        const link = document.createElement('a')
        link.style.display = 'none'
        link.href = url
        link.setAttribute('download', fileName + '.xlsx')
        document.body.appendChild(link)
        link.click()
        // 下载完成移除元素
        // document.body.removeChild(link)
        // 释放掉blob对象
        // window.URL.revokeObjectURL(url)
      }).catch(err => {
        console.log(err.response.data.message)
      })
    }

4.具体实现效果

 

总结

后端接口设计的时候,没有结合线上的实际情况,本地可以正常运行,打Jar包部署到开发环境,下载模板文件报错,查询报错日志发现是路径的问题,没有考虑Jar包中的模板文件实际路径。

vue下载的接口编写时,没有指定响应的类型,responseType: 'blob',没有报错,但是下载的excel文件是损坏的,打开不了,重新指定了blob格式的响应数据,下载的excel模板文件才是正常的。

要勤思考、多动手,实践出真知!

Logo

前往低代码交流专区

更多推荐