在Java中读取Excel表格的更好的API是什么——JXL还是Apache POI?

96

哪个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等)?每个API最适合使用的场景是什么? - Cléssio Mendes
4个回答

261
我使用过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不支持图表创建或操作;Apache POI中还没有此支持,但API正在逐渐形成。
Apache POI拥有比JXL更广泛的文档和示例集。
此外,POI不仅包含主要的“usermodel” API,还包括基于事件的API,如果您只想读取电子表格内容。
总之,由于更好的文档、更多的功能、积极的开发和对Excel 2007+格式的支持,我使用Apache POI。

8
赞同该评论的清晰、简洁和极具帮助性。 - Ron
1
JExcelAPI中那个“getContents()”方法虽然不太规范,但却省去了我很多时间。而使用POI,则需要检查单元格类型,再根据其类型获取值(如果是数字单元格,还需检查是否为日期单元格),最后使用不同的方法将其转换为字符串值,非常不方便。无法想象POI居然没有提供像JExcelAPI那样这样一个又脏又方便的方法。 - LiuYan 刘研
1
如果POI基于事件的读取方式,那么这是一件非常积极的事情。特别是在移动设备(=Android)上,当处理有限的堆大小和GC时,这将对减少负担有很大帮助。使用JXL读取简单的XLS文件通常会达到应用程序内存限制,导致应用程序崩溃。 - dermatthias
2
迁移到POI的一个重要因素是其灵活性,可以使用流API,这在读取大量数据的Excel时必不可少。如果Excel中的数据很大,您肯定不希望整个数据都在打开Excel时加载到内存中。通过流式处理,解析工作表后,您的Excel/任何办公文档的全部内容将不会立即加载到内存中。 - Ashok Koyi
@LiuYan刘研,如果这是唯一的问题,那么编写自己的getContents()方法并在需要时使用它是否很困难? - kerberos84
显示剩余2条评论

13

我已经使用过POI。

如果你使用它,请注意这些单元格格式化程序:创建一个并多次使用,而不是每次为单元格创建一个,这在处理大量数据时会有巨大的内存消耗差异。


5

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

CSV文件不是Excel文件,它们是基于文本的文件,所以这些库不能读取它们。你需要自己解析CSV文件。我不知道有任何CSV文件库,但我也没有查过。


1

3
现在,Apache也有一个CSV的Commons工具包:http://commons.apache.org/proper/commons-csv/。它的表现相当不错,并且具有很好的品牌名称。 - le3th4x0rbot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接