1概要

この記事では、https://www.docx4java.org[docx4j]ライブラリを使用して.

docx

ドキュメントを作成することに焦点を当てます。

Docx4jは、Officeの

OpenXML

ファイルの作成と操作に使用されるJavaライブラリです。つまり、

.docx

ファイルタイプでしか機能できません。古いバージョンのMicrosoft Wordでは、

.doc

拡張子(バイナリファイル)を使用します。


  • OpenXML

    フォー​​マットは、2007バージョンからMicrosoft Officeでサポートされています。


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>

docx4jは、

docx

ファイル内のXML部分を整列/非整列化するために、このライブラリを内部で使用しているため、

JAXB

依存関係が必要です。


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

ファイルは次のとおりです。

リンク:/uploads/im1.png%20500w[]

新しいドキュメントを作成するには、

OpenXML

形式で

docx

ファイルを表す

WordprocessingMLPackage

を使用する必要があります。一方、

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

)を作成します。

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

リンク:/uploads/p-r-t.png[]

見栄えのする文書を作成するには、これらの要素を完全に制御する必要があります。(paragraph、run、

、および

text).__

それでは、runProperties


_REPr

_

)オブジェクトを使ってあなたのコンテンツを様式化する方法を発見しましょう:

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);

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

リンク:/uploads/im2a.png%20500w[]

それぞれ

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

に追加されます。

そして、結果の文書は次のとおりです。

リンク:/uploads/im3a.png%20500w[]


3.3. テーブルを作成する

Docx4jでは、Tables(Tbl)、rows(Tr)、およびcolumns(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番目の引数はツイップ単位の列幅を表します(これは1/1440分の1の距離です)。

作成したら、

tbl

オブジェクトの内容を繰り返し処理し、各セルに

Paragraph

オブジェクトを追加します。

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

リンク:/uploads/im4a.png%20500w[]


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

オブジェクト内のすべてのテキスト要素がコンソールに表示されます。

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


5結論

この記事では、docx4jによって、段落、表、ドキュメントパーツの作成、画像の追加など、MSWordドキュメントに対して複雑な操作を簡単に実行できる方法を説明しました。

コードスニペットは、いつもどおりhttps://github.com/eugenp/tutorials/tree/master/libraries[over GitHub]にあります。