EXCEL工具

本文介绍了如何基于Hutool.POI库对Excel进行封装,通过注解方式简化数据导入导出,实现批量读取和分页,同时关注了性能优化问题,如初始化耗时和模板写入的简化配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

本次excel工具是基于hutool.poi工具进行封装,不直接用apache.poi封装是因为过于费劲。

本次封装基于项目需求简化代码使用

  1. 采用注解方式更简便的匹配数据及表格样式(写的时候只专注于注解了,其实用配置方式可能会更优雅),进行excel导入导出。
  2. 批量读取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);,此方法也存在公共资源初始化耗时(没有深究)
  • 项目启动预热即可解决单例懒汉模式加载问题

五、Demo纯净版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值