文章目录
什么是 EasyExcel?
EasyExcel 是阿里巴巴开源的一款高性能、简洁易用的 Excel 读写工具库,基于 Java 开发。与传统的 Apache POI 相比,EasyExcel 专注于简化 Excel 操作,特别是在大规模数据导入导出场景下表现出色。
GitHub 地址:https://github.com/alibaba/easyexcel
EasyExcel 的特点
- 高性能: 使用 SAX 方式解析 Excel,内存占用更低,特别适合大数据量的 Excel 文件操作。可处理百万行数据,而不会像 Apache POI 一样造成内存溢出。
- 操作简单:通过注解(如 @ExcelProperty)快速完成字段与 Excel列的映射。代码量少,API 设计简单易用。
- 支持多种格式:支持 .xls 和 .xlsx 格式的 Excel 文件。同时支持简单和复杂表头、多级表头的处理。
- 丰富的功能:支持自定义样式(列宽、字体、颜色等)。支持大数据量的批量写入和读取。提供自定义转换器(如日期格式、数值格式)和监听器机制。
使用EasyExcel导出excel
1.添加EasyExcel依赖
在 SpringBoot 项目中添加 EasyExcel 依赖,pom.xml中加入:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>4.0.3</version>
</dependency>
2.定义converter
public class BooleanConverter implements Converter<Boolean> {
public BooleanConverter() {
}
public Class<?> supportJavaTypeKey() {
return Boolean.class;
}
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 从excel读数据时候调用
* 单元格数据转java数据
* @param cellData Excel 单元格的数据,<?> 表示通配符,意味着可以接受任何类型的数据
* @param contentProperty Excel 内容的元数据,例如列标题、格式等
* @param globalConfiguration 一般是全局配置
* @return
*/
public WriteCellData<?> convertToExcelData(Boolean value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
return new WriteCellData(value ? "是" : "否");
}
/**
* 写数据到excel里面时调用
* java数据转换Excel单元格数据
* @param context 上下文对象,可以获取值
* @return
*/
@Override
public Boolean convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
String value = cellData.getStringValue();
if (StringUtils.isBlank(value)){
// 未知
return null;
}
if (value.indexOf("是") != -1) {
return Boolean.TRUE;
}
if (value.indexOf("否") != -1) {
return Boolean.FALSE;
}
return null;
}
}
Converter 的作用是解决 Excel 数据与 Java 字段之间的转换.在这个例子中Excel单元格中的是
和否
对应于java中的Boolean类型的True
和False
,因此需要定义一个转换器去相互转换他们,下面会在@ExcelProperty()注解中传入这个转换器.Converter 的使用场景有:
1. 日期和时间的格式化处理(自定义格式,如 yyyy-MM-dd)。
2. 枚举值转换(Excel 使用字符串存储,Java 使用枚举类型)。
3. 数值单位换算(如 “元⇔分”、“MB⇔KB”)。
4. 复杂字符串解析(如 JSON、CSV 数据格式)。
5. 多语言动态内容处理(根据语言环境动态生成内容)。
6. 其他无法通过注解直接实现的复杂映射逻辑。
3.定义导出实体类型
public class UserExportModel {
@ExcelProperty(index = 0,value = "id")
@ColumnWidth(00)
private String id;
@ExcelProperty(index = 1,value = "名称")
@ColumnWidth(10)
private String name;
//传入上面定义的转换器
@ExcelProperty(index = 2,value = "是否成年",converter = BooleanConverter.class)
@ColumnWidth(10)
private Boolean isAdult;
@ExcelIgnore
private String remark;
@ExcelProperty(index = 3,value = "创建时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
@ColumnWidth(20)
private LocalDateTime createTime;
}
- @ExcelProperty(index = ,value = “”,converter = ) 注解: 在实体类中绑定 Excel列的属性,可以方便地将 Excel 数据和 Java 对象字段进行映射.它的属性(index、value 和 converter等)有以下作用:
1. index :指定 Excel 列的索引(从 0 开始).
2. value :指定 Excel 列的名称(表头)以匹配字段.
3. converter :指定字段的转换器,用于自定义 Excel 数据与 Java 字段之间的转换逻辑. - @ExcelIgnore注解: 在 Excel 数据导入或导出过程中 忽略这个字段
- @ColumnWidth(20)注解: Excel数据导出过程中设置这个字段的excel单元格宽度
- @DateTimeFormat(“yyyy-MM-dd HH:mm:ss”)注解: 设置该字段导入导出时的日期格式,用于将 Excel 字符串日期和 Java 日期对象之间的格式映射
4.查询数据库数据并导出
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping(value = "downloadUserList", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void exportUserList(HttpServletResponse response) throws IOException {
//设置 HTTP 响应头
response.setContentType("application/x-msdownload");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLUtil.encode("用户列表.xlsx"));
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
//从mysql中查询数据
List<UserExportModel> userExportModels = userService.getUserExportModelList();
// 创建excel对象
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), OrderExportModel.class).build();
//创建sheet
WriteSheet writeSheet=EasyExcel.writerSheet("用户列表").head(OrderExportModel.class).build();
//导出
excelWriter.write(userExportModels, writeSheet);
excelWriter.finish();
}
}
tips:指定了content-type “application/x-download”的方法不应该有返回值,所以不要给controller层设置返回值,不然会报这个错误:
5.导出样式
老铁觉得有用就点个赞吧
标签:return,springboot,Excel,EasyExcel,excel,导出,value,public From: https://blog.csdn.net/qq_53604504/article/details/144935341