EaseExcel的导入导出

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。我使用的业务场景:需要把一个十万条数据左右的Excel导入数据库,在使用POI的时候,会报OOM,而easyExcel可以避免。参考链接:https://www.yuque.com/easyexcel/doc/write#591ee418

1. 读Excel

1)导入依赖

     <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency>

2)创建接收Excel的实体类UserVo

     @Datapublic class UserVo {/*** 需要在属性上添加@ExcelProperty注解,这个有两种使用方式:*  ①@ExcelProperty(value = "USERID")②@ExcelProperty(index = 0),*  如果列比较多,且不会出现相同的列名,就使用value,value的值必须和Excel的表头一致,* 如果列比较少或者有相同的列名,就使用index*///    @ExcelProperty(index = 0)@ExcelProperty(value = "USERID")private String USERID;//    @ExcelProperty(index = 2)@ExcelProperty(value = "USERNAME")private String USERNAME;//    @ExcelProperty(index = 3)@ExcelProperty(value = "AREAID")private Double AREAID;//    @ExcelProperty(index = 7)@ExcelProperty(value = "OPENACCTIME")private String OPENACCTIME;//    @ExcelProperty(index = 9)@ExcelProperty(value = "STBID")private String STBID;//    @ExcelProperty(index = 64)@ExcelProperty(value = "STATE")private String STATE;}

3)创建监听器

     /*** @program:* @description: 监听批量处理数据* UserVo和SxuserService 替换成自己的**/public class MyExcelListener extends AnalysisEventListener<UserVo> {private static final Logger LOGGER = LoggerFactory.getLogger(MyExcelListener.class);/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 5;List<UserVo> list = new ArrayList<UserVo>();  private SxuserService sxuserService;public MyExcelListener() {}/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来** @param sxuserService*/public MyExcelListener(SxuserService sxuserService) {this.sxuserService = sxuserService;}/*** 这个每一条数据解析都会来调用** @param data*            one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(UserVo data, AnalysisContext context) {LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));list.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (list.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listlist.clear();}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();LOGGER.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", list.size());sxuserService.addUserInfo(list);LOGGER.info("存储数据库成功!");}}

4)web读

 @Autowiredprivate SxuserService sxuserService;@PostMapping("/import")public String importUseListener(@RequestParam("file") MultipartFile file) throws Exception {//headRowNumber(1):如果表头只有一行,可以省略不写,因为headRowNumber默认就是1EasyExcel.read(file.getInputStream(), UserVo.class, new MyExcelListener(sxuserService)).sheet().headRowNumber(1).doRead();return "插入成功";}

2.写Excel

1)导入依赖

2)创建实体类

     @Datapublic class Sxuser {/*** 走过的坑:字段的命名一定要遵循驼峰命名原则,不然实体类属性列有值,但Excel中该列无法进行回显* ①该属性列首字母不能为大写字母。* ②该属性列的第二个字母不能为大写。总结来说,即属性名称和该属性的get,set方法都必须遵循驼峰命名格式,* 不然会导致一些JSON序列化工具和模板标签语言解析不出来,包括导致EaseExcel无法进行解析。* 错误示例:*     属性名:fLinkMan(第二个字母大写)* 可以改为:linkMan*///表头的各种操作,可以参考easyExcel文档:https://www.yuque.com/easyexcel/doc/write#cac25459@ExcelIgnore  //这个注解表示 该属性不需要在Excel中展示private Integer id;@ExcelProperty(value = "ServiceId",index = 0)   //这个注解中的value用来显示表头,index表示字段在Excel中的哪一列private String serviceId;@ExcelProperty(value = "BoxCode",index = 1)private String boxCode;@ExcelProperty(value = "AcceptCity",index = 2)private String acceptCity;@ExcelProperty(value = "FLinkMan",index = 3)private String finkMan;@ExcelProperty(value = "ContactPhone",index = 4)private String contactPhone;@ExcelProperty(value = "ContactAddress",index = 5)private String contactAddress;@ExcelProperty(value = "OperCode",index = 6)private Integer operCode;@ExcelProperty(value = "OldBosCode",index = 7)private String oldBosCode;@ExcelProperty(value = "ProdId",index = 8)private String prodId;@ExcelProperty(value = "CreateTime",index = 9)@DateTimeFormat("yyyy-MM-dd HH:mm:ss")  //通过这个注解可以转换需要的日期格式private Date createtime;}

3)web写

 @Autowiredprivate SxuserService sxuserService;@GetMapping("downloadFailedUsingJson")public void downloadFailedUsingJson(@RequestParam(value = "year",required = false) Integer year,HttpServletResponse response) throws IOException {// 这里注意 使用swagger 会导致各种问题,请直接用浏览器或者用postmantry {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("文件名", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");// 这里需要设置不关闭流EasyExcel.write(response.getOutputStream(), Sxuser.class).autoCloseStream(Boolean.FALSE).sheet("sheet名").doWrite(sxuserService.getAllData(year));} catch (Exception e) {// 重置responseresponse.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));}}

EaseExcel的导入导出相关推荐

  1. mysql navicat导入bcp_SQL Server中BCP导入导出用法详解

    bcp命令是SQL Server提供的一个快捷的数据导入导出工具.使用它不需要启动任何图形管理工具就能以高效的方式导入导出数据.bcp是SQL Server中负责导入导出数据的一个命令行工具,它是基于 ...

  2. 数据库Mysql的学习(八)-储存过程和事务和导入导出

    储存过程 DELIMITER // CREATE PROCEDURE pro1() BEGIN SELECT book_id,book_name,category FROM bookinfo t1 J ...

  3. Oracle数据库导入导出命令!

    oracle数据库导入导出命令! 转自:http://www.cnblogs.com/fjfzhkb/archive/2007/09/03/879807.html Oracle数据导入导出imp/ex ...

  4. 关于MSSQL导入导出时主键与约束丢失的问题解决

    导入数据时,使用默认选项,会丢失主键.约束.默认值等属性,按如下步骤操作: -->导出向导  -->选择数据源  -->选择目的  -->指定表复制或查询:不要使用默认选项,选 ...

  5. 关于mysql字符集及导入导出

    MySQL字符集设置 • 系统变量: – character_set_server:默认的内部操作字符集 – character_set_client:客户端来源数据使用的字符集 – characte ...

  6. 转载-SQL Server各种导入导出数据方式的比较

    注:本文转载自 http://blog.csdn.net/nokiaguy/article/details/4684822 当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新 ...

  7. 利用外部命令Oralce数据库导入导出

    1--数据库导出(exp) 首先进入命令行 导出数据库 在命令行中输入如下命令: exp   c2j/c2j@c2j file=c:/table.dmp tables=jbitaku,jbitakum ...

  8. 注解+反射优雅的实现Excel导入导出(通用版)

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/youzi1394046585/ article/details/86670203 日常在做后 ...

  9. mysqldump导入导出百万级数据解决方案

    两条语句: 我有一个叫做qizhi的数据库,里面有个students表大概100多万数据,进入mysql后, 先use 你选择的数据库 再输入select * from 你的表 into outfil ...

最新文章

  1. 软件开发是一门手艺活
  2. python 的进程池不可嵌套
  3. JAVA虚拟机内存不够解决办法
  4. python 网关配置界面代码_Linux下使用python自动修改本机网关代码分享
  5. 状态机编程思想:删除代码注释(支持C/C++和Java)
  6. MyBatis 缓存详解-二级缓存验证
  7. Deep Reinforcement Learning: Pong from Pixels
  8. 一个文科妹子的前端悲欢编程之路
  9. MySQL优化详解(五)——MySQL分库分表
  10. 真正的技术大牛,可能根本不写代码
  11. 什么是干货,什么是鸡汤?
  12. 招聘数据采集+数据清洗与分析+数据可视化
  13. mysql插入失败39_Mysql错误:Duplicateentryamp;#39;127amp;#39;forkeyamp;#39;PRIMARYamp;#39;的解决方法-一团网...
  14. 浏览器服务器文件夹在哪里找,IE临时文件夹在哪?Win7系统下如何查找临时文件夹...
  15. 如何防止数据库的编码格式跟项目编码格式不一致产生乱码, 怎么让数据库的编码格式跟项目编码格式保持一致
  16. http://nxlhero.blog.51cto.com/962631/1666250?plg_nld=1plg_uin=1plg_auth=1plg_nld=1plg_usr=1plg_...
  17. 三阶及四阶Runge-Kutta法
  18. 让文本框输入的文字距离左边框4px
  19. 计算机控制台程序,什么是电脑控制台,是DOS设定吗?
  20. zookeeper--ClientCnxn

热门文章

  1. oracle 布尔盲注,Oracle基于布尔的盲注总结
  2. 用R语言做自己的微信聊天记录词云
  3. SpringMVC——对Ajax的处理(包含 JSON )
  4. 2021-11-11 2021年工具钳工(高级)考试资料及工具钳工(高级)考试试卷
  5. python类的各种方法
  6. 问题解决:虚拟机无法上网,显示网络电缆被拔出
  7. 计算机用并行传输还是串行,终于有人能把“串行通信和并行通信”的区别分析得清清楚楚了...
  8. 一起用C#写个行列式计算器
  9. PCB生产工艺流程八:PCB生产工艺流程第6步 | 外层线路
  10. 开源教育论坛| ChinaOSC