栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Vue + JAVA 实现Excel的模板文件下载

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Vue + JAVA 实现Excel的模板文件下载

文章目录
  • 前言

  • 一、JAVA后端接口设计

  • 二、Vue前端页面设计

  • 总结


前言

实现前端页面基于 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.前端的下载按钮设计
    
      导出模板
    

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模板文件才是正常的。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/424020.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号