Word テンプレートを使用して Word ドキュメントを作成するために docx4j を使用しています。テンプレートのコンテンツは、Java コードによってドキュメント内のどのテキストが入力されるかを制御します。問題は、一部のコントロールに追加した書式設定が効果がないことです。テキスト コンテンツ コントロールとリッチ テキスト コンテンツ コントロールの両方で書式設定を試みました。実際、ドキュメント全体が (ドキュメント ヘッダーの画像を含めて) 灰色で表示されるため、この問題が docx4j に固有のものであるかどうかはわかりません。これが私のコードです:
private void replaceTextValue(WordprocessingMLPackage template, String name, String placeholder ) throws Exception{
List<Object> texts = getAllSdtElementFromObject(template.getMainDocumentPart());
for (Object text : texts) {
SdtElement textElement = (SdtElement) text; // SdtElement is an Interface, not a Class
List<Object> cList = textElement.getSdtContent().getContent();
SdtPr pr = textElement.getSdtPr();
List<Object> al = pr.getRPrOrAliasOrLock();
for (Object alias : al) { // go through all SdtPr objects
if ( alias.getClass().toString().contains("org.docx4j.wml.Tag")) {
String CTagVal = ((org.docx4j.wml.Tag) alias).getVal();
if (CTagVal.equalsIgnoreCase(placeholder)) {
ClassFinder finder = new ClassFinder(Text.class);
new TraversalUtil(cList, finder);
// taken from the TraveseFind example
// https://github.com/plutext/docx4j/blob/master/src/samples/docx4j/org/docx4j/samples/TraverseFind.java
for (Object o : finder.results) {
Object o2 = XmlUtils.unwrap(o);
if (o2 instanceof org.docx4j.wml.Text) {
org.docx4j.wml.Text txt = (org.docx4j.wml.Text)o2;
txt.setValue(name);
} else {
System.out.println( XmlUtils.marshaltoString(o, true, true));
}
}
}
}
}
}
}
コンテンツ コントロールの XML は次のとおりです。
<w:sdt>
<w:sdtPr>
<w:alias w:val="Aufgabengebiet"/>
<w:id w:val="-996718060"/>
<w:placeholder>
<w:docPart w:val="DefaultPlaceholder_1082065158"/>
</w:placeholder>
<w:showingPlcHdr/>
<w:text/>
</w:sdtPr>
<w:sdtContent>
<w:p w:rsidRDefault="00A858B9" w:rsidR="00066661" w:rsidP="00A858B9">
<w:r w:rsidRPr="00FD7E66">
<w:rPr>
<w:rStyle w:val="Platzhaltertext"/>
</w:rPr>
<w:t>Klicken Sie hier, um Text einzugeben.</w:t>
</w:r>
</w:p>
</w:sdtContent>
</w:sdt>