如何在 EasyExcel 中自定义注解的属性?
在EasyExcel中自定义注解属性
在EasyExcel中,@ExcelProperty
注解是用于定义Excel和Java对象之间映射关系的核心注解。虽然不能直接“自定义”这个注解本身,但可以通过注解提供的属性以及一些额外的配置来满足自定义的需求。
一、使用@ExcelProperty
注解的现有属性
- value属性(表头名称)
- 用途:用于指定Excel中的表头名称。
- 示例:
- 这会使得在导出Excel时,对应的列名为“姓名”,在导入Excel时,也会根据这个名称来匹配列数据到该字段。
- index属性(列索引)
- 用途:指定字段在Excel中的列索引(从0开始)。可以用来控制列的顺序,不受Java对象中字段声明顺序的影响。
- 示例:
@ExcelProperty("姓名")
private String name;
@ExcelProperty(value = "年龄", index = 2)
private Integer age;
这表示在Excel中,“年龄”这个字段对应的列索引为2(第三列)。
二、自定义数据格式转换(相当于自定义属性功能的延伸)
- 使用
Converter
接口 - 当需要对特定类型的数据进行特殊格式转换时,可以实现EasyExcel的
Converter
接口。 - 例如,自定义日期格式的转换:
- 首先创建一个日期转换器:
- 然后在实体类中使用这个转换器:
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataType;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CustomDateConverter implements Converter<Date> {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy - MM - dd");
@Override
public Class<?> supportJavaTypeKey() {
return Date.class;
}
@Override
public CellDataType supportExcelTypeKey() {
return CellDataType.STRING;
}
@Override
public Date convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return sdf.parse(cellData.getStringValue());
}
@Override
public CellData<?> convertToExcelData(Date date, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return new CellData<>(sdf.format(date));
}
}
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
@Data
public class MyEntity {
@ExcelProperty(value = "日期", converter = CustomDateConverter.class)
@ColumnWidth(20)
private Date myDate;
}
这样就实现了对日期格式按照自定义的“yyyy – MM – dd”格式进行转换。
三、自定义表头样式(间接影响注解的表现效果)
- 使用
WriteCellStyle
和WriteHandler
- 如果想要自定义表头的样式,例如字体、颜色、背景色等,可以通过
WriteCellStyle
和WriteHandler
来实现。 - 首先定义一个
WriteHandler
: - 在导出数据时使用这个
WriteHandler
:
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.holders.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holders.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Workbook;
public class CustomHeaderWriteHandler implements CellWriteHandler {
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteCellData<?> writeCellData, CellWriteHandlerContext cellWriteHandlerContext) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteCellData<?> writeCellData, CellWriteHandlerContext cellWriteHandlerContext) {
}
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteCellData<?> writeCellData, CellWriteHandlerContext cellWriteHandlerContext) {
if (writeCellData.getRowIndex() == 0) {
// 表头行
Workbook workbook = writeSheetHolder.getWorkbook();
CellStyle cellStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setFontName("Arial");
font.setBold(true);
font.setColor(IndexedColors.RED.getIndex());
cellStyle.setFont(font);
writeCellData.setCellStyle(cellStyle);
}
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteCellData<?> writeCellData, CellWriteHandlerContext cellWriteHandlerContext) {
}
}
import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.List;
public class ExcelWriterExample {
public static void main(String[] args) {
List<MyEntity> entityList = new ArrayList<>();
// 填充数据到entityList
String fileName = "my_entity.xlsx";
EasyExcel.write(fileName, MyEntity.class)
.sheet("数据")
.registerWriteHandler(new CustomHeaderWriteHandler())
.doWrite(entityList);
}
}
这样就实现了自定义表头的样式,虽然没有直接修改@ExcelProperty
注解,但通过这种方式改变了表头在Excel中的显示效果,也可以看作是一种自定义注解属性的延伸操作。
作者:alankuo