來源
項目需要把Excel進行解析,並映射到對象屬性,實現類似Mybatis的ORM的效果。使用的方式是自定義注解+POI,這種方式代碼復雜而且不易於維護。
easyexcel是阿里巴巴開源的一個框架,解決了字段映射問題、OOM問題、使用復雜問題等,總之是一個很方便的工具
GitHub鏈接
使用
添加依賴
<!--添加maven依賴-->
<!--easyexcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.3</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
准備excel

准備實體
@Data
public class Student {
/**
* 也可以使用@ExcelProperty(index = 2) 指定列數
* 官方不建議 index 和 name 同時用,要么一個對象只用index,要么一個對象只用name去匹配
*/
@ExcelProperty("姓名")
private String name;
@ExcelProperty("學號")
private String stuId;
@ExcelProperty("班級")
private String classId;
}
創建監聽器
public class DemoDataListener extends AnalysisEventListener<Student> {
private List<Student> list = new LinkedList<Student>();
/**
* 這個每一條數據解析都會來調用
* @param student
* @param analysisContext
*/
public void invoke(Student student, AnalysisContext analysisContext) {
System.out.println("讀取到一條數據 " + JSON.toJSONString(student));
list.add(student);
}
/**
* 所有數據讀取完了調用
* @param analysisContext
*/
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("讀取完畢 所有數據 " + JSON.toJSONString(list));
}
}
讀取
public class Main {
public static void main(String[] args) {
String fileName = "D:\\1.xlsx";
ExcelReader excelReader = EasyExcel.read(fileName, Student.class, new DemoDataListener()).build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();
excelReader.read(readSheet);
// 這里千萬別忘記關閉,讀的時候會創建臨時文件,到時磁盤會崩的
excelReader.finish();
}
}
結果

其他問題
如果第一行不是表頭,而是像以下數據怎么辦呢

很簡單只需要設置readSheet的headRowNumber即可
public class Main {
public static void main(String[] args) {
String fileName = "D:\\1.xlsx";
ExcelReader excelReader = EasyExcel.read(fileName, Student.class, new DemoDataListener()).build();
ReadSheet readSheet = EasyExcel.readSheet(0).headRowNumber(2).build();
excelReader.read(readSheet);
// 這里千萬別忘記關閉,讀的時候會創建臨時文件,到時磁盤會崩的
excelReader.finish();
}
}
其他復雜表格請參考
官網文檔
