需求描述:

客户网页上填一个Excel表格,数据存到数据库,这个导出接口要做的就是从数据库中的获取数据并填充到模板文件,最后通过response返给前端一个下载链接,用户即可获取填充好的Excel文件。

方案一:

一开始使用的是easypoi,发现当填充一行数据时是OK的,但是如果是多行数据,处理对象集合会抛异常,所以在小组长的建议下最终放弃选择使用EasyExcel;

方案二:

组长给了个图示 直接看懂 如下两图:

模糊的数据是模板数据不用关注,目的是往空格里填充数据

左边模板,右边结果,一目了然,我觉得挺简单写了个demo也成功了(文件生成在本地)

后面我想着网上找找样例,把输出流设置到response里面应该不难,我自己写好了调试却发现一直报错,各种改都不行,我调试+修改搞了一上午,后面我跟组长汇报了情况,他说他来改,半小时就改好了。

我写的代码是这样的:

<!--EasyExcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>
@GetMapping("/exportExcel")@ApiOperation(value = "导出", notes = "导出", httpMethod = "GET")@ApiImplicitParams(value = {@ApiImplicitParam(name = "code", paramType = "query", value = "单位编码", required = true, dataType = "String", example = "12312311")})public void exportExcel(@RequestParam String code, HttpServletResponse response)throws Exception {reportService.exportExcel(code, response);}
  @Overridepublic void exportExcel(String code, HttpServletResponse response) throws Exception{//先查询详情列表是否存在List<ReportDetailDO> reportDetailDOS = reportDetailDAO.select(ReportDetailDO.builder().code(code).build());//不存在时抛异常——未查询到填报记录if (CollectionUtils.isEmpty(reportDetailDOS)) {throw new BusException(ResultEnum.NO_FILLED_IN_RECORDS_FOUND);}ReportOrgDO reportOrgDO = reportOrgDAO.selectOne(ReportOrgDO.builder().code(code).build());String templateFileName = "template/vnd.xlsx";// 这里URLEncoder.encode可以防止中文乱码String fileName = URLEncoder.encode(reportOrgDO.getName() + TABLE_NAME+".xlsx", "UTF-8").replaceAll("\\+", "%20");//文件名=公司名+表名response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));ServletOutputStream outputStream = response.getOutputStream();InputStream templateFile = this.getClass().getClassLoader().getResourceAsStream(templateFileName);ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateFile).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();//开启自动换行,自动换行表示每次写入一条list数据是都会重新生成一行空行,此选项默认是关闭的,需要提前设置为trueFillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();List<ReportDetailExcelDTO>list=OrikaHelper.convertList(reportDetailDOS, ReportDetailExcelDTO.class);
excelWriter.fill(list, fillConfig, writeSheet);excelWriter.finish();}

用户导出过度的类如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("汇报详情Excel")
public class ReportDetailExcelDTO {@ExcelProperty("2019年度")private String content1;@ExcelProperty("2020年度")private String content2;@ExcelProperty("2021年度")private String content3;@ExcelProperty("2022年度")private String content4;@ExcelProperty("备注")private String remark;
}

组长是这样写的:

 <!--EasyExcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version></dependency>
//省略获取数据对象集合的方法。。。(list)String templateFileName = "template/vnd.xlsx";// 这里URLEncoder.encode可以防止中文乱码String fileName = URLEncoder.encode(reportOrgDO.getName() + TABLE_NAME + ".xlsx", "UTF-8").replaceAll("\\+", "%20");//文件名=公司名+表名response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));//ReportDetailDO是数据对象的泛型 相当于数据库的实体类 不需要加特殊的EasyExcel注解InputStream templateFile = this.getClass().getClassLoader().getResourceAsStream(templateFileName);EasyExcel.write(response.getOutputStream(), ReportDetailDO.class).withTemplate(templateFile).sheet().doFill(Optional.ofNullable(list).orElse(new ArrayList<>()));

组长简简单单改了下依赖的版本,业务代码写了几行然后云淡风轻告诉我可以了,我当时真的很不理解,心情很复杂,一方面觉得自己为什么搞不出来,另外觉得像改变版本这种问题真的很难找到排查出来,经历这件事让我觉得,同样是程序员,有的人还在埋头苦苦调试找原因,有的人轻而易举的可以找到问题并修改,阅历和经验决定了你的实力,自己还是太嫩,路漫漫其修远兮...

另外我发现我用postman居然测不成功,最后用swagger才能返回一个下载链接,无语。。。

这件事给我的启发是,不要新高气傲觉得一切OK的样子,实际上如果网上没有一些开源代码,自己是很难顺利完成某个业务的编写,还是要对技术保持敬畏,自己平时要学会复盘和总结,争取不会被同一个问题难倒两次。另外还要感谢为我们开路的大佬,正所谓前人种树,后人乘凉,respect!

【Java结合EasyExcel,模板文件填充并导出Excel】相关推荐

  1. java实现word模板文件填充

    核心 import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 使用该包实现 word 文件填充,同时支持 pdf.excel ...

  2. JAVA中.jsp模板文件AJAX异步请求 - 数据渲染问题

    JAVA中.jsp模板文件AJAX异步请求 - 数据渲染失败,谁的过失? 后端已经查询出来结果,但是返回的API接口response查看不到对应的信息.(即:后台有,前台没有) 原因分析: 是因为AJ ...

  3. Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

    Java使用ftl模板文件生成Word 一.写在前面 最近在项目中使用打印功能,发现这个功能我已经写过多次了,下面这个文章的发步日期在2020年,不得不感慨时间之快啊. https://blog.cs ...

  4. Java操作word模板文件

    关于导出word文档,之前想过用ireport但模板文件比较复杂不容易画.所以采取了Java操作word文件,替换word中的元素方法 模板文件如下 单位名称:$ACCTNAME$ NO: $SN$ ...

  5. 使用新版本EasyExcel优雅的导入和导出Excel文件

    一.需求描述 最近系统后台有个关于使用Excel文件导出数据的需求,首先想到了POI和阿里的EasyExcel.经过技术选型和结合具体场景,最终决定使用EasyExcel. 使用过程中,遇到了一些问题 ...

  6. Java 将xml模板动态填充数据转换为word文档

    需要用到的jar包: commons-codec-1.10.jar freemarker-2.3.21.jar jacob-1.6.jar 实现思路: 1.先将word文档另存为 : Word 200 ...

  7. java 读取html模板文件_Java根据html模板创建 html文件

    1,写JAVA代码 public String patientsindex(HttpServletRequest request){ //获得当前项目的绝对路径 String t=Thread.cur ...

  8. java生成excel文件步骤_java导出Excel文件的步骤全纪录

    一.背景 当前b/s模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用excel打开(电信系统.银行系统).或者是:我们已经习惯用excel打印.这样在我们实际 ...

  9. 上传文件、下载文件、数据导出excel表格整理模板

    上传文件 思路: 1.设置上传的路径,上传名 2.在这个路径path上新建名为filename的文件 file 3.判断该文件的父目录是否存在,若不存在就新建一个 4.用.transferTo方法将文 ...

最新文章

  1. linux文本分析利器awk
  2. 域控制器建立以及一般配置
  3. 迁移物理solaris系统至一个区域
  4. Visual Studio 2010 Ultimate测试体系结构
  5. 基于Codis的Redis集群部署
  6. 【逆向】UE4 渲染流程分析
  7. spring中Validation设计与实现
  8. 解决nginx proxy_pass反向代理cookie,session丢失的问题
  9. CEO 赠书 | 打破创新神话,揭示创新本质
  10. 【转】01.Dicom 学习笔记-DICOM C-Store 消息服务
  11. MATLAB基础教程(10)——二维中的数据可视化
  12. JavaScript表单处理的返回值问题
  13. 逐渐“狗化”!网易云音乐控诉酷狗像素级抄袭,酷狗高管反击...
  14. BlogEngine.Net架构与源代码分析系列part2:业务对象——共同的父类BusinessBase
  15. 《麦肯锡方法》第3章“二八法则”与其他-思维导图
  16. <论文阅读>TARE: A Hierarchical Framework for Efficiently Exploring Complex 3D Environments
  17. 模块化编辑器综合评测:Craft、Notion、FlowUs
  18. Kaggle教程 机器学习中级3 分类变量
  19. IP地址和MAC 地址
  20. 2019春招CVTE面试(1)

热门文章

  1. 2021全球什么牌子自行车质量好中国十大老牌自行车品牌排行榜
  2. 小红书显示没能找到服务器,微博崩了,小红书也崩了!原因竟然是因为这个?...
  3. AdaGrad、RMSProp、Adam优化器
  4. stm32定时器总结心得
  5. 何谓理性?又何谓感性?
  6. 名帖314 林则徐 行书《对联十二幅》
  7. 华为eNSP基础到实战
  8. 使用C++模拟实现道具店购物功能
  9. ( 哈希表) 594. 最长和谐子序列 ——【Leetcode每日一题】
  10. Java死锁(synchronized)