V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GrapeCityChina
V2EX  ›  程序员

终于有一款组件可以全面超越 Apache POI

  •  
  •   GrapeCityChina ·
    GrapeCity · 2020-04-17 14:36:30 +08:00 · 4315 次点击
    这是一个创建于 1679 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 GrapeCity Documents 出现以前,服务端文档组件向来以 Apache POI 为代表,作为一款由 Java 编写的开源 API 库,Apache POI 主要应用于对文档进行读、写,以及创建和维护。

    但正如 POI 所定义的那样:作为“Poor Obfuscation Implementation”首字母的缩写,Apache POI 仅提供“简单的模糊实现”,其在创建复杂逻辑的大型文档时,经常会捉襟见肘。

    如果想通过简单的代码逻辑,快速创建、加载、编辑、导入 /导出大型文档( Excel 、Word 、PDF ),并将其部署到云端时,又该如何实现?

    而这些需求,恰恰是 GrapeCity Documents 可以满足的。

    GrapeCity Documents 是什么?

    image.png

    GrapeCity Documents 是一款快速且高效的服务端文档组件包,可在 Windows 、Mac 、Linux 上完美运行,同时适用于 .NET 和 Java 平台,可在不依赖第三方组件的情况下,提供快速生成、加载、编辑和保存 Excel 、PDF 、Word 文档的功能。

    GrapeCity Documents 由四种针对不同文档和开发框架的组件构成:

    · 适用于所有 .NET 平台的 Excel 文档 API —— GcExcel (.NET )

    · 适用于所有 Java 平台的 Excel 文档 API —— GcExcel ( Java )

    · 适用于所有 .NET 平台的 PDF 文档 API —— GcPDF

    · 适用于所有 .NET 平台的 Word 文档 API —— GcWord

    下面,我们将以其中的 GcExcel 为例,详细对比它与 Apache POI 的功能及性能优劣。

    功能对比:GcExcel VS Apache POI

    1. 公式数量

      GcExcel 支持 452 种 Excel 公式。

      Apache POI 中,支持的公式数量很少(虽然 Apache POI 网站罗列了 280 多种可评估的公式,但在 API 中仅显示为 157 种)。

    2. 是否支持导出 PDF

      GcExcel 不但支持导出 PDF 格式,还可控制页面设置选项。

      Apache POI 不支持导出 PDF 。

    3. 条件格式

      GcExcel 支持多种条件格式,如自定义图标集、判断是否高于平均值( AboveAverage )、发生日期判断、Top 10 和重复项判断,且这些条件格式的设置规则与 VSTO 保持一致。

      但在 Apache POI 中,使用高级 API 来增加条件格式判断会受限。因此,只能使用标记为内部用途的低级类来处理 Top10 、高于平均值( AboveAverage )等格式化选项。

    4. 图表类型

      GcExcel 的图表界面与 VSTO 一致,支持约 53 种图表类型。

      Apache POI 对图表的支持非常有限,仅支持 Line 、Bar 、Column 、Scatter 和 Radar 图表类型。

    5. 迷你图

      GcExcel 完全支持添加和配置迷你图( Sparklines )。

      Apache POI 目前不支持 Sparklines 。

    6. 剪切、复制、粘贴形状

      GcExcel 支持剪切、复制、粘贴形状,Apache POI 不支持。

    7. 过滤器数据类型

      GcExcel 广泛支持文本、数字、日期、颜色和图标等过滤器。

      Apache POI 仅支持基本的 AutoFilter,需要使用低级类来实现应用过滤或创建任何其他高级过滤器。

    8. 排序

      GcExcel 支持所有类型的行排序、列排序、自定义排序、颜色和图标排序。

      Apache POI 没有内置的排序功能。但是,用户可以使用 shiftRows ()/ ShiftColumns ()并以编程方式对数据进行排序。

    9. 切片器

      GcExcel 支持带有数据透视表的切片器,而 Apache POI 则不支持。

    10. 导出 CSV 格式

      GcExcel 支持导出为 CSV 格式。

      Apache POI 没有提供内置的导出 CSV 选项。但是,可以使用编程的方式创建相应的 CSV / HTML 文件。

    11. 渐变填充

      GcExcel 支持渐变填充,而 Apache POI 不支持。

    12. 单元格中获取 /设置值

      在对单个单元格执行获取 /设置值的情况下,GcExcel 比 Apache POI 表现的更好。

    13. 示例与帮助文档

      使用 Apache POI,许多功能需要访问和了解底层 API 才能实现, 但 Apache POI 提供的示例和文档数量十分有限,对于开发人员来说学习成本较大。

      而 GcExcel 作为独立于平台的 API 组件,具备高性能、低内存消耗的特点,并且与 Excel 对象模型严格兼容。GcExcel 更加易于使用且功能全面,通过其提供的在线演示示例和帮助文档,开发人员可以快速上手,迅速掌握产品使用技巧。

    性能对比:GcExcel VS Apache POI

    让我们通过一个 GcExcel Java 的基准测试项目对比其与 Apache POI 的性能优劣,该项目是一个 java gradle 项目,可以输出 GcExcel 、POI 和 Aspose.Cells 的性能结果,如下所示:

    · 设置:获取和保存 100,000 * 30 单元格的 double / string / date 值,下图显示了 double 值的结果。

    · GcExcel 用时不超过 0.2S ; Apache POI 则达到 18.7S 左右

    image.png

    image.png

    · 设置:计算和保存 20,000 * 30 个单元格的公式,结果如下:

    · GcExcel 用时不超过 1S ; Apache POI 则达到 10S 左右

    image.png

    · 打开并保存一个 20.5MB 的 Excel 文件,其中包含了许多数据、公式和单元格格式,结果如下:

    · GcExcel 用时不超过 4.9S ; Apache POI 则达到 10S 左右

    · GcExcel 内存消耗为 72.1MB ; Apache POI 为 3518.2MB

    image.png image.png

    结论

    从以上结果可以看出,GcExcel 是目前为止速度最快、内存消耗最少的服务端电子表格组件。

    尽管 Apache POI 是免费的,但它的速度和内存消耗远远达不到企业级项目的标准,这就是为什么我只选择 100,000 * 30 个单元格的原因,因为即使在 1,000,000 * 30 个单元格的情况下,GcExcel Java 仍旧可以平稳运行。

    除此之外,为了保证 Apache POI 成功运行,还必须将 JVM 最小堆大小配置为 4G,否则它将抛出 OutOfMemory 异常。 以下是 build.gradle 中的 JVM 配置:

    applicationDefaultJvmArgs = ["-Xms4096m", "-Xmx8192m"]
    

    大家可以从 GitHub 上下载这个测试项目:

    https://github.com/GrapeCity/GcExcel-Java/tree/master/benchmark, 并使用以下命令行运行它:

    • on mac: ./gradlew run --args="double" //参数可以是 double, string, date, formula, bigfile
    • on windows: gradlew run --args="double" //参数可以是 double, string, date, formula, bigfile

    请注意,第一次运行会非常慢,因为它需要下载 gradle 和所有相关软件包。


    以上,就是 GrapeCity Documents 与 Apache POI 在功能和性能上的对比测试,从数据可见,无论是运行速度,还是内存消耗,GrapeCity Documents 都要比 Apache POI 表现的更为优秀。

    如果您也有服务端处理 Excel 、Word 、PDF 等文档的需求,需要快速批量操作大型文档,可以前往 GrapeCity Documents 官网 ,下载试用。

    20 条回复    2020-09-23 10:32:11 +08:00
    urzz
        1
    urzz  
       2020-04-17 18:40:46 +08:00
    POI 性能和功能支持确实有限。
    但是性能对比中,poi 对应比较大的 excel 的读写不应该用 XSSFWorkbook,而是选择使用 SXSSF 。
    MinQ
        2
    MinQ  
       2020-04-17 19:40:42 +08:00
    原来是收费的啊,那我还是用 POI 好了……
    jjianwen68
        3
    jjianwen68  
       2020-04-20 10:29:36 +08:00   ❤️ 3
    总要踩着别人上位
    chendy
        4
    chendy  
       2020-04-20 10:36:35 +08:00   ❤️ 2
    你个收费库的和人家开源免费的比啥啊…
    GrapeCityChina
        5
    GrapeCityChina  
    OP
       2020-04-20 11:00:09 +08:00
    @chendy 比性能、比速度呗,总有企业需要的
    lewis89
        6
    lewis89  
       2020-04-20 11:09:10 +08:00
    @GrapeCityChina #5 说实话 我宁愿做个小工具 把 excel 转成 SQL,之前用了 Apache POI 读写 Excel 直接内存爆炸,后来找了个 GitHub 上一个以流为读写的工具 才勉强搞定了问题
    yuzo555
        7
    yuzo555  
       2020-04-20 11:09:38 +08:00
    图片防盗链了
    taylorzhi
        8
    taylorzhi  
       2020-04-20 11:14:35 +08:00
    阿里的 easyexcel 很香啊
    RandomJoke
        9
    RandomJoke  
       2020-04-20 11:21:02 +08:00
    收费,并且 Java 只支持 excel , 全面超越 POI 可有点扯...
    GrapeCityChina
        10
    GrapeCityChina  
    OP
       2020-04-20 11:26:50 +08:00
    GrapeCityChina
        11
    GrapeCityChina  
    OP
       2020-04-20 11:30:30 +08:00
    @lewis89 确实 POI 在读写大型 Excel 文档时不是最优选择,不过吧 Excel 转成 SqL,样式和公式应该就不在了吧
    abcbuzhiming
        12
    abcbuzhiming  
       2020-04-20 11:46:04 +08:00
    收费的玩意在这装逼?收费的各种商业 Office 处理组件满坑满谷的,缺你这一个?
    abcbuzhiming
        13
    abcbuzhiming  
       2020-04-20 11:47:05 +08:00   ❤️ 1
    @GrapeCityChina 比性能比速度请去找一个同样是收费的商业库来比,不要和开源库碰瓷,很恶心,很下流,很无赖,很卑鄙
    GrapeCityChina
        14
    GrapeCityChina  
    OP
       2020-04-20 11:52:17 +08:00
    @abcbuzhiming 你好好看看 github 上的测试项目再来喷粪好吗?
    abcbuzhiming
        15
    abcbuzhiming  
       2020-04-20 12:07:08 +08:00   ❤️ 3
    @GrapeCityChina 测试什么,你这项目是开源的?是免费的?不是你说个屁?碰瓷开源项目你还有道理了?明明就是个做广告的。做广告也就罢了,踩 POI 项目上位,要点脸不?
    0x666666
        16
    0x666666  
       2020-04-20 15:40:14 +08:00
    @jokefaker 果奶?在这也能碰到你
    sonyxperia
        17
    sonyxperia  
       2020-04-20 15:48:10 +08:00
    标题里都不敢写自己的产品名称,只能写竞品的
    xcstream
        18
    xcstream  
       2020-04-21 02:35:54 +08:00
    程序员喜欢白嫖的 哈哈哈
    RandomJoke
        19
    RandomJoke  
       2020-09-22 18:22:40 +08:00
    @0x666666 一年难得回一条都被你发现了....你是?
    0x666666
        20
    0x666666  
       2020-09-23 10:32:11 +08:00
    @jokefaker #19 吴帅苹
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5834 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:00 · PVG 10:00 · LAX 18:00 · JFK 21:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.