这常常会导致用户无法获得正确的 Word 文档页数。对此,我们对 Apache POI 和 OpenOffice API 进行简要的介绍,并结合使用 Apache POI 和 OpenOffice API 开发了一套获取微软 Office 系列文档(WORD, EXCEL and POWERPOINT)的页数的解决方案,以方便广大的开发人员快速方便地应用到自己的项目中。
Apache POI 是一套用于访问微软 Office 格式文档 (Word, Excel and PowerPoint) 的 Java API。其中用于操作 Excel 格式文件的 API 是 HSSF,用于操作 Word 格式文件的 API 是 HWPF 以及用于操作 PowerPoint 格式文件的 API 是 HSLF。
POI 的官方网站是 http://poi.apache.org,用户可以先从这里下载最新的版本 3.6,下载解压后里面有三个 jar 包(poi-3.6-20091214.jar,poi-contrib-3.6-20091214.jar 和 poi-scratchpad-3.6-20091214.jar)将这三个 jar 包拷贝至 Eclipse 工程的 lib 目录中,然后刷新工程即可加载 POI 的类库。
POI 主要组成部分
POIFS:POIFS 是该项目的最古老,最稳定的一部分,它同时支持读写功能,所有的组件最终都依赖于它的定义。
POIFS 对于 OLE 2 文件操作: POIFS 的基础是最古老和最稳定的项目的一部分。这是我们的 OLE 2 复合文档格式的纯 Java 实现。它同时支持阅读和书写功能。我们的组成部分都最终依赖于它的定义。更多信息请参阅 POIFS 项目页。
HSSF 对于 Excel 文件操作:HSSF 是针对 Microsoft Excel 97(-2003)文件格式(BIFF8)的文档操作的纯 Java 实现。它支持阅读和书写能力。更多信息请参阅 HSSF 项目页。
HWPF 对于 Word 文件操作:HWPF 是针对 Microsoft Word 97 文件格式的文档操作的纯 Java 接口。该组件是在发展的初期阶段,对 word 文档的读写能力有限,仅仅可以阅读和书写简单的 word 文件,更多信息 HWPF 请参阅 HWPF 的项目页。
HSLF 对于 PowerPoint 文件操作:HSLF 是针对 Microsoft PowerPoint 97(-2003)文件格式的文档操作的纯 Java 接口。它支持阅读和书写能力。更多信息请参阅 HSLF 项目页。
HDGF 对于 Visio 文件操作:除此之外 POI 还提供了 HDGF 对微软 Visio97(-2003)文件格式的文档操作的纯 Java 接口。它目前只支持读取操作,在一个很低的水平,只支持简单的文本提取。更多信息请参阅 HDGF 项目页。
HPSF 文档属性:HPSF 是这对 OLE 2 设置格式的纯 Java 接口。主要是用来存储文件的属性集(如:标题,作者,最后修改日期等属性),他们可以为特定应用目的所使用。更多信息请参阅 HPSF 项目页。
下面我们简单的介绍一下项目中经常会使用到的对于 Excel 和 Word 格式文件进行操作的接口:
HSSF 接口
目前 POI 比较成熟的部分是 HSSF 接口,处理 MS Excel(97-2003)对象。它不像我们仅仅使用 csv 生成的没有格式的可以由 Excel 转换的东西,而是真正的 Excel 对象,你可以控制一些属性如 cell,sheet 等等。当然,HSSF 也有一些缺点,比如不能直接支持 Excel 图表,包与包之间依赖关系比较复杂等等。
对于统计页数 (sheet 个数 ) 来说,HSSF 接口可以很简单的完成这一功能。下面我们简单的介绍一下 HSSF 接口:
HSSF 提供给我们使用的对象在 org.apache.poi.hssf.usermodel 包中,主要部分包括 Excel 对象,样式和格式,还有辅助操作。主要有以下几种对象:
HSSFWorkbook: 对应于 Excel 的文档对象
HSSFSheet: 对应于 Excel 的表单
HSSFRow: 对应于 Excel 的行
HSSFCell: 对应于 Excel 的格子单元
HSSFFont: 对应于 Excel 字体
HSSFName: 对应于 Excel 名称
HSSFDataFormat: 对应于日期格式
HSSFHeader: 对应于 Sheet 头
HSSFFooter: 对应于 Sheet 尾
HSSFCellStyle: 对应于 Cell 样式
辅助操作包括:
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
HWPF 接口
HWPF 主要用来处理 MS Word(97-2003)对象,是 POI 中相对不太成熟的部分。但可以做一些基本的对于对 word 文档的读写操作。对于统计页数来说,HWPF 中 WordExtractor 的 SummaryInformation 提供了一个 getPageCount 的方法,但并不是特别的好用。下面我们先简单的介绍一下 HWPF 接口:
HSSF 提供给我们使用的对象在 org.apache.poi.hwpf.extractor 和 org.apache.poi.hwpf.usermodel 包中,主要部分包括 Word 对象,表格等。主要有以下几种对象:
WordExtractor 从 Word 文档中提取出文本的类。
Paragraph 对应于 Word 的一个段落范围。
Table 对应于 Word 的一个表格范围。
TableCell 对应于 Word 的一个表格的 cell 范围。
Range : 这个类是 HWPF 对象模型的核心类。适用于在 Word 文档中的字符的范围的所有属性扩展这个类。它可以插入文字或者选定一定范围的属性。
注:对于 HWPF 组件,经过我们的测试,发现其无法正确地读取 word 文件页数,所以我们使用 OpenOffice API 来替代这一部分。后面我们将会对这一部分进行详细地介绍。