一、easyExcel简介

  在工作中,经常需要把excel中的数据导入系统,亦或是把系统中符合筛选条件的数据通过excel的方式导出。
  Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后的存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出;03版excel的处理采用POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。

  引入jar包。由于easyExcel中已经引入poi-ooxml、poi等jar。如果开发的老项目中也有poi-ooxml、poi的引入,注意jar包版本问题。

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><!--目前最新的版本--><version>1.1.2-beta5</version>
</dependency>

  学习easyExcel最好的方式,就是下载源码,参考项目中的测试用例。本篇教程为实践的总结,解决了实际开发中遇到的问题。两者结合学习事半功倍。
easyExcel GitHub链接


二、controller层解析excel文件

  easyExcel源码的测试用例中,提供了多种读取excel的方法。比如:

  1. 07版本excel读数据量少于1千行数据。
    excel中每行数据解析成Object,该Object包含excel中一整行的数据。
  2. 07版本excel读数据量少于1千行数据,自动转成 javamodel。
    excel中每行数据解析成java对象,excel每列对应java对象的一个成员变量。
  3. 07版本excel读数据量大于1千行。
  4. 07版本excel读数据量大于1千行数据自动转成javamodel。

  建议采用第4种方式,因为满足的场景更多,03版excel处于淘汰阶段,不予介绍;上述提到4种excel解析方法具体该如何使用,可以参考easyExcel源码中的测试用例。
  easyExcel源码的测试用例中,仅给出mavan项目resource路径下静态excel文件的解析的demo程序,实际项目中,文件都来自ajax发送的请求体。下面给出实际开发中controller层的代码。

@ResponseBody
@RequestMapping(value = "/importExcel", method = RequestMethod.POST,produces = "application/json;charset=utf-8")
public Result batchAddByExcel(
@RequestParam(value = "excel", required = false) MultipartFile excel,
@RequestParam(value = "name", required = false) String currentUser,
@RequestParam(value = "userId", required = false) Integer userId,
BatchAddPromotionVO request) {// 打印入参日志log.info("request = {},name = {}", request, currentUser);// 进行参数校验,检查入参的合理性Result result = checkParam(excel, request);if (!result.isSuccess()) {return result;}Map<Integer, List<Object>> sheetRowModelMap = null;try {// 解析excel文档。具体如何解析,省略。请参考easyExcel的源码测试用例sheetRowModelMap = parseExcelData(excel);} catch (Exception e) {log.error("parseExcelData error = ", e);return Result.wrapError(1, "解析excel失败" + e.getMessage());}// 遍历excel数据转化为业务需要的VO数据List<SavePromotionVO> list = parseExcelDataToVO(request, sheetRowModelMap);// 进行业务代码编写return Result.wrapSuccess(true);;
}

  注意点:在校验excel文件的合理性时,用下面的方式可能是有问题的。

private Result checkParam(MultipartFile excel, BatchAddPromotionVO request) {if (excel == null || request == null) {return Result.wrapError(1, "参数异常");}// excel文件的扩展名是可以是大写的 XLSX,所以这么判断不完整if (!excel.getOriginalFilename().contains(".xlsx")) {return Result.wrapError(1, "文件格式错误,请重新下载模板");}return Result.wrapSuccess(true);}

  上述代码中BatchAddPromotionVO,是一个复杂的java对象,定义如下:

package com.missfresh.pmp.admin.vo.productPromotion;import com.alibaba.fastjson.JSONArray;
import com.missfresh.domain.Result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;import java.util.List;@Data
@NoArgsConstructor
@AllArgsConstructor
public class BatchAddPromotionVO {private String operateGroup;private Integer promoteLevel;private Integer businessType;/*** 位置信息,用于接收一个大json字符串*/private String positionString;/*** 上面的 positionString接收到参数后,需要编写代码将其 转成 positionList*/private List<PositionVO> positionList;
}

  这个controller方法既需要上传excel文件,又需要上传一堆业务参数。代码编写完成后,使用postman调用接口,是一个问题,该如何调接口?如下图所示:


三、controller层导出excel文件

  首先需要了解什么是 MIME TYPE?链接:https://www.cnblogs.com/jsean/articles/1610265.html
  easyExcel中的测试用例中也给出了多种写静态excel文件的方法,可以供开发者学习。在实际的业务中,需要把符合筛选条件的数据通过excel的方式导出、提供下载excel的功能。

@ResponseBody
@RequestMapping(value = "/exportSelectedPromotion.do",
method = RequestMethod.POST, produces = "application/json;charset=utf-8")
public void exportPromotionByExcel07(@RequestBody PromotionListQueryVO queryVO, HttpServletResponse response) {log.info("queryVO = {}", queryVO);try {// 查符合筛选条件的数据List<PromotionDTO> list = getPromotionDTOList(queryVO);// 把符合条件的数据,转化成写excel需要的Model实体List<PromotionWriteModel> modelList = converseListToWriteModel(list);String time = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");// 指定导出的excel文件的名字String fileName = "promotion_export_" + time;// 指定工作簿的名字String sheetName = "sheet1";// easyexcel工具类实现Excel文件导出(下文给出ExcelUtil的代码)ExcelUtil.writeExcel(response, modelList, fileName, sheetName, new PromotionWriteModel());} catch (Exception e) {e.printStackTrace();log.error("exportPromotionByExcel07 error:", e);}
}

ExcelUtil代码如下:

package com.missfresh.pmp.admin.util;import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;public class ExcelUtil {/*** 导出 Excel :一个 sheet,带表头.** @param response  HttpServletResponse* @param list      数据 list,每个元素为一个 BaseRowModel* @param fileName  导出的文件名* @param sheetName 导入文件的 sheet 名* @param model     映射实体类,Excel 模型* @throws Exception 异常*/public static void writeExcel(HttpServletResponse response, List<? extends BaseRowModel> list,String fileName, String sheetName, BaseRowModel model) throws Exception {ExcelWriter writer = new ExcelWriter(getOutputStream(fileName, response), ExcelTypeEnum.XLSX);Sheet sheet = new Sheet(1, 0, model.getClass());sheet.setSheetName(sheetName);writer.write(list, sheet);writer.finish();}/*** 导出文件时为Writer生成OutputStream.** @param fileName 文件名* @param response response* @return ""*/private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {try {fileName = URLEncoder.encode(fileName, "UTF-8");response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf8");response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");response.setHeader("Pragma", "public");response.setHeader("Cache-Control", "no-store");response.addHeader("Cache-Control", "max-age=0");return response.getOutputStream();} catch (IOException e) {throw new Exception("导出excel表格失败!", e);}}
}

Postman调接口测试:

四、注意事项

  填入excel中的数据,按键盘del键删不干净,easyExcel在解析时依然可以读到del键删过的单元格,bean里每个元素都解析成了null,过滤掉这些bean就行。临时解决办法时,别操作del键。选中要删除的 行 – 右键 —删除,这样能删干净。如下图:


end,转载请注明出处。

easyExcel实现excel文件上传和下载相关推荐

  1. EXCEL文件上传与下载

    *----------------------- 上传 Example 1 ---------------------------------- 假设有数据在excel中如下:  sname      ...

  2. 基于FTP协议的Excel文件上传与下载

    1.关于FTP协议 FTP(文件传输协议)是TCP/IP协议组中的协议之一,作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用.FTP协议的全称为File Transfer Protocol, ...

  3. Excel文件上传、下载(Hutool)

    简单粗暴上代码 Excel下载 我们先定义一个嵌套的List,List的元素也是一个List,内层的一个List代表一行数据,每行都有4个单元格,最终list对象代表多行数据. List<Str ...

  4. SpringBoot——快速整合EasyExcel实现Excel的上传下载

    文章目录: 1.EasyExcel 2.Excel的上传(读Excel) 3.Excel的下载(写Excel) 4.结语 1.EasyExcel Hello,大家好啊,好久不见了,自工作之后真的很难腾 ...

  5. java实现excel文件上传_java相关:SpringMVC下实现Excel文件上传下载

    java相关:SpringMVC下实现Excel文件上传下载 发布于 2020-6-21| 复制链接 摘记: 在实际应用中,经常会遇到上传Excel或者下载Excel的情况,比如导入数据.下载统计数据 ...

  6. Java如何进行文件上传与下载

    Java文件上传与下载 在项目开发中难免遇到这样的问题,对于我这种小白,那只能寻求度娘的帮助拉,各种搜索和看博客文章,当实际运行时....哎,痛苦. 今日分享一波,望你所用,烦闷去之. 文件上传 首先 ...

  7. abap文件上传与下载

    一.文件上传 本地的文本文件或者Excel文件上传到服务器内表中,数据自动转换,文件数据列之间默认通过table键分隔,也可以自己指定. 核心函数:TEXT_CONVERT_XLS_TO_SAP 上传 ...

  8. 文件上传,下载,预览,删除(File),分页接口

    文件上传,下载,预览,删除(File) 1.公共参数方法 1.1公共返回类型定义 1.2 分页接口 1.3公共实体类 1.4 公共的 mapper.java/xml(都放在一起) 1.4.1 File ...

  9. ssm框架下的文件上传和下载

    ssm下的文件上传和下载 1. 文件上传 1.1 文件上传需要的依赖 文件上传需要使用到 commons-fileupload 和 commons-io 两个 jar 包. <dependenc ...

  10. vue采用 XLSX文件上传与下载

    vue采用 XLSX文件上传与下载 先安装xlsx npm install xlsx 安装之后直接在该页面script标签里面导入 import * as XLSX from 'xlsx' 注意 此处 ...

最新文章

  1. C语言的内联函数的作用
  2. Python基础三--字典,集合,编码,深浅copy,元祖、文件操作
  3. java编程50_java经典50编程题(1-10)
  4. 【飞秋】Android开发——NDK开发入门
  5. 【docker】第三节:nginx通过外部无法访问的情况解决方法。
  6. [渝粤教育] 中国地质大学 测量学 复习题
  7. 4. 创建 bundle
  8. Unity 导入高分辨率图片
  9. 【xlwings api语言参考】Worksheet.Cells 属性
  10. 阿里“小前台、大中台”的解读
  11. 爬虫有道词典进行自动翻译
  12. SuMa++: Efficient LiDAR-based Semantic SLAM
  13. STM32基础(11)ADC模数转换
  14. Python科研绘图第一期——线型图(Line)、条型图(Bar)、散点图(Scatter)、子图(subplot)
  15. 基于开发环境MPLAB X IDEX PCKit3.5+进行仿真调试
  16. PXI Express外设板信号汇总(更新中)
  17. 自考本科推荐计算机考研学校,不歧视自考生的考研学校,哪位大哥知道哪些学校自考考研时不受歧视吗?...
  18. Northern Data AG:与技嘉科技成功建立开发合作伙伴关系
  19. 深入解析 Raft 模块在 KaiwuDB 中的优化改造(下)
  20. 商标19类明细计算机,商标40类明细(商标19类明细都有什么)

热门文章

  1. sql列转行(字段)逗号分割
  2. PMP课程笔记:第10章 项目沟通管理
  3. html界面设计用什么软件,html网页开发常用软件有哪些
  4. PDF限制复制怎么办?怎么解决这个问题?
  5. Dijkstra算法原理
  6. 数字信号处理知识点总结(一):卷积
  7. SPSS学习笔记(六)线性相关及回归
  8. 计算机设计大赛南京邮电大学,喜讯:我校信息学子在中国大学生计算机设计大赛中再创佳绩...
  9. 移位密码算法-c语言,凯瑟移位密码(C语言).doc
  10. IDEA汉化后设置无法打开