1. 概要

この記事では、docx4jライブラリを使用して。docxドキュメントを作成することに焦点を当てます。

Docx4jは、Office OpenXML ファイルの作成と操作に使用されるJavaライブラリです。つまり、 .docx ファイルタイプでのみ機能しますが、古いバージョンのMicrosoftWordはを使用します。 .doc 拡張子(バイナリファイル)。

OpenXML 形式は、2007バージョン以降のMicrosoftOfficeでサポートされていることに注意してください。

2. Mavenのセットアップ

docx4jの使用を開始するには、必要な依存関係をpom.xmlに追加する必要があります。

<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j</artifactId>
    <version>3.3.5</version>
</dependency>
<dependency> 
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.1</version>
</dependency>

Maven CentralRepositoryで常に最新の依存関係バージョンを検索できることに注意してください。

JAXB 依存関係が必要です。これは、docx4jが内部でこのライブラリを使用して、docxファイル内のXMLパーツをマーシャル/アンマーシャルするためです。

3. Docxファイルドキュメントを作成する

3.1. テキスト要素とスタイリング

まず、テキスト段落を含む単純なdocxファイルを作成する方法を見てみましょう。

WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage();
MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart();
mainDocumentPart.addStyledParagraphOfText("Title", "Hello World!");
mainDocumentPart.addParagraphOfText("Welcome To Baeldung");
File exportFile = new File("welcome.docx");
wordPackage.save(exportFile);

結果のwelcome.docxファイルは次のとおりです。

新しいドキュメントを作成するには、WordprocessingMLPackageを使用する必要があります。これはdocxファイルをOpenXML形式で表し、 MainDocumentPart ]クラスは、メインのdocument.xml部分の表現を保持します。

問題を解決するために、welcome.docx ファイルを解凍し、 word / document.xml ファイルを開いて、XML表現がどのように見えるかを確認しましょう。

<w:body>
    <w:p>
        <w:pPr>
            <w:pStyle w:val="Title"/>
        </w:pPr>
        <w:r>
            <w:t>Hello World!</w:t>
        </w:r>
    </w:p>
    <w:p>
        <w:r>
            <w:t>Welcome To Baeldung!</w:t>
        </w:r>
    </w:p>
</w:body>

ご覧のとおり、各文は、段落(p)内のテキスト(t)の実行(r)で表されます。これが、 addParagraphOfText()メソッドの目的です。

addStyledParagraphOfText()はそれより少し多くのことを行います。 段落に適用するスタイルを保持する段落プロパティ( pPr )を作成します。

簡単に言えば、段落は個別の実行を宣言し、各実行にはいくつかのテキスト要素が含まれています。

見栄えの良いドキュメントを作成するには、これらの要素(段落、実行、およびテキスト)を完全に制御する必要があります。

それでは、 runProperties RPr )オブジェクトを使用してコンテンツをスタイル化する方法を見つけましょう。

ObjectFactory factory = Context.getWmlObjectFactory();
P p = factory.createP();
R r = factory.createR();
Text t = factory.createText();
t.setValue("Welcome To Baeldung");
r.getContent().add(t);
p.getContent().add(r);
RPr rpr = factory.createRPr();       
BooleanDefaultTrue b = new BooleanDefaultTrue();
rpr.setB(b);
rpr.setI(b);
rpr.setCaps(b);
Color green = factory.createColor();
green.setVal("green");
rpr.setColor(green);
r.setRPr(rpr);
mainDocumentPart.getContent().add(p);
File exportFile = new File("welcome.docx");
wordPackage.save(exportFile);

結果は次のようになります。

createP() createR() createText()をそれぞれ使用して段落、実行、テキスト要素を作成した後、次のように宣言しました。新しいrunPropertiesオブジェクト( RPr )を使用して、テキスト要素にスタイルを追加します。

rpr オブジェクトは、書式設定プロパティ、太字( B )、斜体( I )、および大文字( Caps )、これらのプロパティは、 setRPr()メソッドを使用して実行されるテキストに適用されます。

3.2. 画像の操作

Docx4jは、Wordドキュメントに画像を追加する簡単な方法を提供します。

File image = new File("image.jpg" );
byte[] fileContent = Files.readAllBytes(image.toPath());
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage
  .createImagePart(wordPackage, fileContent);
Inline inline = imagePart.createImageInline(
  "Baeldung Image (filename hint)", "Alt Text", 1, 2, false);
P Imageparagraph = addImageToParagraph(inline);
mainDocumentPart.getContent().add(Imageparagraph);

そして、 addImageToParagraph()メソッドの実装は次のようになります。

private static P addImageToParagraph(Inline inline) {
    ObjectFactory factory = new ObjectFactory();
    P p = factory.createP();
    R r = factory.createR();
    p.getContent().add(r);
    Drawing drawing = factory.createDrawing();
    r.getContent().add(drawing);
    drawing.getAnchorOrInline().add(inline);
    return p;
}

まず、メインドキュメントパーツに追加する画像を含むファイルを作成し、次に画像を表すバイト配列をwordMLPackageオブジェクトにリンクしました。

画像部分を作成したら、 createImageInline()メソッドを使用してInlineオブジェクトを作成する必要があります。

addImageToParagraph()メソッドは、InlineオブジェクトをDrawingに埋め込んで、runに追加できるようにします。

最後に、テキスト段落のように、画像を含む段落がmainDocumentPartに追加されます。

そして、これが結果のドキュメントです:

3.3. テーブルの作成

Docx4jを使用すると、テーブル(Tbl)、行(Tr)、および列(Tc)を非常に簡単に操作することもできます。

3×3テーブルを作成してコンテンツを追加する方法を見てみましょう。

int writableWidthTwips = wordPackage.getDocumentModel()
  .getSections().get(0).getPageDimensions().getWritableWidthTwips();
int columnNumber = 3;
Tbl tbl = TblFactory.createTable(3, 3, writableWidthTwips/columnNumber);     
List<Object> rows = tbl.getContent();
for (Object row : rows) {
    Tr tr = (Tr) row;
    List<Object> cells = tr.getContent();
    for(Object cell : cells) {
        Tc td = (Tc) cell;
        td.getContent().add(p);
    }
}

いくつかの行と列が与えられると、 createTable()メソッドは新しい Tbl オブジェクトを作成し、3番目の引数はtwip単位の列幅を参照します(距離測定値–の1/1440)インチ)。

作成したら、 tbl オブジェクトのコンテンツを反復処理し、Paragraphオブジェクトを各セルに追加できます。

最終結果がどのようになるか見てみましょう。

4. Docxファイルドキュメントの読み取り

docx4jを使用してドキュメントを作成する方法を発見したので、既存のdocxファイルを読み取り、そのコンテンツを印刷する方法を見てみましょう。

File doc = new File("helloWorld.docx");
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
  .load(doc);
MainDocumentPart mainDocumentPart = wordMLPackage
  .getMainDocumentPart();
String textNodesXPath = "//w:t";
List<Object> textNodes= mainDocumentPart
  .getJAXBNodesViaXPath(textNodesXPath, true);
for (Object obj : textNodes) {
    Text text = (Text) ((JAXBElement) obj).getValue();
    String textValue = text.getValue();
    System.out.println(textValue);
}

この例では、 load()メソッドを使用して、既存のhelloWorld.docxファイルに基づいてWordprocessingMLPackageオブジェクトを作成しました。

その後、 XPath 式( // w:t )を使用して、メインドキュメント部分からすべてのテキストノードを取得しました。

getJAXBNodesViaXPath()メソッドは、JAXBElementオブジェクトのリストを返します。

その結果、mainDocumentPartオブジェクト内のすべてのテキスト要素がコンソールに出力されます。

いつでもdocxファイルを解凍して、XML構造をよりよく理解することができます。これは、問題の分析に役立ち、問題に取り組む方法についてのより良い洞察を提供します。

5. 結論

この記事では、docx4jを使用すると、段落、表、ドキュメントパーツの作成、画像の追加など、MSWordドキュメントで複雑な操作を簡単に実行できることを発見しました。

コードスニペットは、いつものように、GitHubにあります。