参考视频
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<>();//每读一行触发一次@Overridepublic void invoke(Student student,AnalysisContext analysisContext){System.out.println("读取到"+student);list.add(student);}//都读完后触发一次@Overridepublic 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);}