• 前后端数据导入导出Excel


    一:导入

            Excel有读取也便有写出,Hutool针对将数据写出到Excel做了封装。

    原理

    Hutool将Excel写出封装为ExcelWriter,原理为包装了Workbook对象,每次调用merge(合并单元格)或者write(写出数据)方法后只是将数据写入到Workbook,并不写出文件,只有调用flush或者close方法后才会真正写出文件。

    由于机制原因,在写出结束后需要关闭ExcelWriter对象,调用close方法即可关闭,此时才会释放Workbook对象资源,否则带有数据的Workbook一直会常驻内存。

            后端接口:参数response=》在response中去获得输出流,写出数据。

    1. /**
    2. * 批量导出
    3. */
    4. @PostMapping("/export")
    5. public void exportData(HttpServletResponse response) throws IOException {
    6. ExcelWriter writer = ExcelUtil.getWriter(true);
    7. //1.全部导出 先查询所有数据
    8. List list = sysOrderService.list();
    9. //写出文件
    10. writer.write(list,true);
    11. //设置导出浏览器的格式
    12. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
    13. //attachment 附件的形式下载 导出excel
    14. response.setHeader("Content-Disposition", "attachment; filename="
    15. + URLEncoder.encode("订单表", "UTF-8")+".xlsx");
    16. //创建输出流对象
    17. ServletOutputStream outputStream = response.getOutputStream();
    18. //刷新完毕之后,关闭输出流
    19. writer.flush(outputStream,true);
    20. writer.close();
    21. //双重保险进行关闭
    22. outputStream.flush();
    23. outputStream.close();
    24. }

            前端操作按钮

    1. <el-form-item>
    2. <el-button type="primary" plain @click="exportUser">导出el-button>
    3. el-form-item>

      导出时如果没有设置请求头token的值会出现如下问题

    因此设置请求头时必不可少的。

    headers:{

                token: this.$cookie.get('token')

    }

    1. // 导出用户,通过blob
    2. exportUser () {
    3. axios({
    4. method: 'post',
    5. url: this.$http.adornUrl("/sys/order/export"),
    6. responseType: 'blob',
    7. headers:{
    8. token: this.$cookie.get('token')
    9. }
    10. }).then((res) => {
    11. c console.log(res)
    12. //创建一个a标签
    13. const link = document.createElement('a')
    14. // 规定文件类型 res就是返回的数据流,这里是excel类型
    15. let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});
    16. //设置标签的 style.display
    17. link.style.display = 'none'
    18. //设置地址 用于创建 URL 的 Blob 对象
    19. link.href = URL.createObjectURL(blob);
    20. console.log("href:"+link.href)
    21. //生成随机数 作为文件名称
    22. let num = ''
    23. for(let i=0;i < 10;i++){
    24. num += Math.ceil(Math.random() * 10)
    25. }
    26. link.setAttribute('download', num + '.xlsx')
    27. //添加到树中
    28. document.body.appendChild(link)
    29. link. Click()x
    30. document.body.removeChild(link)
    31. }).catch(error => {
    32. console.log(error)
    33. })
    34. },

    还要注意的一点是,导出的Excel表格的表头是与实体类的属性相对应的。我们需要设置中文就必须加上@Alias设置别名。

    导出结果如下:

    二:导入

            后端接口:

            读取Excel内容的封装,通过构造ExcelReader对象,指定被读取的Excel文件、流或工作簿,然后调用readXXX方法读取内容为指定格式。        

    1. /**
    2. * 导入
    3. */
    4. @PostMapping("/import")
    5. public void importData( MultipartFile file) throws Exception {
    6. ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
    7. //读取到的数据放入List<>中
    8. List orderList = reader.readAll(SysOrderEntity.class);
    9. //持久化导数据库
    10. sysOrderService.saveBatch(orderList);
    11. }

    前端:

    :action="importUrl"  访问后端接口的路径地址。

    :headers="tokenInfo"  请求头的设置(没有则会报401错误,无效令牌)

    1. <el-form-item>
    2. <el-upload
    3. :action="importUrl"
    4. :headers="tokenInfo"
    5. :beforeUpload="beforeUpload"
    6. :showUploadList="false"
    7. :multiple="true">
    8. <el-button type="primary" @click="importU()"> 导入 el-button>
    9. el-upload>
    10. el-form-item>

    选择Excel文件,导入

    参考:

    eeOffice文档操作(Hutool-poi) - Excel生成-ExcelWriter - 《Hutool v4.5.15 参考文档》 - 书栈网 · BookStack

  • 相关阅读:
    如何利用kakaoTalk进行营销?
    jQuery小结五
    ​iOS安全加固方法及实现
    数字图像处理实验(四)|图像压缩与编码实验{JPGE编码、离散余弦变换DCT、图像分块dctmtx|blkproc}(附matlab实验代码和截图)
    百度智能云创新业务部总经理李想:发挥AI企业科技创新优势 助力职业教育人才扬帆远航
    【JAVA数据结构】JAVA数据结构必备知识:泛型与包装类
    golang的问题2
    点云从入门到精通技术详解100篇-点云表面几何特征检测及其应用(续)
    delphi xe FMX里的窗口如何像处理像VCL里的消息又一示例
    【pointNet】基于pointNet的三维点云目标分类识别matlab仿真
  • 原文地址:https://blog.csdn.net/weixin_54226626/article/details/133843283