什么是在Java中读取Excel工作表的更好的API-JXL或Apache POI [关闭]


94

这2个API中哪个更容易读取/写入/编辑Excel工作表?这些API是否不支持CSV扩展?

使用JXL进行file.xls和file.xlsx时,出现如下异常:

jxl.read.biff.BiffException: Unable to recognize OLE stream
    at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)
    at jxl.read.biff.File.<init>(File.java:127)
    at jxl.Workbook.getWorkbook(Workbook.java:268)
    at core.ReadXLSheet.contentReading(ReadXLSheet.java:46)
    at core.ReadXLSheet.init(ReadXLSheet.java:22)
    at core.ReadXLSheet.main(ReadXLSheet.java:72)

.xls和.xlsx扩展名都可以。我使用的Java版本是:JDK1.6


1
关于什么:“有哪些API可以用Java读写Microsoft Excel电子表格(JXL,Apache POI等)?使用它们的最佳方案是什么?”
克莱西奥·门德斯

Answers:


258

我已经使用了JXL(现在称为“ JExcel”)和Apache POI。最初,我使用JXL,但现在使用Apache POI。

首先,这两个API具有相同的最终功能:

  • 两者都是免费的
  • 单元格样式:对齐方式,背景(颜色和图案),边框(类型和颜色),字体支持(字体名称,颜色,大小,粗体,斜体,删除线,下划线)
  • 公式
  • 超连结
  • 合并的细胞区域
  • 行和列的大小
  • 数据格式:数字和日期
  • 单元格内的文字换行
  • 冻结窗格
  • 页眉/页脚支持
  • 读取/写入现有和新电子表格
  • 两者都试图将现有对象尽可能完整地保留在电子表格中。

但是,有许多差异:

  • 也许最重要的区别是Java JXL不支持Excel 2007+“ .xlsx”格式;它仅支持旧的BIFF(二进制)“。xls”格式。Apache POI通过通用设计支持这两种方法。
  • 此外,JXL API的Java部分上次更新是在2009年(我撰写本文时是3年零4个月),尽管看起来好像有C#API。Apache POI得到积极维护。
  • JXL不支持条件格式,Apache POI不支持条件格式,尽管这并不重要,因为您可以使用自己的代码有条件地格式化单元格。
  • JXL不支持 文本格式,即文本字符串中不同格式; Apache POI确实支持它。
  • JXL仅支持某些文本旋转:水平/垂直,+ /-45度和堆叠;Apache POI支持任意整数度数加上堆叠。
  • JXL不支持工程图形状。Apache POI可以。
  • JXL支持大多数页面设置设置,例如横向/纵向,边距,纸张尺寸和缩放。Apache POI支持所有这些功能以及重复行和列。
  • JXL不支持拆分窗格。Apache POI可以。
  • JXL不支持Chart的创建或操纵;Apache POI尚不支持该功能,但API逐渐形成。
  • 与JXL相比,Apache POI提供了更广泛的文档和示例集。

此外,POI不仅包含主要的“用户模型” API,而且还包含基于事件的API(如果您要做的只是读取电子表格内容)。

总之,由于更好的文档,更多的功能,活跃的开发以及Excel 2007+格式支持,我使用Apache POI。


感谢您的详尽解释。
Swagatika

8
+1清晰,简洁且极有帮助
Ron

1
getContents()JExcelAPI中的肮脏方法为我节省了很多时间。使用POI时,必须检查它的单元格类型,然后根据其类型获取它的值(如果是数字单元格,则需要检查它是否是Date单元格),最后使用不同的方法将其转换为String值,这非常不方便。不能想象POI没有像JExcelAPI那样提供肮脏但方便的方法。
LiuYan刘研

1
如果POI是基于事件的阅读,那将是一件非常积极的事情。特别是在移动设备(= Android)上,这在处理有限的堆大小和GC时很有帮助。使用JXL读取简单的XLS通常会达到应用程序的内存限制,从而导致应用程序崩溃。
dermatthias 2014年

2
使我迁移到POI的重要因素之一是使用Steaming API的灵活性,这是您要读取包含大量数据的excel所必需的。如果excel中的数据很大,则您不希望在打开excel时将坏数据加载到内存中。使用流技术,您解析工作表后,Excel /任何Office文档的全部内容都不会立即加载到内存中。
Ashok Koyi 2014年

12

我已经使用过POI。

如果使用它,请密切注意那些单元格格式化程序:创建一个并多次使用它,而不是每次为单元格创建一次,这是巨大的内存消耗差异或大数据。


5

我不熟悉JXL,但是我们使用POI。POI维护得很好,可以处理Office 2007中引入的二进制.xls格式和基于XML的新格式。

CSV文件不是excel文件,它们是基于文本的文件,因此这些库不会读取它们。您将需要自己解析一个CSV文件。我不知道任何CSV文件库,但是我也没有。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.