使用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的形式进行分解并显示出来。

word.PNG

很遗憾,其中混杂了神秘的字符,让情况变得有些艰难。

广告
将在 10 秒后关闭
bannerAds