挖掘开源的价值

每天分享一篇优质的开源项目~

3篇原创内容


大家好,我是开源君,今天给大家推荐的是**【easyexcel】**

项目介绍

这是一款由阿里巴巴开源的,快速、简单避免OOM的java处理Excel工具。

Java解析、生成Excel比较有名的框架有Apache poi、jxl。

但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。

easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。

在上层做了模型转换的封装,让使用者更加简单方便。

核心原理

写有大量数据的xlsx文件时,POI为我们提供了SXSSFWorkBook类来处理,这个类的处理机制是当内存中的数据条数达到一个极限数量的时候就flush这部分数据,再依次处理余下的数据,这个在大多数场景能够满足需求。读有大量数据的文件时,使用WorkBook处理就不行了,因为POI对文件是先将文件中的cell读入内存,生成一个树的结构(针对Excel中的每个sheet,使用TreeMap存储sheet中的行)。如果数据量比较大,则同样会产生java.lang.OutOfMemoryError: Java heap space错误。POI官方推荐使用“XSSF and SAX(event API)”方式来解决。分析清楚POI后要解决OOM有3个关键。

1. 文件解压文件读取通过文件形式

2、避免将全部全部数据一次加载到内存

3、抛弃不重要的数据

Excel解析时候会包含样式,字体,宽度等数据,但这些数据是我们不关心的,如果将这部分数据抛弃可以大大降低内存使用。Excel中数据如下Style占了相当大的空间。

快速开始

读Excel

    /*** 最简单的读* <p>1. 创建excel对应的实体对象 参照{@link DemoData}* <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}* <p>3. 直接读即可*/@Testpublic void simpleRead() {String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();}

写Excel

    /*** 最简单的写* <p>1. 创建excel对应的实体对象 参照{@link com.alibaba.easyexcel.test.demo.write.DemoData}* <p>2. 直接写即可*/@Testpublic void simpleWrite() {String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx";// 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭// 如果这里想使用03 则 传入excelType参数即可EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());}

web上传、下载

 /*** 文件下载(失败了会返回一个有部分数据的Excel)* <p>1. 创建excel对应的实体对象 参照{@link DownloadData}* <p>2. 设置返回的 参数* <p>3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大*/@GetMapping("download")public void download(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmanresponse.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(), DownloadData.class).sheet("模板").doWrite(data());}/*** 文件上传* <p>1. 创建excel对应的实体对象 参照{@link UploadData}* <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link UploadDataListener}* <p>3. 直接读即可*/@PostMapping("upload")@ResponseBodypublic String upload(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();return "success";}

https://www.github.com/shaoxiongdu/easyexcel

照旧安利一波我们的公众号:【挖掘开源的价值

挖掘开源的价值

每天分享一篇优质的开源项目~

持续分享优质的**开源项目、**开发工具、编程技巧

我们的目标是:分享好玩的项目挖掘开源的价值


Java高效处理Excel【阿里yyds!】相关推荐

  1. java excel 合并两个单元格内容 无法换行_12个简单高效的EXCEL小技巧,让你秒变职场达人!...

    小伙伴们早上好,今天小编和大家分享一组简单高效的Excel小技巧,点滴积累,也能提高办公效率哦. 1.填充合并单元格 在工作表中尽量不使用合并单元格,否则就是重复工作量.那么对已有合并单元格的工作表, ...

  2. 【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

    原文链接:点击打开链接 阿里极客公益活动: 或许你挑灯夜战只为一道难题 或许你百思不解只求一个答案 或许你绞尽脑汁只因一种未知 那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了 他们用户自己手 ...

  3. java后台实现excel文件下载功能

    java后台实现excel文件下载功能  java中对于excel文件的操作,有读取,写入,上传等功能,在对excel文件进行操作时,为了让使用者更加直观的制作excel数据,必然会有下载模板exce ...

  4. JAVA编码规约(阿里)

    2019独角兽企业重金招聘Python工程师标准>>> java开发规范(阿里) 1.抽象类命名使用 Abstract 或 Base 开头:异常类命名使用 Exception 结尾: ...

  5. Java高效读取大文件

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础"系列教程的一部分. ...

  6. Java - Poi 操作 Excel

    Java - Poi 操作 Excel 关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 注意 XSSFWorkbook 对象是操作 .xlsx 格式的表格 HS ...

  7. 从普通JAVA程序员到阿里P8架构师,他用了六年

    工作年限:8 年服务公司:4 家(含四大门户中的两家)最近职业:Java 架构师职场关键词:社交平台.高并发系统架构设计.技术团队管理.多款从零到一的产品城市! 六年间,这位职人呆过四大门户中的两家, ...

  8. java ssh 下载excel,SSH整合WEB导出EXCEL案例

    基于Spring,Struts2,Hibernate整合, jsp页面导出(下载)excel文件的简单应用 1)本例不采用Java任何导出excel文件常用的poi或者jxl 等第三方jar包,仅仅基 ...

  9. java实现导出Excel的功能

    这篇文章主要为大家详细介绍了java实现导出Excel的功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一 ...

最新文章

  1. xauth: (stdin):1: bad display name LSPPC-Lenny:1 in add command
  2. ASP.NET Core结合Nacos来完成配置管理和服务发现
  3. 编程之美-程序改错方法整理
  4. celery无密码连接redis与带密码连接redis
  5. SAP Commerce Cloud 概述
  6. 批量标准化BN方法简介【避免了梯度消失和梯度爆炸、加速网络的收敛、优化网络结构】
  7. 虚拟化整合实现1+1大于2的效果
  8. 查找表_leetcode454
  9. 全局替换字体,开源库更方便!!! 1
  10. java的colt矩阵操作_colt-1.2.0
  11. 微信小程序登录流程总结 目录 1.1. 前端调用wx.login 。。给后端传递一个code 1 1.2. 开发者需要在开发者服务器后台调用 auth.code2Session,使用 code 换取
  12. beta 发布的相关评论
  13. Java绿盾解密- Ldterm(绿盾加密文件解密)
  14. cnpm下载依赖包速度快的原理探究
  15. 如何用css实现元素固定宽高比?
  16. StataIC——线性回归计算个股的β值
  17. 分数排名 mysql_MYSQL分数排名
  18. 零基础学前端系列教程 | 和前端谈恋爱的第005天——约会账单
  19. Hadoop的学习笔记(Hive|pig|zookeeper|hbase)
  20. 成立两只产业基金,微盟如何布局SaaS生态?

热门文章

  1. 如何更新VLC媒体播放器
  2. Angularts将前端数据生成报表
  3. android版本飞鸽传书源码
  4. 【牛客刷题-算法】1-算法入门-数据结构-栈
  5. 【观察】戴尔科技首发Azure Stack HCI,背后的大势、胜势与升势
  6. Matlab替换wrfinput数据,WRF模式之个例模拟
  7. Android筑基——自定义属性详解
  8. Html和Css的理解
  9. 利用vbs将word、excel、ppt转换成pdf
  10. 渗透之路 安全工具【第五篇】Google Hack