一、介绍
本次excel工具是基于hutool.poi工具进行封装,不直接用apache.poi封装是因为过于费劲。
本次封装基于项目需求简化代码使用
- 采用注解方式更简便的匹配数据及表格样式(写的时候只专注于注解了,其实用配置方式可能会更优雅),进行excel导入导出。
- 批量读取excel表格,把表格行做成如数据库分页的形式,让开发者更容易熟悉批量读取
二、结构
三、功能
(一)、excel实体类
/** * @author ext.xuzhengyang5 * @date 2024/2/4 * @Description */ @ExcelSheet(value = "Sheet1", headerRowIndex = 2) @ToString @Data @Builder @AllArgsConstructor @NoArgsConstructor public class ExcelObj2 { @ExcelAlias(value = "* 商家ID(VenderID)", force = true) @ExcelStyle(backgroundColor = IndexedColors.DARK_RED, fontColor = IndexedColors.WHITE, headerAlignment = HorizontalAlignment.LEFT, alignment = HorizontalAlignment.RIGHT) private Long venderId; @ExcelAlias("导入失败原因") @ExcelStyle(backgroundColor = IndexedColors.BLACK, fontColor = IndexedColors.WHITE, headerAlignment = HorizontalAlignment.LEFT) private String errorMessage; }
(二)、excel读取
读取方式:
- base64字符串:readAllByClass(String base64Str, Class<T> tClass)
- 文件流:readAllByClass(InputStream in, Class<T> tClass)
- 分页读取:readerPageByClass(ExcelInfoBo excelInfoBo, Class<T> tClass, int pageNum, int pageSize, ExcelReader reader)
- 防止数据流关闭等一系列原因,ExcelReader以入参形式传入。
功能强化点:
- 注解形式配置简化逻辑
- 头部数据校验
- 分页读取增加分页与行数关系映射
(三)、excel写入
最初开发是想通过设置一些表格样式及颜色,导出符合产品提供的excel表格,有了@ExcelStyle注解。实际封装功能时过于麻烦,并开始考虑使用一个excel文件作为模板,不在关心样式只专注于写入数据。
写入方式:
- 模板方式写入:writeByTemplate(InputStream templateStream, List<T> rows, Class<T> tClass)
- 依据class实体类注解配置写入:writeAllByClass(String explainText, Integer explainHeight, List<T> rows, Class<T> tClass)
- 使用@ExcelStyle注解进行样式读取,并设置到表格中
- 此方法算是夭折,目前可以使用,但功能封装不全只支持部分样式,且在尝试实现的阶段放弃,代码逻辑相对混乱。
- 等之后有导出多种或动态excel样式的需求在重新设计封装,在此记录当前想到的优化方向共之后参考
- 取消注解方式设置样式,考虑使用配置方式进行设置
功能强化点:
- 注解形式配置简化逻辑
- excel模板文件,减轻对样式处理的复杂步骤
四、问题记录
1.excel第一次调用存在性能问题优化
- hutool工具包在调用ExcelUtil.getReader时会进行懒加载初始化对象
- 底层会调用WorkbookFactory(单例),初始化方法会调用以下方法比较耗时
private WorkbookFactory() { #选定类加载器 ClassLoader cl = WorkbookFactory.class.getClassLoader(); #此行代码会加载apache poi中HSSFWorkbookFactory、XSSFWorkbookFactory的excel处理类。耗时高 ServiceLoader.load(WorkbookProvider.class, cl).forEach(provider::add); }
- XSSFWorkbookFactory#createWorkbook调用new XSSFWorkbook(pkg);,此方法也存在公共资源初始化耗时(没有深究)
- 项目启动预热即可解决单例懒汉模式加载问题