注解方式
注解方式生成 Excel 代码如下:
String fileName = "temp/annotateWrite" + System.currentTimeMillis() + ".xlsx"; // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 // 如果这里想使用03 则 传入excelType参数即可 EasyExcel .write(fileName, DemoData.class) .sheet("注解方式") .registerWriteHandler(createTableStyle())// Excel 表格样式 .doWrite(data());
这里代码与上面大体一致,只不过这里需要在 write
方法传入 DemoData
数据类型。EasyExcel 会根据 DemoData
类型自动生成表头。
下面我们来看下 DemoData
这个类到底内部到底是啥样?
@ContentRowHeight(30)// 表体行高 @HeadRowHeight(20)// 表头行高 @ColumnWidth(35)// 列宽 @Data public class DemoData { /** * 单独设置该列宽度 */ @ColumnWidth(50) @ExcelProperty("字符串标题") private String string; /** * 年月日时分秒格式 */ @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒") @ExcelProperty(value = "日期标题") private Date date; /** * 格式化百分比 */ @NumberFormat("#.##%") @ExcelProperty("数字标题") private Double doubleData; @ExcelProperty(value = "枚举类",converter = DemoEnumConvert.class) private DemoEnum demoEnum; /** * 忽略这个字段 */ @ExcelIgnore private String ignore; }
DemoData
就是一个普通的 POJO
类,上面使用 ExayExcel 相关注解,ExayExcel 将会通过反射读取字段类型以及相关注解,然后直接生成 Excel 。
ExayExcel 提供相关注解类,直接定义 Excel 的数据模型:
@ExcelProperty
指定当前字段对应excel中的那一列,内部 value 属性指定表头列的名称@ExcelIgnore
默认所有字段都会和excel去匹配,加了这个注解会忽略该字段@ContentRowHeight
指定表体行高@HeadRowHeight
指定表头行高@ColumnWidth
指定列的宽度
另外 ExayExcel 还提供几个注解,自定义日期以及数字的格式化转化。
@DateTimeFormat
@NumberFormat
另外我们可以自定义格式化转换方案,需要实现 Converter
类相关方法即可。
public class DemoEnumConvert implements Converter<DemoEnum> { @Override public Class supportJavaTypeKey() { return DemoEnum.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; } /** * excel 转化为 java 类型,excel 读时将会被调用 * @param cellData * @param contentProperty * @param globalConfiguration * @return * @throws Exception */ @Override public DemoEnum convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { return null; } /** * java 类型转 excel 类型,excel 写时将会被调用 * @param value * @param contentProperty * @param globalConfiguration * @return * @throws Exception */ @Override public CellData convertToExcelData(DemoEnum value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { return new CellData(value.getDesc()); } }
最后我们还需要在 @ExcelProperty
注解上使用 converter
指定自定义格式转换方案。
使用方式如下:
@ExcelProperty(value = "枚举类",converter = DemoEnumConvert.class) private DemoEnum demoEnum;
最后我们运行一下,看下 Excel 实际效果如何:
怎么样,效果还是可以吧。
对了,默认的样式表格样式可不是这样,这个效果是因为我们在 registerWriteHandler
方法中设置自定义的样式,具体代码如下:
/*** * 设置 excel 的样式 * @return */ private static WriteHandler createTableStyle() { // 头的策略 WriteCellStyle headWriteCellStyle = new WriteCellStyle(); // 背景设置为红色 headWriteCellStyle.setFillForegroundColor(IndexedColors.PINK.getIndex()); // 设置字体 WriteFont headWriteFont = new WriteFont(); headWriteFont.setFontHeightInPoints((short) 20); headWriteCellStyle.setWriteFont(headWriteFont); // 内容的策略 WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定 contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); // 背景绿色 contentWriteCellStyle.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex()); WriteFont contentWriteFont = new WriteFont(); // 字体大小 contentWriteFont.setFontHeightInPoints((short) 20); contentWriteCellStyle.setWriteFont(contentWriteFont); // 设置边框的样式 contentWriteCellStyle.setBorderBottom(BorderStyle.DASHED); contentWriteCellStyle.setBorderLeft(BorderStyle.DASHED); contentWriteCellStyle.setBorderRight(BorderStyle.DASHED); contentWriteCellStyle.setBorderTop(BorderStyle.DASHED); // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现 HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); return horizontalCellStyleStrategy; }
使用注意点
poi 冲突问题
理论上当前 easyexcel
兼容支持 poi 的3.17
,4.0.1
,4.1.0
所有较新版本,但是如果项目之前使用较老版本的 poi,由于 poi 内部代码调整,某些类已被删除,这样直接运行时很大可能会抛出以下异常:
NoSuchMethodException
ClassNotFoundException
NoClassDefFoundError
所以使用过程中一定要注意统一项目中的 poi 的版本。
非注解方式自定义行高列宽
非注解方式自定义行高以及列宽比较麻烦,暂时没有找到直接设置的入口。查了一遍 github 相关 issue,开发人员回复需要实现 WriteHandler
接口,自定义表格样式。
总结
本文主要给各位小伙伴们安利 EasyExcel 强大的功能,介绍 EasyExcel 两种生成 excel 方式,以及演示相关的示例代码。EasyExcel 除了写之外,当然还支持快读读取 Excel 的功能,这里就不再详细介绍。Github 上相关文档例子非常丰富,大家可以自行参考。
Github 文档地址:https://alibaba-easyexcel.github.io/index.html