马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
媒介:
Excel 导出在项目开发中是一个非经常见的业务场景,通过 Java 相干的类库可以轻松实现 Excel 的读写利用,常见的类库有 Apache POI、EasyPoi 和 EasyExcel,本篇我们要分享的是利用 EasyExcel 完成复杂表头的 Excel 导出,渴望可以资助到有须要的朋侪。
模拟业务场景
假设有一个 Excel 的导出需求,表头如下:
对于这种比力复杂的表头假如实用 Apache POI 来实现会比力的贫困,这里我们利用 EasyExcel 来实现,将会比力简单。
Spring Boot 集成 EasyExcel
Spring Boot 集成 EasyExcel 着实就是引入依靠即可利用,pom.xml 引入依靠如下:
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>easyexcel</artifactId>
- <version>3.2.1</version>
- </dependency>
复制代码 EasyExcel Github 地点
EasyExcel 在 Github 上有 33K Stars,是阿里巴巴开源的,但很遗憾,迩来公布停更了,未来将渐渐进入维护模式,将继承修复 Bug,但不再自动新增功能,据相识,EasyExcel 作者玉箫客岁已经从阿里去职,迩来他公布启动 EasyExcel-Plus 项目,称这个新版本将在原有的根本上进一步提升性能和扩展功能。
创建 VO 类
在字段名上加上 @ExcelProperty 注解就可以实现上面我们这种较为复杂的 Excel 表头,创建实体类如下:
- package com.my.study.pojo.vo;
- import com.alibaba.excel.annotation.ExcelProperty;
- import com.alibaba.excel.annotation.write.style.ColumnWidth;
- import io.swagger.annotations.ApiModelProperty;
- import lombok.Data;
- /**
- * @ClassName: InterviewInformationVO
- * @Author: Author
- * @Date: 2024/11/13 19:31
- * @Description:
- */
- @Data
- @ColumnWidth(20)
- public class InterviewInformationVO {
- @ApiModelProperty("姓名")
- @ExcelProperty(index = 0, value = {"面试记录表", "姓名"})
- @ColumnWidth(15)
- private String name;
- @ApiModelProperty("年龄")
- @ExcelProperty(index = 1, value = {"面试记录表", "基本信息", "年龄"})
- @ColumnWidth(15)
- private int age;
- @ApiModelProperty("性别")
- @ExcelProperty(index = 2, value = {"面试记录表", "基本信息", "性别"})
- @ColumnWidth(15)
- private String sex;
- @ApiModelProperty("籍贯")
- @ExcelProperty(index = 3, value = {"面试记录表", "基本信息", "籍贯"})
- @ColumnWidth(15)
- private String nativePlace;
- @ApiModelProperty("自我评价")
- @ExcelProperty(index = 4, value = {"面试记录表", "自我评价"})
- @ColumnWidth(15)
- private String selfEvaluation;
- @ApiModelProperty("沟通能力分")
- @ExcelProperty(index = 5, value = {"面试记录表", "一轮面试","面试官A","沟通能力分"})
- @ColumnWidth(15)
- private int cmmunicationAkillsScore1A;
- @ApiModelProperty("专业能力分")
- @ExcelProperty(index = 6, value = {"面试记录表", "一轮面试","面试官A","专业能力分"})
- @ColumnWidth(15)
- private int professionalAbilityScore1A;
- @ApiModelProperty("沟通能力分")
- @ExcelProperty(index = 7, value = {"面试记录表", "一轮面试","面试官B","沟通能力分"})
- @ColumnWidth(15)
- private int cmmunicationAkillsScore1B;
- @ApiModelProperty("专业能力分")
- @ExcelProperty(index = 8, value = {"面试记录表", "一轮面试","面试官B","专业能力分"})
- @ColumnWidth(15)
- private int professionalAbilityScore1B;
- @ApiModelProperty("沟通能力分")
- @ExcelProperty(index = 9, value = {"面试记录表", "二轮面试","面试官A","沟通能力分"})
- @ColumnWidth(15)
- private int cmmunicationAkillsScore2A;
- @ApiModelProperty("专业能力分")
- @ExcelProperty(index = 10, value = {"面试记录表", "二轮面试","面试官A","专业能力分"})
- @ColumnWidth(15)
- private int professionalAbilityScore2A;
- @ApiModelProperty("沟通能力分")
- @ExcelProperty(index = 11, value = {"面试记录表", "二轮面试","面试官B","沟通能力分"})
- @ColumnWidth(15)
- private int cmmunicationAkillsScore2B;
- @ApiModelProperty("专业能力分")
- @ExcelProperty(index = 12, value = {"面试记录表", "二轮面试","面试官B","专业能力分"})
- @ColumnWidth(15)
- private int professionalAbilityScore2B;
- }
复制代码 留意看我利用在段上的注解 @ExcelProperty(index = 5, value = {“口试记录表”, “一轮口试”,“口试官A”,“沟通本领分”}),这简单的一行就实现了表头的归并处理处罚。
导出代码
导出我们选择利用输出流的方式直接返回,固然也可以导出到指定位置,代码如下:
- package com.my.study.controller;
- import cn.hutool.core.date.DateUtil;
- import com.alibaba.excel.EasyExcel;
- import com.my.study.pojo.vo.InterviewInformationVO;
- import io.swagger.annotations.Api;
- import io.swagger.annotations.ApiOperation;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- import javax.servlet.http.HttpServletResponse;
- import java.io.File;
- import java.io.IOException;
- import java.net.URLEncoder;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- /**
- * @ClassName: MyExcelController
- * @Author: Author
- * @Date: 2024/11/13 19:19
- * @Description:
- */
- @RestController
- @RequestMapping("/excel")
- @Api(tags = {"【Excel 导出控制层】"})
- @Slf4j
- public class MyExcelController {
- @PostMapping("/export")
- public void export(HttpServletResponse response) {
- try {
- List<InterviewInformationVO> exportList = new ArrayList<>();
- buildInterviewInformation(exportList);
- // 文件名中文名需要转义
- String fileName = URLEncoder.encode("面试记录表-" + DateUtil.format(new Date(), "yyyyMMddHHmmss"), "UTF-8");
- response.setContentType("application/x-download;charset=utf-8");
- response.addHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
- EasyExcel.write(response.getOutputStream(), InterviewInformationVO.class).sheet("sheet1").doWrite(exportList);
- } catch (IOException e) {
- log.error("面试记录表导出失败,失败原因:{}", e.getMessage());
- e.printStackTrace();
- }
- }
- public void buildInterviewInformation(List<InterviewInformationVO> exportList) {
- InterviewInformationVO interviewInformationVO = new InterviewInformationVO();
- interviewInformationVO.setName("张三");
- interviewInformationVO.setAge(25);
- interviewInformationVO.setSex("男");
- interviewInformationVO.setNativePlace("湖北");
- interviewInformationVO.setSelfEvaluation("我是一个工作狂");
- interviewInformationVO.setCmmunicationAkillsScore1A(90);
- interviewInformationVO.setCmmunicationAkillsScore1B(85);
- interviewInformationVO.setProfessionalAbilityScore1A(90);
- interviewInformationVO.setProfessionalAbilityScore1B(90);
- interviewInformationVO.setCmmunicationAkillsScore1A(85);
- interviewInformationVO.setCmmunicationAkillsScore1B(80);
- interviewInformationVO.setProfessionalAbilityScore1A(75);
- interviewInformationVO.setProfessionalAbilityScore1B(80);
- exportList.add(interviewInformationVO);
- }
-
- }
复制代码 触发导出,效果如下:
实现了我们开始说的表头效果,导出效果符合预期。
我们并没有写多少代码,就完成了看起来比力复杂的表头,这就是 EasyExcel 带来效果,当前 EasyExcel 在内存管理上也有显着的上风。
方式二实现表头
上面我们利用注解的方式实现了表头效果,下面我们利用代码的方式完成表头功能,代码如下:
触发导出效果如下:
导出效果符合预期,利用代码来实现表头也很轻易,但个人更喜欢利用注解来实现。
总结:本篇简单分享利用 EasyExcel 来实现较为复杂的表头导出 Excel,感谢 EasyExcel 作者的开源,也等候 EasyExcel-Plus 的发布(预计 11月尾发布),本篇的分享渴望可以资助到有须要的朋侪。
如有不精确的地方欢迎各位指出改正。
|