Easy-Excel 和 Hutool-Excel读取Excel
2023-10-05 本文已影响0人
唔哒喂
EasyExcel 和 Hutool工具中封装的Excel工具,读取最简易excel数据。
Excel信息如下:
image.png
读成的结果:
image.png
需要依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
直接读取为实体类
tip:不涉及合并单元格、表头一致。
创建表头对应实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestDomainEasyExcelDomain {
@ExcelProperty(index = 0)
private String serialNum;
@ExcelProperty(index = 1)
private String code;
@ExcelProperty(index = 2)
private String name;
}
Case1,不写监听器。
缺点:这个不能设置sheet页
public static void easyExcelRead() throws IOException {
String filePath = "test.xlsx";
Path path = Paths.get(filePath);
InputStream inputStream = Files.newInputStream(path);
List<TestDomainEasyExcelDomain> list = EasyExcel
.read(inputStream)
.head(TestDomainEasyExcelDomain.class)
.headRowNumber(1)
.doReadAllSync();
System.out.println(JSONUtil.toJsonPrettyStr(list));
}
Case2 可以指定sheet页。【需要自定义监听器】
public class MyLevel1Listener extends AnalysisEventListener<TestDomainEasyExcelDomain>{
private List<TestDomainEasyExcelDomain> dataList = new ArrayList<>();
/**
* When analysis one row trigger invoke function.
*
* @param data one row value. It is same as {@link AnalysisContext#readRowHolder()}
* @param context analysis context
*/
@Override
public void invoke(TestDomainEasyExcelDomain data, AnalysisContext context) {
dataList.add(data);
}
/**
* if have something to do after all analysis
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("读取数据完成");
}
public List<TestDomainEasyExcelDomain> getDataList() {
return dataList;
}
}
读取代码:
public static void easyExcelReadWithSheet() throws IOException {
String filePath = "test.xlsx";
Path path = Paths.get(filePath);
InputStream inputStream = Files.newInputStream(path);
MyLevel1Listener listener = new MyLevel1Listener();
EasyExcel
.read(inputStream)
.head(TestDomainEasyExcelDomain.class)
.headRowNumber(1)
.registerReadListener(listener)
.sheet(0)
.doRead();
List<TestDomainEasyExcelDomain> dataList = listener.getDataList();
System.out.println(JSONUtil.toJsonPrettyStr(dataList));
}
Case3 Hutool方式
读取代码:
/**
* hutool-excel读取
*/
public static void hutoolExcelRead() throws IOException {
String filePath = "test.xlsx";
Path path = Paths.get(filePath);
InputStream inputStream = Files.newInputStream(path);
// 读取指定sheet
ExcelReader reader = ExcelUtil.getReader(inputStream, 0);
// 这里需要自设置别名 --> 自定义注解
Map<String, String> aliasMap =
HutoolExcelUtils.aliasAnnotation2Map(TestDomainEasyExcelDomain.class);
reader.setHeaderAlias(aliasMap);
List<TestDomainEasyExcelDomain> list = reader.readAll(TestDomainEasyExcelDomain.class);
System.out.println(JSONUtil.toJsonPrettyStr(list));
}
这里使用Hutool工具类来进行读取,还需要添加三个代码:
1、自定义注解:HutoolExcelAlias。
2、在实体类上添加自定义注解。
3、将注解内容转成Map(Hutool 需要表头的alia)的工具类:HutoolExcelUtils。
自定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface HutoolExcelAlias {
String alias();
}
在实体类添加自定义注解
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestDomainEasyExcelDomain {
@HutoolExcelAlias(alias = "序号")
private String serialNum;
@HutoolExcelAlias(alias = "代号")
private String code;
@HutoolExcelAlias(alias = "名称")
private String name;
}
将注解内容转成Map(Hutool 需要表头的alias)的工具类:
public class HutoolExcelUtils {
public static <T> Map<String, String> aliasAnnotation2Map(Class<T> myClass){
Field[] fields = ReflectUtil.getFields(myClass);
Map<String, String> map = MapUtil.newHashMap();
for (Field f: fields){
if (AnnotationUtil.hasAnnotation(f, HutoolExcelAlias.class)){
HutoolExcelAlias annotation = AnnotationUtil.getAnnotation(f, HutoolExcelAlias.class);
map.put(annotation.alias(), f.getName());
}
}
return map;
}
}
完整代码见GIT:完整代码地址