零、前言
最近在项目中要生成Word的doc和docx文件,一番百度google之后,发现通过java语言实现的主流是Apache的POI组件。除了POI,这里还有另一种实现,不过我没有去研究,有兴趣的同学可以研究研究。
关于POI可以访问Apache POI的官网获取详细的信息。
进入主题!
由于项目中只是用到了doc和docx的组件,下面也只是介绍这两个组件的使用
一、在Android Studio中如何用POI组件
从POI官网上看,貌似暂并不支持IntelliJ IDE,如下图,所以这里我们采用直接下载jar包并导入项目的方式。
通过官网 ->Overview->Components,可以看到 d和docx文件分别对应着组件HWPF和XWPF,而HWPF和XWPF则对应着poi-scratchpad和poi-ooxml
文件类型 | 组件名 | MavenId |
---|---|---|
doc | HWPF | poi-scratchpad |
docx | XWPF | poi-ooxml |
1.1 下载
进入Apache下载页面,选择最新版下载,如下。选择The latest beta release is Apache POI 3.16-beta2会跳转到poi-bin-3.16-beta2-20170202.tar.gz,然后点击poi-bin-3.16-beta2-20170202.tar.gz,选择镜像后即可成功下载。
linux系统选择.tar.gz
windows系统选择.zip
1.2 解压
将下载后的压缩包解压,会得到以下文件。
文件(夹)名 | 作用 |
---|---|
docs | 文档(包括API文档和如何使用及版本信息) |
lib | doc功能实现依赖的包 |
ooxml-lib | docx功能实现依赖的包 |
LICENSE | |
NOTICE | |
poi-3.16-beta2.jar | The prerequisite poi-scratchpad-3.16-beta2.jar |
poi-examples-3.16-beta2.jar | 不明确 |
poi-excelant-3.16-beta2.jar | excel功能实现 |
poi-ooxml-3.16-beta2.jar | docx功能实现 |
poi-ooxml-schemas-3.16-beta2.jar | The prerequisite of poi-ooxml-3.16-beta2.jar |
poi-scratchpad-3.16-beta2.jar | doc功能实现 |
1.3 导入
不熟悉怎么导入的同学可以看看Android Studio导入jar包教程
1.3.1 doc
对于doc文件,需要将lib文件夹下jar包,poi-3.16-beta2.jar,poi-scratchpad-3.16-beta2.jar放入android项目libs目录下(lib文件夹下的junit-4.12.jar和log4j-1.2.17.jar不放我的项目也没出现异常,能少点是点)。
1.3.2 docx
对于docx,需要导入lib文件夹下jar包,poi-3.16-beta2.jar,poi-ooxml-3.16-beta2.jar,poi-ooxml-schemas-3.16-beta2.jar和ooxml-lib下的包,由于一直我这一直出现Warning:Ingoring InnerClasses attribute for an anonymous inner class的错误,同时由于doc基本满足我的需求以及导入这么多jar导致apk体积增大,就没有去实现。
有兴趣的同学可以研究研究。
二、实现doc文件的读写
Apache POI中的HWPF模块是专门用来读取和生成doc格式的文件。在HWPF中,我们使用HWPFDocument来表示一个word doc文档。在看代码之前,有必要了解HWPFDocument中的几个概念:
名称 | 含义 |
---|---|
Range | 表示一个范围,这个范围可以是整个文档,也可以是里面的某个小节(Section),也可以是段落(Paragraph),还可以是拥有功能属性的一段文本(CharacterRun) |
Section | word文档的一个小节,一个word文档可以由多个小节构成。 |
Paragraph | word文档的一个段落,一个小节可以由多个段落构成。 |
CharacterRun | 具有相同属性的一段文本,一个段落可以由多个CharacterRun组成。 |
Table | 一个表格。 |
TableRow | 表格对应的行 |
TableCell | 表格对应的单元格 |
注意 : Section、Paragraph、CharacterRun和Table都继承自Range。
读写前注意:Apache POI 提供的HWPFDocument类只能读写规范的.doc文件,也就是说假如你使用修改 后缀名 的方式生成doc文件或者直接以命名的方式创建,将会出现错误“Your file appears not to be a valid OLE2 document”
Invalid header signature; read 0x7267617266202E31, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document
2.1 DOC读
读doc文件有两种方式
(a)通过WordExtractor读文件
(b)通过HWPFDocument读文件
在日常应用中,我们从word文件里面读取信息的情况非常少见,更多的还是把内容写入到word文件中。使用POI从word doc文件读取数据时主要有两种方式:通过WordExtractor读和通过HWPFDocument读。在WordExtractor内部进行信息读取时还是通过HWPFDocument来获取的。
2.1.1 使用WordExtractor读
在使用WordExtractor读文件时我们只能读到文件的文本内容和基于文档的一些属性,至于文档内容的属性等是无法读到的。如果要读到文档内容的属性则需要使用HWPFDocument来读取了。下面是使用WordExtractor读取文件的一个示例:
//通过WordExtractor读文件
public class WordExtractorTest {
private final String PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "test.doc");
private static final String TAG = "WordExtractorTest";
private void log(Object o) {
Log.d(TAG, String.valueOf(o));
}
public void testReadByExtractor() throws Exception {
InputStream is = new FileInputStream(PATH);
WordExtractor extractor = new WordExtractor(is);
//输出word文档所有的文本
log(extractor.getText());
log(extractor.getTextFromPieces());
//输出页眉的内容
log("页眉:" + extractor.getHeaderText());
//输出页脚的内容
log("页脚:" + extractor.getFooterText());
//输出当前word文档的元数据信息,包括作者、文档的修改时间等。
log(extractor.getMetadataTextExtractor().getText());
//获取各个段落的文本
String paraTexts[] = extractor.getParagraphText()