EasyExcel是阿里开发的一款快速读写Excel表格的java工具,
今天教大家如何使用
第一步引入依赖:
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.1</version>
</dependency>
</dependencies>
因为EasyExcel本质上是对poi做的一个封装,所以还需要引入poi的依赖,这里就不贴上来了,需要的直接去maven中央仓库搜就可以了。
第二步:
创建实体类
比如:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DemoData {
//设置表头名称
@ExcelProperty("学生编号")
private int sno;
//设置表头名称
@ExcelProperty("学生姓名")
private String sname;
}
第三步:
读写操作:
实现写操作:
//循环设置要添加的数据,最终封装到list集合中
private static List<DemoData> data() {
List<DemoData> list = new ArrayList<DemoData>();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setSno(i);
data.setSname("张三"+i);
list.add(data);
}
return list; }
public static void main(String[] args) throws Exception {
// 写法1
String fileName = "E:\\demo.xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动
关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, DemoData.class).sheet("写入方法一").doWrite(data());
}
实现读操作:
1创建实体类:
public class ReadData {
//设置列对应的属性
@ExcelProperty(index = 0)
private int sid;
//设置列对应的属性
@ExcelProperty(index = 1)
private String sname;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "ReadData{" +
"sid=" + sid +
", sname='" + sname + '\'' +
'}';
}
}
创建读取操作的监听器
//创建读取excel监听器
public class ExcelListener extends AnalysisEventListener<ReadData> {
//创建list集合封装最终的数据
List<ReadData> list = new ArrayList<ReadData>();
//一行一行去读取excle内容
@Override
public void invoke(ReadData user, AnalysisContext analysisContext) {
System.out.println("***"+user);
list.add(user);
}
//读取excel表头信息
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext
context) {
System.out.println("表头信息:"+headMap);
}
//读取完成后执行
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
注意:因为ExcelListener不能交给Spring管理,需要自己new,不能注入其他对象。不能实现数据库操作。
所以可以在这里直接把Service传进来,就是增加一个有参构造,参数就是你写的Service接口,假设叫userService,然后在其他地方new ExcelListener(userService)。
把这里的代码变成:
public class ExcelListener extends AnalysisEventListener<DemoData> {
//新添加的-----------------------------------------
public EduSubjectService subjectService;
public SubjectExcelListener() {}
public SubjectExcelListener(EduSubjectService subjectService) {
this.subjectService = subjectService;
}
//------------------------------------------------
//创建list集合封装最终的数据
List<DemoData> list = new ArrayList<DemoData>();
//一行一行去读取excle内容
@Override
public void invoke(DemoData user, AnalysisContext analysisContext) {
System.out.println("***"+user);
list.add(user);
}
//读取excel表头信息
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext
context) {
System.out.println("表头信息:"+headMap);
}
//读取完成后执行
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
调用实现最终的读取:
public static void main(String[] args) throws Exception {
//写法一
String fileName = "E:\\01.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(fileName, DemoData.class, new
ExcelListener()).sheet().doRead();
// 写法2:
InputStream in = new BufferedInputStream(new
FileInputStream("E:\\01.xlsx"));
ExcelReader excelReader = EasyExcel.read(in, DemoData.class, new
ExcelListener()).build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();
excelReader.read(readSheet);
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
excelReader.finish();
}