Excel文件操作工具的比较研究

  • 常用工具包介绍

Java处理excel文件导入导出的工具包有很多,比如apache下的poi,alibaba开源的easyexcel,jxl支持的excel版本比较旧,而且功能比较单一,还有github上开源的gridexcel属于个人开发者开发的,就不做比较,下面研究的重点还是比较poi和easyexcel的性能和功能扩展性。

  • 比较研究结论

无论导入导出性能(tps响应时间),还是内存消耗,cpu消耗,easyexcel都会全面碾压poi,项目早期我们采用了poi的工具,后续的项目开发中本着灰度迭代的原则从poi慢慢迁移到easyexcel的导入导出上来。

  • 测试过程

导出测试对比:

名称

样本数

响应时间(ms)

内存消耗

Poi

10000

3605

50m左右

Easyexcel

10000

1617

同上

Poi

100000

40785

50m左右

Easyexcel

100000

6589

同上

Poi

500000

Gc异常了

100m左右

Easyexcel

500000

31617

50m左右

Poi导出的内存消耗不大,当样本为50w的时候的poi抛出的gc异常,和easyexcel相比总体内存虽然消耗差别不大,但是处理性能上当数据量越大,easyexcel的处理速度的性能体现的越明显,

                                                  注:Poi中gc异常图 

                       注:Easyexcel50w样本的cpu内存消耗图

导入测试对比:

名称

样本数

响应时间(ms)

内存消耗

Poi

10000

1960

50m左右

Easyexcel

10000

2073

400m左右

Poi

100000

24065

峰值1G左右

Easyexcel

100000

7925

峰值600m

Poi

500000

时间很长(等了20分钟还在运行)

峰值2G左右

Easyexcel

500000

41192

峰值1200m

Poi的导入相比easyexcel在导入量很少的情况下,内存消耗和响应时间占优势,当样本扩大10倍到50倍,poi性能特别差,吃内存cpu特别严重,挤压其他的业务线程,下图中也有所示,响应时间上遥遥无期,反而easyexcel当样本扩大10倍到50倍,业务处理相对平滑,响应时间和内存消耗变化不大。

                           注:Poi10w样本导入的cpu内存消耗图

注:easyexcel10w样本导入的cpu内存消耗图

注:Poi50w样本导入的cpu内存消耗图

 注:easyexcel50w样本导入的cpu内存消耗图

注:Poi50w样本导入时因内存和cpu资源消耗过多导致对erueka心跳线程的挤压图

  • Easyexcel源代码探究

Easyexcel为什么会如此高效呢,在通过上述测试获得的结论我们知晓了它的性能和处理速度,但是海远远不够,我们还需要知道所以然来,源码中探究发现如下:

easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。

解析XML的方式是SAX。SAX是Simple API for XML的缩写,它是一种基于流的解析方式,边读取XML边解析,并以事件回调的方式让调用者获取数据。因为是一边读一边解析,所以无论XML有多大,占用的内存都很小。以下是easyexcel处理数据的核心类和回调处理器。

 

Apache poi默认是采用dom方式读取,这种方式的原理是将整个文件都加入到内存中,形成dom文件树,然后对树上的任意文件进行读入操作。这样子相当消耗内存,如果操作的数据量很大,会造成因虚拟机内存不足而程序卡顿,

  • Easyexcel功能扩展

Easyexcel不仅仅性能优异,而且相对poi来说,提供了poi实现不了或者比较难于实现的功能,我归纳了一下主要有这几方面

  1. 异步批量导入功能;
  2. 数据填充模板填充功能;
  • Easyexcel在项目中的使用

Easyexcel在项目中直接使用agro-base公共包中的EasyExcelUtil这个工具类,里面提供了导入和导出的调用方法,如下图所示:

如果需要使用异步导入方式可以自行实现,也比较简单高效,参考代码见官方文档:

https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read#%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%AF%BB

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用pandas库来分析Excel数据。Pandas是一个强大的数据分析库,提供了读取和写入各种格式的文件,包括Excel。通过使用pandas的`read_excel()`方法,可以读取Excel文件并将其存储在pandas的DataFrame对象中。然后,可以使用pandas的各种数据分析功能,如筛选、排序、合并和聚合,对数据进行处理和分析。 ### 回答2: 使用Python编写分析Excel数据的工具,可以利用Python中的开源库,例如pandas和openpyxl,来实现数据的导入、清洗、分析和可视化。 首先,可以使用openpyxl库来读取Excel文件,并将数据导入到Python中进行处理。该库提供了操作Excel文件的方法,可以读取不同的工作表、工作簿和单元格,并将数据转化为DataFrame对象。 然后,可以利用pandas库对导入的数据进行清洗和整理。pandas提供了丰富的数据处理方法,例如去除重复值、处理缺失值、筛选数据、计算统计指标等。这些方法可以帮助我们对Excel数据进行规范化和预处理,以便后续的分析。 接下来,可以使用pandas的数据分析功能来对Excel数据进行统计和分析。通过使用pandas的groupby、pivot_table、plot等方法,可以方便地对数据进行分类、汇总和可视化。例如,可以计算每个类别的平均值、总和和标准差,或者绘制柱状图、折线图、散点图等。 最后,可以利用Python中其他的可视化库,如matplotlib和seaborn,进一步对Excel数据进行可视化展示。这些库提供了丰富的图表类型和定制化选项,可以绘制出更加美观和有用的图表,以便更好地理解和传达分析结果。 综上所述,使用Python编写分析Excel数据的工具,可以方便地导入、清洗、分析和可视化Excel数据。通过使用pandas和其他的数据处理和可视化库,可以快速高效地进行数据分析,帮助用户更好地理解和利用Excel数据。 ### 回答3: Python是一种功能强大的编程语言,它拥有丰富的库和模块,可用于各种任务,包括分析Excel数据。使用Python编写分析Excel数据的工具可以提供以下功能: 首先,可以使用Python中的openpyxl库来读取和写入Excel文件。该库提供了许多功能,使我们能够轻松地访问和处理Excel中的数据。例如,我们可以通过提供Excel文件的路径打开工作簿,并选择需要操作的工作表。然后,我们可以使用工作表对象的各种方法来访问和操作单元格,行和列。 其次,我们可以利用pandas库来分析Excel数据。pandas是一个用于数据分析的强大库,它提供了数据结构和数据分析工具,可以使我们更轻松地处理和分析大量的Excel数据。我们可以使用pandas的read_excel方法读取Excel文件,并将其转换为pandas的DataFrame对象。然后,我们可以使用DataFrame对象的各种方法和函数来进行数据筛选、排序、计算统计指标等操作,以便更好地理解和分析数据。 另外,我们还可以使用matplotlib库来进行数据可视化。通过将pandas的DataFrame对象与matplotlib结合使用,我们可以绘制各种图表,如折线图、柱状图、散点图等。这可以有助于我们更直观地理解数据的分布、趋势和相关性。 最后,我们可以使用Python的其他库和模块来进行高级数据分析,如numpy用于数值计算、scikit-learn用于机器学习和数据挖掘、statsmodels用于统计建模等等。这些工具可以进一步增强我们分析Excel数据的能力。 总而言之,使用Python编写分析Excel数据的工具可以使我们能够方便地读取、处理和分析Excel文件,并提供各种功能,包括数据筛选、统计分析和数据可视化等。这些功能对于数据分析师、研究人员和决策者来说都非常有用,可以帮助他们更好地理解和利用Excel中的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值