一、AnalysisEventListener监听类,可以用来解析Excel

用来进行监听,一方面,它可以处理空数据的检查,重复数据的检查等一些数据筛查工作。另一方面,也可以做数据的存储,如果在此做数据存储,那么数据的转换也是可以在这里完成的。

在该监听器中,通过重写AnalysisEventListener的方法来获得解析的数据、表头信息,以及解析完毕之后执行的操作信息。

public class ExcelListener extends AnalysisEventListener<UserData> {

 /**
  * 一行一行的读取excel内容
  */
 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  // 一定要有无参构造方法
@ExcelIgnoreUnannotated
public class UserData {
    .....
}

方式二:指定字段加@ExcelIgnore注解

@ExcelIgnore // 该字段不生成excel
private String remark;

方式三:代码指定过滤字段,通过excludeColumnFiledNames方法,这种方法的好处是:同一Excel可以在调用方法时排除不同的数据列。

EasyExcel.write(fileName, UserData.class).sheet("学生信息表").excludeColumnFiledNames(Arrays.asList("remark")).doWrite(getData());

参考链接:https://jsnds.cn/2021/07/29/104400.html

GitHub 加速计划 / ea / easyexcel
31.64 K
7.47 K
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:3 个月前 )
c42183df Bugfix 3 个月前
efa7dff6 * 重新加回 `commons-io` 3 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐