如何在 EasyExcel 中自定义注解的属性?

在EasyExcel中自定义注解属性

在EasyExcel中,@ExcelProperty注解是用于定义Excel和Java对象之间映射关系的核心注解。虽然不能直接“自定义”这个注解本身,但可以通过注解提供的属性以及一些额外的配置来满足自定义的需求。

一、使用@ExcelProperty注解的现有属性

  1. value属性(表头名称)
  2. 用途:用于指定Excel中的表头名称。
  3. 示例:
  4. @ExcelProperty("姓名")
    private String name;
    
  5. 这会使得在导出Excel时,对应的列名为“姓名”,在导入Excel时,也会根据这个名称来匹配列数据到该字段。
  6. index属性(列索引)
  7. 用途:指定字段在Excel中的列索引(从0开始)。可以用来控制列的顺序,不受Java对象中字段声明顺序的影响。
  8. 示例:
  9. @ExcelProperty(value = "年龄", index = 2)
    private Integer age;
    

    这表示在Excel中,“年龄”这个字段对应的列索引为2(第三列)。

二、自定义数据格式转换(相当于自定义属性功能的延伸)

  1. 使用Converter接口
  2. 当需要对特定类型的数据进行特殊格式转换时,可以实现EasyExcel的Converter接口。
  3. 例如,自定义日期格式的转换:
  4. 首先创建一个日期转换器:
  5. 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));
        }
    }
    
  6. 然后在实体类中使用这个转换器:
  7. 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”格式进行转换。

三、自定义表头样式(间接影响注解的表现效果)

  1. 使用WriteCellStyleWriteHandler
  2. 如果想要自定义表头的样式,例如字体、颜色、背景色等,可以通过WriteCellStyleWriteHandler来实现。
  3. 首先定义一个WriteHandler
  4. 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) {
    
        }
    }
    
  5. 在导出数据时使用这个WriteHandler
  6. 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

物联沃分享整理
物联沃-IOTWORD物联网 » 如何在 EasyExcel 中自定义注解的属性?

发表回复