参考视频
csdn参考地址
一、导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
二、实体类
- 方式一:@Excel Property()用来设置表头
- 方式二:@ExcelProperty(value=“名称”,index=索引)
@ToString
@Data //set、get、toString方法
@NoArgsConstructor //无参构造方法
@ExcelIgnoreUnannotated //没有标注的字段不被导出文件
public class Student{
@ExcelProperty("编号")
private Integer id;
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("电话")
private String phone;
@ExcelProperty("生日")
private Date birthday;
public Student(String name,Integer age,Integer id){
this.name = name;
this.age = age;
this.id = id;
}
}
三、工具类
public class StudentReadListener implements ReadListener<Student>{
List<Student> list = new ArrayList<>();
//每读一行触发一次
@Override
public void invoke(Student student,AnalysisContext analysisContext){
System.out.println("读取到"+student);
list.add(student);
}
//都读完后触发一次
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext){
System.out.println("读取完毕");
}
}
四、 导入
- 在测试类里面试一下就行了
public void importExcel() throws FileNotFoundException{
//1. 读取文件的流
File file = new File("D:/student.xlsx");
InputStream is = new FileInputStream(file);
//2. 创建一个读取监听器
StudentReadListener listener = new StudentReadListener();
//3. 导入的参数配置
EasyExcel.read(is,Student.class,listener)
.excelType(ExcelTypeEnum.CSV)
.sheet(0) //读第几个工作表,从0开始
.headRowNumber(1) //列头占几行
.doRead();
)
}
- 有的同学在这里可能会成功运行但是读不出Excel的数据来
- 那么让我们来看一下到底是代码的问题还是说文件的问题
- 在这里我要读出的文件是在D:/student.xslx
- 那我们把文件改一下,改成一个不存在的文件,看看是什么反映
- 说明刚刚代码确实是指向了“D:/student.xlsx”文件,所以在连接方面是没有问题的。那么是代码配置问题还是说文件有问题。
- 回到这个问题,我发现读取到Student的次数跟我Excel文件中的行数是一样的,是不是巧合呢?
- 于是我把Excel里面的内容清空了,得到了如下结果
- 意思就是说读到了Excel文件的行列,但就是返回的时候变成了null,所以我猜测是不是没有将Excel表中的字段一 一对应插入Student模型中
- 到这里看到网上一大堆有的没的,都是不靠谱的解决办法,于是我先进行Excel文件的导出,如果能够导出,那我对这个导出文件进行导入,因为导出Excel的文件格式肯定是对的,并且导出代码中的配置参数也用于导入代码中就好了。
- 下面 “五、导出” 是没问题的
- 然后我将相同的导出参数配置到导入参数配置中
//这是导出Excel表格的参数配置
EasyExcel.write(response.getOutputStream())
.head(Student.class)
.excelType(ExcelTypeEnum.XLSX)
.sheet("数据")
.doWrite(list);
}
//同样应用于导入Excel表格的参数配置
EasyExcel.read(inputStream, Student.class,listener)
.excelType(ExcelTypeEnum.XLSX)
.sheet("数据") //读第几个工作表,从0开始
.headRowNumber(1) //列头占几行
.doRead();
- 结果是成功了
- 虽然不知道为什么导入不成功,但是通过先将文件导出,再导入,那就没问题了
五、 导出
- 通过localhost:8080/export,就可以导出文件了
@GetMapping("/export")
public void exportExcel(HttpServletResponse response) throws IOException {
List<Student> list = new ArrayList<>();
list.add(new Student("梅超风",19,3342));
list.add(new Student("西门灵风",39,5621));
list.add(new Student("司马长风",25,82145));
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setCharacterEncoding("utf-8");
//设定要导出的excel的文件名
String fileName = URLEncoder.encode("student","UTF-8").replaceAll("\\+","%20");
response.setHeader("Content-disposition","attachment;filename="+fileName+".xlsx");
//导出Excel表格
EasyExcel.write(response.getOutputStream())
.head(Student.class)
.excelType(ExcelTypeEnum.XLSX)
.sheet("数据")
.doWrite(list);
}