在开发过程中,我们经常需要导出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>
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文件会是空文件且提示存在乱码(如下图所示)
4、运行程序,打开对应的地址,可以获得category.xlsx文1件,内容如下:
到此便完成了导出Excel的功能,希望对您有所帮助,谢谢!
相关文章
暂无评论...