EasyExcel入门:导出Excel文件

2年前 (2022) 程序员胖胖胖虎阿
141 0 0

在开发过程中,我们经常需要导出Excel文件,一开始我使用的是Apache POI,通过创建XSSFWorkbook对象来导出Excel数据,但实际使用时发现需要占用较大的内存空间且导出时间较长,于是改用阿里巴巴的EasyExcel组件,对比前一种方式内存占用降低至10%左右,极大提高效率,下面是使用步骤

1、导入依赖包:(注意:尽量选择高版本,低版本缺少某些注解功能,比如2.0.5就没有@ExcelIgnoreUnannotated注解)

<!--easyExcel驱动-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.10</version>
</dependency>

EasyExcel入门:导出Excel文件

2、创建实体类(实体类的属性会自动封装成Excel表格中每列数据)

@Data 
@ExcelIgnoreUnannotated
public class Category implements Serializable {
    private Long id;
    //类型 1 菜品分类 2 套餐分类
    @ExcelProperty("类别类型") 
    private Integer type;
    //分类名称
    @ExcelProperty("类别名字")
    private String name;
    //顺序
    @ExcelProperty("排序")
    private Integer sort;
    //创建时间
    @ExcelProperty("创建时间")
    private LocalDateTime createTime;
    //更新时间
    @ExcelProperty("修改时间")
    private LocalDateTime updateTime;
}

实体类中属性注意事项:

@Data //使用了Lombok组件的注解,作用是:自动生成get与set方法到编译后的字节码文件中

@ExcelIgnoreUnannotated //放在类上,作用是:忽略未使用ExcelProperty注解的属性

@ExcelProperty("类别类型") //给表格的列起标题名 

特别要注意的是:实体类中时间使用了LocalDateTime类型,这在EasyExcel中默认是不支持的,解决方案是:创建一个自定义的转换器类,实现COnverter接口,并重写方法

public class LocalDateTimeConverter implements Converter<LocalDateTime> {
    @Override
    public Class<LocalDateTime> supportJavaTypeKey() {
        return LocalDateTime.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
                                           GlobalConfiguration globalConfiguration) {
        return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    @Override
    public CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) {
        return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    }

3、编写控制器类中的方法

@GetMapping("exportExcel")
public void exportExcel() throws IOException {
    //1、设定响应类型
    response.setContentType("application/vnd.ms-excel");
    //2、设定附件的打开方法为:下载,并指定文件名称为category.xlsx
    response.setHeader("content-disposition","attachment;filename=category.xlsx");
    //3、、创建工作簿
    ExcelWriterBuilder writeWork = EasyExcel.write(response.getOutputStream(), Category.class).registerConverter(new LocalDateTimeConverter());
    //4、创建表格
    ExcelWriterSheetBuilder sheet = writeWork.sheet();
    //5、调用业务层获取数据
    List<Category> categories = categoryService.findAll();
    //6、写入数据到表格中
    sheet.doWrite(categories);
}

注意:在创建工作表对象时,需要指定.registerConverter(new LocalDateTimeConverter()),自定义的转换器才会起作用,否则导出的Excel文件会是空文件且提示存在乱码(如下图所示)

EasyExcel入门:导出Excel文件

 4、运行程序,打开对应的地址,可以获得category.xlsx文1件,内容如下:

EasyExcel入门:导出Excel文件

 到此便完成了导出Excel的功能,希望对您有所帮助,谢谢!

版权声明:程序员胖胖胖虎阿 发表于 2022年9月25日 上午2:24。
转载请注明:EasyExcel入门:导出Excel文件 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...