一、EasyExcel
1. 引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.10</version>
</dependency>
2. 读取Excel
2.1 读取方式一
这种方式在实际开发中用的比较少。
@Test
public void readTest() {
// 创建 ExcelReaderBuilder 实例
ExcelReaderBuilder readerBuilder = EasyExcel.read();
// 读取文件对象
readerBuilder.file("D:\\Works\\javalianxi\\a\\b\\c\\学生信息表.xlsx");
// 指定sheet
// 可以是名字,也可以是索引
readerBuilder.sheet(0);
// 自动关闭输入流
readerBuilder.autoCloseStream(true);
// 设置 Excel 文件格式
readerBuilder.excelType(ExcelTypeEnum.XLSX);
// 注册监听器进行数据的解析
readerBuilder.registerReadListener(new AnalysisEventListener<Map<Integer, String>>() {
@Override
public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
Set<Integer> keySet = integerStringMap.keySet();
Iterator<Integer> iterator = keySet.iterator();
while (iterator.hasNext()) {
Integer key = iterator.next();
System.out.print(key + ":" + integerStringMap.get(key) + ", ");
}
System.out.println();
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 通知文件读取完毕
System.out.println("数据读取完毕");
}
});
// 构建读取器
ExcelReader reader = readerBuilder.build();
// 读取数据
reader.readAll();
// 读取完毕
reader.finish();
}
2.2 读取方式二
这种方式,没有对应的实体类映射。
@Test
public void testReadExcel() {
List<Map<Integer, String>> list = new LinkedList<>();
EasyExcel.read("D:\\Works\\javalianxi\\a\\b\\c\\学生信息表.xlsx")
.sheet()
.registerReadListener(new AnalysisEventListener<Map<Integer, String>>() {
@Override
public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
list.add(integerStringMap);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("数据读取完毕");
}
}).doRead();
for (Map<Integer, String> integerStringMap : list) {
Set<Integer> keySet = integerStringMap.keySet();
Iterator<Integer> iterator = keySet.iterator();
while (iterator.hasNext()) {
Integer key = iterator.next();
System.out.println(key + ":" + integerStringMap.get(key) + ", ");
}
System.out.println();
}
}
2.3 读取方式三
这种方式在实际开发中用的比较多。
实体类
@Data
public class ExcelData {
@ExcelProperty("学号")
private String id;
@ExcelProperty("姓名")
private String name;
@ExcelProperty("联系方式")
private String phone;
@ExcelProperty("入学时间")
private String startDate;
@ExcelProperty("身份证号码")
private String idCard;
@ExcelProperty("邮件")
private String email;
}
提示:用到了@Data注解,需要在pom.xml中引入lombok依赖。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
@Test
public void test() {
List<ExcelData> list = new LinkedList<>();
EasyExcel.read("D:\\Works\\javalianxi\\a\\b\\c\\学生信息表.xlsx")
.head(ExcelData.class)
.sheet()
.registerReadListener(new AnalysisEventListener<ExcelData>() {
@Override
public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
list.add(excelData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("数据读取完毕");
}
}).doRead();
for (ExcelData excelData : list) {
System.out.println(excelData);
}
}
2. 写入Excel
这里演示一下备份excel,即将一个excel中的数据都写入到另一个excel中。
public List<ExcelData> parseData() {
List<ExcelData> list = new LinkedList<>();
EasyExcel.read("D:\\Works\\javalianxi\\a\\b\\c\\学生信息表.xlsx")
.head(ExcelData.class)
.sheet()
.registerReadListener(new AnalysisEventListener<ExcelData>() {
@Override
public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
list.add(excelData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("数据读取完毕");
}
}).doRead();
return list;
}
在主类中调用该方法。
@SpringBootApplication
public class Poi01Application {
public static void main(String[] args) {
SpringApplication.run(Poi01Application.class, args);
ExcelTest excel = new ExcelTest();
List<ExcelData> list = excel.parseData();
// list写入Excel文件
EasyExcel.write("D:\\Works\\javalianxi\\a\\b\\c\\学生信息表_副本.xlsx")
.head(ExcelData.class)
.excelType(ExcelTypeEnum.XLSX)
.sheet()
.doWrite(list);
}
}
Q.E.D.