EasyExcel工具类的使用

介绍

EasyExcel是阿里巴巴开源的Java Excel处理工具库,用于快速读写Excel文件(.xlsx 和 .xls)。相比ApachePOI,它更轻量、速度更快、内存占用更低,适合处理大数据量 Excel 文件。

常见使用场景

  • 导出 Excel(实体类+注解 或 动态列)

  • 导入 Excel(带校验/转换)

  • 支持多 Sheet 导入导出

  • 基于模板导出(支持填充)

  • 大数据量 Excel 处理

快速上手示例

Maven的引入

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version> <!-- 请查找最新版本 -->
</dependency>

简单方式的使用(实体类+注解 )

1. 导出 Excel
@Data
public class UserData {

    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("年龄")
    private Integer age;
}

@ExcelProperty 是 EasyExcel 中用于 标注 Excel 列信息 的注解,常用于实体类字段上,指定 Excel 表头的名称、顺序、格式转换等。

设置的参数:

@ExcelProperty(value = "列名", index = 列索引, converter = 转换器.class)

List<UserData> list = new ArrayList<>();
list.add(new UserData("张三", 20));
list.add(new UserData("李四", 25));

EasyExcel.write("user.xlsx", UserData.class)
         .sheet("用户信息")
         .doWrite(list);
2. 读取 Excel
public class UserDataListener extends AnalysisEventListener<UserData> {
    @Override
    public void invoke(UserData data, AnalysisContext context) {
        System.out.println("读取到数据: " + data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("读取完毕");
    }
}


EasyExcel.read("user.xlsx", UserData.class, new UserDataListener())
         .sheet()
         .doRead();

基于模板导出

  1. 先准备一个带占位符的 Excel 模板(.xlsx 文件)
  2. 占位符变量使用 ${变量名}{变量名} 的形式。
  3. 放入到需要导入项目中的src/main/resources目录下
// 生成唯一文件名
File outputFile = new File(System.getProperty("java.io.tmpdir"), "自己的文件名称");           


// getClass():当前类;
// getClassLoader():拿到这个类的类加载器(通常是 AppClassLoader);
// getResourceAsStream("xxx"):从 classpath 根路径开始寻找 xxx 文件,并以流的形式返回。

try (InputStream exportTemplate = getClass().getClassLoader().getResourceAsStream("xxx")) {
    try (ExcelWriter excelWriter = EasyExcel.write(outputFile)
              .withTemplate(exportTemplate)
              .registerWriteHandler(new HighlightNumberHandler(sheetIndex))
              .build()) {
          WriteSheet writeSheet = EasyExcel.writerSheet().sheetName(sheetName).build();
                excelWriter.fill(map, writeSheet);
                excelWriter.fill(new FillWrapper("z", basicSettlementData), writeSheet);

            }
     } catch (IOException e) {
            log.error("导出文件流异常", e);
            throw new RuntimeException("导出文件流异常", e);
     } catch (NotOfficeXmlFileException e) {
            log.error("模板文件格式错误,必须为 XLSX 格式", e);
            throw new RuntimeException("模板文件格式错误,请检查是否为有效的 Excel 文件");
     }    
✅ 含义说明:
代码含义
EasyExcel.write(outputFile)指定最终导出文件的输出路径(或输出流)
.withTemplate(exportTemplate)指定 Excel 模板(.xlsx 文件),一般来自 InputStream 或路径
.registerWriteHandler(...)注册写处理器,例如设置样式、合并单元格等
.build()构建一个 ExcelWriter 实例,用于后续数据填充
map一个 Map<String, Object> 类型,用于填充 ${key} 形式的 普通变量
fill()将 map 中的值填充到模板中 ${变量} 占位符的位置
writeSheet指定在哪个 Sheet 中填充
如果存在多个sheet(模版有多个,导出只保留一个)
FileInputStream fis = new FileInputStream("模版")
XSSFWorkbook poiWorkbook = new XSSFWorkbook(fis);
String sheetName = poiWorkbook.getSheetName(int index);
// 删除多余的sheet
for (int i = poiWorkbook.getNumberOfSheets() - 1; i >= 0; i--) {
    if (!poiWorkbook.getSheetName(i).equals(sheetName)) {
        poiWorkbook.removeSheetAt(i);
    }
}

该段代码的目的是:

打开一个 Excel 模板文件,只保留其中名为 sheetName 的 Sheet,其它所有 Sheet 都删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值