最详细的教程------EasyExcel导入与导出功能整合
1、开发环境参数
name | Value |
开发工具 | Intellij IDEA 2018 |
框架 | SpringBoot(maven项目也可以) |
版本 | 2.2.5.RELEASE |
2、导入Maven依赖
<!--EasyExcel,导出或是导入Excel文档的依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency> <!--lombok,可以简化get,set,toString的插件--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
3、项目结构
4、开始代码部分
第一步:创建实体类
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.format.DateTimeFormat; import lombok.Data; import java.util.Date; /** * 学生实体类 * * 注意需要有@ExcelProperty注解 */ @Data //代替get,set方法 public class Student { @ExcelProperty(value = "学生id",index=0)//index是序号,valeu是对应excel表格的头部标题 private Integer id;//学生id @ExcelProperty(value = "学生姓名",index=1) private String name;//学生姓名 @ExcelProperty(value = "学生年级",index=2) private String grade;//学生年级 @ExcelProperty(value = "创建时间",index=3) @DateTimeFormat(value = "yyyy-MM-dd")//优化时间导出格式 private Date createTime;//创建时间 }
第二步:创建一个通用的BaseMapper,方便我们进行业务处理。
import org.springframework.stereotype.Repository; import java.util.List; @Repository public class BaseMapper<T> { public void saveBath(List<T> t){ System.out.println("进行模拟数据插入操作"); } }
第三步:创建一个导入excel文档的读取监听通用类,注意!注意!注意,不要使用@Autowired 注入BaseMapper,否则会报空指针异常,因为可能与POI冲突,因而你可以new 一个,或者使用构造方法进行注入,这里采用构造方法进行注入。
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.xsy.easyexcel.Mapper.BaseMapper; import java.util.ArrayList; import java.util.List; /** * Excel文档导入配置类,使用泛型封装 */ public class EasyExcelListener<T> extends AnalysisEventListener<T> { //mapper层通用类,你也可以自己封装 private BaseMapper<T> baseMapper; //由于存在poi冲突无法进行依赖注入,采取构造方法的方式注入其他类 public EasyExcelListener(BaseMapper<T> baseMapper){ this.baseMapper=baseMapper; } //设置最大读取行数 private static final int BAStudentCH_COUNStudent = 5; //以List形式读取excel文档内容 private List<T> list=new ArrayList<>(); /** * @param t 传入对应的实体类,就是你需要进行导入数据的类,我这里是student类 * @param analysisContext 用来解析excel文档的类,引入依赖的包已经帮我们封装了 */ //重写导入代理类 @Override public void invoke(T t, AnalysisContext analysisContext) { list.add(t); if (list.size()>=BAStudentCH_COUNStudent){ System.out.println("读取行数:"+list.size()); //执行逻辑操作,比如说插入数据到数据库 saveBath(list) baseMapper.saveBath(list); list.clear(); //清理list占用内存空间,重新读取下一次 } } /** * @param analysisContext 用来解析excel文档的类, */ //必须重写这个类,否则最后一批数据不会被处理 public void doAfterAllAnalysed(AnalysisContext analysisContext) { //跟上面一样,比如说插入数据 saveBath(list) System.out.println("最后读取行数:"+list.size()); baseMapper.saveBath(list); } }
第四步:编写控制层
import com.alibaba.excel.EasyExcel; import com.xsy.easyexcel.Mapper.BaseMapper; import com.xsy.easyexcel.entity.Student; import com.xsy.easyexcel.utils.EasyExcelListener; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Date; /** * 控制层 */ @RestController @RequestMapping("/test") public class StudentController { /** * 以流方式响应回给客户端,返回值类型设置成void * * @param response 输出excel表格,让用户下载 */ @GetMapping("/exportExcel") public void exportExcel(HttpServletResponse response){ try { //设置响应头,指定输出格式 //attachment指定独立文件下载 不指定则回浏览器中直接打开 response.setHeader("Content-Disposition","attachment;filename="+new String("学生信息表.xlsx".getBytes(),"ISO-8859-1")); //输出文件流 调用服务层方法,获取excel对象放入输出流 ArrayList<Student> list = new ArrayList<>(); Student student = new Student(); student.setId(201624122); student.setName("xiaosongyeu"); student.setGrade("大学四年级"); student.setCreateTime(new Date()); for (int i = 0; i <13 ; i++) { list.add(student); } //导出excel EasyExcel.write(response.getOutputStream(), Student.class).sheet("学生信息表").doWrite(list); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * ajax文件上传,前端传递的文件对象为file * * @param file 前端上传的excel文件 * @return */ @PostMapping("/importExcel") public String importExcel(MultipartFile file){ //从解析器中获取excel文件流,传入到服务层进行读取处理 try { EasyExcel.read(file.getInputStream(),Student.class,new EasyExcelListener(new BaseMapper())).sheet("学生信息表").doRead(); } catch (IOException e) { e.printStackTrace(); return "导入失败"; } return "导入成功"; } }
第五步:进行测试
(1)导出excel文档:浏览器直接访问localhost:8080/test/exportExcel
(2)导入Excel文档:使用PostMan工具测试
选择post请求—选择form-data----key填file,value选择文件,让后send,可以查看控制台输出
六、若是遇到什么问题,可以一起交流学习,这个demo代码也一并奉上,直接下载即可运行。