easyexcel可以说是吊打poi和jxl, poi和jxl都有缓存的问题,数据量过大的时候就会出现内存溢出的问题,easyexcel这点就处理的很好,可以分批导入,而且非常简单。 话不多说,直接上货。
这里我用的SpringBoot项目
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency>这是目前最新版本的easyexcel包
注意:这里我遇到一个错误, easyexcel 无法和 poi3.16 版本的包同时存在,好像最低支持 3.17 版本。不过如果你要是只引入 easyexcel的包就不需要担心这个问题了。
这里写你导入或者导出用来接受数据对象的模型对象。 注意: 这里@ExcelProperty注解表示你导入的Excel的列头,内容要不写名字,要不写 index=列头的下标(从0开始),要不就什么都不写,千万不能三个都写。
这里我用的myBatisPlus,可以继承BaseMapper直接调用dao接口
这里可以看到我们指定了每次存储时的集合限制。
引入我们刚才写的UploadDao;
/** * 文件上传 * <p>1. 创建excel对应的实体对象 参照{@link UploadData} * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener} * <p>3. 直接读即可 */ @PostMapping("upload") @ResponseBody public String upload(@RequestParam("file") MultipartFile file) throws IOException { EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDao)).sheet().doRead(); return "success"; }我用的是iview的控件 这里直接写地址就可以,如何需要效果可以写方法根据返回参数判断给予不同的提示。
这个就比较简单了
让条件不为空时带入,不习惯用myBatisPlus的同学可以写XMl文件进行查询。 将查询结果和下载对象进行转换,我这里为了省事用的和上传是一个对象。
/** * 文件下载并且失败的时候返回json(默认失败了会返回一个有部分数据的Excel) * * @since 2.1.1 */ @GetMapping("exportExcel") public void downloadFailedUsingJson(HttpServletResponse response,String phone, String datetime1,String datetime2) throws IOException { // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman try { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("发票", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 这里需要设置不关闭流 EasyExcel.write(response.getOutputStream(), UploadData.class).autoCloseStream(Boolean.FALSE).sheet("模板") .doWrite(data(phone,datetime1,datetime2)); } catch (Exception e) { // 重置response response.reset(); response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); Map<String, String> map = new HashMap<String, String>(); map.put("status", "failure"); map.put("message", "下载文件失败" + e.getMessage()); response.getWriter().println(JSON.toJSONString(map)); } }直接请求带条件请求就OK了。有什么不懂的地方可以留言
更多资料可以看官网文档链接: easyexcel官方文档.