一、AnalysisEventListener监听类,可以用来解析Excel
用来进行监听,一方面,它可以处理空数据的检查,重复数据的检查等一些数据筛查工作。另一方面,也可以做数据的存储,如果在此做数据存储,那么数据的转换也是可以在这里完成的。
在该监听器中,通过重写AnalysisEventListener的方法来获得解析的数据、表头信息,以及解析完毕之后执行的操作信息。
public class ExcelListener extends AnalysisEventListener<UserData> { public void invoke(UserData data, AnalysisContext analysisContext) { System.out.println("****" + data); } public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { System.out.println("表头" + headMap); } public void doAfterAllAnalysed(AnalysisContext analysisContext) { System.out.println("读取Excel完毕"); }}
调用:
public class EasyExcelReadDemo { public static void main(String[] args) { // 实现excel写操作 //1.设置写入文件夹地址和excel文件名称 String fileName = "/Users/zzs/temp/excel/write.xlsx"; //调用easyExcel里面的方法实现写操作 //2个参数,第一个参数是文件名称,第二个参数是实体类 EasyExcel.read(fileName, UserData.class, new ExcelListener()).sheet().doRead(); }}
二、自定义转化器
通过自定义转换器,比如将1、0转换成男、女的实例:
public class SexConverter implements Converter<Integer> { public Class<Integer> supportJavaTypeKey() { return Integer.class; } public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; } public Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { return "男".equals(cellData.getStringValue()) ? 1 : 0; } public CellData<String> convertToExcelData(Integer integer, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { return new CellData<>(integer.equals(1) ? "男" : "女"); }}
使用:
@ExcelProperty(value="性别",converter = SexConverter.class)private Integer sex;
再次生成Excel,性别字段内容便显示为:男、女字样。
三、保留两位小数
比如体重需要保留两位小数,可通过@NumberFormat 注解实现:
@ExcelProperty(value = "体重KG")@NumberFormat("0.##") // 会以字符串形式生成单元格,要计算的列不推荐private BigDecimal weight;
另外一种方法是使用@ContentStyle注解:这样也能达到保留两位小数的效果。
当然,也可以使用实现Converter接口的方式实现(同性别实现)。
@ContentStyle(dataFormat = 2)private BigDecimal weight2;
四、排除指定Excel列
在很多场景下,Excel的列与实体类可能并不完全一致,这时就需要排除一些实体类的字段。
方式一:类上加注解 @ExcelIgnoreUnannotated,过滤属性没有@ExcelProperty注解的字段
@Data@ToString@AllArgsConstructor@NoArgsConstructor // 一定要有无参构造方法@ExcelIgnoreUnannotatedpublic class UserData { .....}
方式二:指定字段加@ExcelIgnore注解
@ExcelIgnore // 该字段不生成excelprivate String remark;
方式三:代码指定过滤字段,通过excludeColumnFiledNames方法,这种方法的好处是:同一Excel可以在调用方法时排除不同的数据列。
EasyExcel.write(fileName, UserData.class).sheet("学生信息表").excludeColumnFiledNames(Arrays.asList("remark")).doWrite(getData());
参考链接:https://jsnds.cn/2021/07/29/104400.html
来源地址:https://blog.csdn.net/m0_46459413/article/details/128659592