使用Apache POI读取Word文件
开场白 shū
我认为使用Apache POI来读取Excel数据是常见的事情,但最近我不幸地需要读取Word数据,所以在这里留下备忘录。
根据M12i的说法,Apache POI能够通过Range > Section > Paragraph > CharacterRun的层级结构来获取Word文件中的数据。
所以,首先让我们来展示一下整体是以什么样的结构构成的。
源代码
...
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.poi:poi-scratchpad:3.11'
}
这是在读取2003格式的Word文件。
package com.example;
import java.util.stream.IntStream;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.CharacterRun;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Section;
public class Main {
public static void main(String[] args) throws Exception {
// クラスパス上に配置したWordファイルを読み込む。
HWPFDocument document =
new HWPFDocument(Main.class.getResourceAsStream("/sample.doc"));
// ドキュメント全体を読み込む。
Range text = document.getRange();
IntStream.range(0, text.numSections()).forEach(sNo -> {
Section section = text.getSection(sNo);
IntStream.range(0, section.numParagraphs()).forEach(pNo -> {
Paragraph paragraph = section.getParagraph(pNo);
IntStream.range(0, paragraph.numCharacterRuns()).forEach(cNo -> {
CharacterRun characterRun = paragraph.getCharacterRun(cNo);
System.out.printf("%d:%d:%d:%s", sNo, pNo, cNo, characterRun.text());
System.out.println();
});
});
});
}
}
虽然我不太熟悉使用Java 8,但通过这个方法,我能够将文本以CharacterRun的形式进行分解并显示出来。
很遗憾,其中混杂了神秘的字符,让情况变得有些艰难。