未来的十年是产业互联网的时代,产业互联网的特点是数字化、线上化、效率化。这意味着各行各业急需数字化转型和效率转型。而在这场转型过程中,企业 OA 系统扮演着至关重要的角色。对企业而言,OA 系统不仅提高了企业的组织管理水平及办公效率,更实现了提高决策效能的目的,使企业竞争力得到提升。但是,随着 OA 系统功能模块越来越齐全,越来越臃肿,也让这一效率平台逐渐“失效”。
一、OA 系统的核心,是业务管理中的效能问题
OA 系统的管理最终还需要回归至业务管理的道路上来,毕竟业务才是企业的运作根本。OA 系统中常见的业务管理包括哪些呢?比如财务报表的制作,凭证的生成;采购部的供货商的管理,采购单据的输入与保管;业务部的合同管理,客户维护等等。这些大部分都是在表格的形式中完成分析与决策的,需要要求 OA 系统将数据完好的保存与共享,并与其他系统进行数据整合。但目前企业 OA 系统中的表格功能,大部分都肩负着非常复杂的业务需求。不仅需要具备着传统 Excel 中的大部分核心功能,包括函数计算、条件格式、图表等等;还需要支持高效的多人协同编辑以及庞大的数据处理需求。数据量以及表格功能的逐渐增加,随之而来的就是计算速度的降低。这不仅会影响工作效率,打断思路的连贯性,也会增加员工或者用户的出错率和对工作的厌烦程度(尤其时在处理重复任务时)。此外,内存占用的问题,也是 OA 系统中一项非常重要但容易被人忽略的性能指标,如果技术选型时未考虑内存占用问题,往往会出现一个 3M 的文件消耗 100 多兆内存空间的情况。如果同时进行包含大数据量的 Excel 读操作,很容易造成内存溢出问题。传统企业的技术决策层普遍都会忽视“内存的价值”,但是:
一旦访问量大,内存就会瞬间上涨,导致频繁 GC,导致性能下降;
内存高也会导致服务器分页,这时性能就会急剧下降;
吞吐量下降会导致队列排满,服务器会报 503 等错误。
所以除非企业真的有充足的预算去升级服务器,不然真的不能忽略内存的优化。这两个问题的背后,也引出了我们今天讨论的重点 —— 如何提高 OA 系统表格模块的数据处理性能 & 表格数据处理产品的技术选型。
二、你愿意投入多少成本,为 20 秒的业务优化买单?
大部分企业在项目的日常开发中遇到表格数据处理需求时,往往会在业务代码中直接引入如 Apache POI 这类的技术解决方案。Apache POI 作为一款非常强大的 Office 软件操作包,是 Apache 软件基金会用 Java 编写的免费开源的跨平台 Java API,提供了对 Microsoft Office 格式文件的读写功能,在项目中的应用非常广泛,作为一款开源软件,为开发者提供了极大的便利。然而,即便 POI 很强大,但仍存在一些不可忽视的问题。首先是代码相对比较繁琐,并且当 Excel 的数据量非常大的时候,POI 的操作逻辑是将整个 Excel 的内容全部读出来放入到内存中,这就导致内存消耗非常严重,一个 3M 的文件甚至需要消耗 100 多兆的内存空间。如果同时进行包含大数据量的 Excel 读操作,很容易造成内存溢出问题。除了耗内存以外,还有版本兼容性不够等缺点,在进行版本升级的过程中,需要对以前的代码进行修改,或者对 jar 包进行版本隔离,这些都对项目带来了很多潜藏的风险。为了帮助有相关需求的企业人员进行技术选型,提供一些更直观的数据对比,我们为大家进行了一次对比测试,下图是测试的相关结果:从测试数据来看,葡萄城提供的服务端高性能表格组件 GrapeCity Documents for Excel (简称:GcExcel) https://www.grapecity.com.cn/developer/grapecitydocuments/excel-java 无论从运行速度、功能,还是内存消耗等方面,都要比 Apache POI 表现的更为优秀,如其平均处理速度可以达到 POI 的 7 倍,而内存消耗却不到七分之一。 为了进一步测试 Excel 文件的读取性能极限,我们使用了 StopWatch 函数来监听 Excel 的打开时间,测试对象为一个包含 30 列、1,000,000 行、30,000,000 个单元格数据的电子表格文件。经过测试, Excel 打开这个文件需要等待 34 秒,而用 GcExcel 打开这样一份文件,仅需 12 秒。这 20 秒的时间,对于用户体验以及业务流转来说,重要性不言而喻。这个测试结果也为企业选型提供了一个思路 —— 你愿意投入多少成本,来为这 20 秒的业务优化买单?