docx4j,java和MS Word模板的示例代码

时间:2015-01-09 13:32:54

标签: java ms-word docx4j

我开始使用MS Word .dotx模板中的一些内容控件(使用“开发人员工具”菜单)。我想要做的是使用Java和docx4j库以编程方式添加一些文本。有谁知道我在哪里可以找到这个代码示例?

下面我添加了我想要使用的内容控件的XML表示。在这种情况下,我想替换文本" Klicken Sie hier,嗯Text einzugeben。"我自己的文字。

-<w:sdt>
-<w:sdtPr>
-<w:rPr>
<w:rStyle w:val="CAPITALS"/>
</w:rPr>
<w:alias w:val="Zeugnisart"/>
<w:tag w:val="Zeugnisart"/>
<w:id w:val="-1662376684"/>
-<w:placeholder>
<w:docPart w:val="DefaultPlaceholder_1082065158"/>
</w:placeholder>
<w:showingPlcHdr/>
<w:text/>
</w:sdtPr>
-<w:sdtEndPr>
-<w:rPr>
<w:rStyle w:val="Absatz-Standardschriftart"/>
<w:rFonts w:hAnsiTheme="minorHAnsi" w:asciiTheme="minorHAnsi"/>
<w:b w:val="0"/>
<w:bCs w:val="0"/>
<w:smallCaps w:val="0"/>
<w:spacing w:val="0"/>
<w:sz w:val="22"/>
</w:rPr>
</w:sdtEndPr>
<w:sdtContent>
<w:p w:rsidP="00D144D4" w:rsidRDefault="006D40B2" w:rsidR="00D144D4">
-<w:r w:rsidRPr="00372E7E">
-<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>

我尝试过代码但没有成功:

private void replacePlaceholder(WordprocessingMLPackage template, String name, String placeholder ) throws Exception{       

    MainDocumentPart documentPart = template.getMainDocumentPart();
    HashMap<String, String> mappings = new HashMap<String, String>();
    mappings.put("Zeugnisart", "a new value");
    documentPart.variableReplace(mappings);
}

private void writeDocxToStream(WordprocessingMLPackage template, String target) throws IOException, Docx4JException {
    File f = new File(target);
    template.save(f);
}

关于我出错的地方有任何提示吗?

2 个答案:

答案 0 :(得分:1)

根据您的澄清,您似乎只想要VariableReplace

如果您希望将其内容绑定到XML部分(通过XPath),请参阅ContentControlsMergeXML。当然,您需要先设置数据绑定(通过SdtPr中的w:dataBinding元素)。

答案 1 :(得分:1)

我已设法使用以下代码解决此问题:

private static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {

    List<Object> result = new ArrayList<Object>();
    if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue();

    if (obj.getClass().equals(toSearch))
        result.add(obj); 
    else if (obj instanceof ContentAccessor) {
        List<?> children = ((ContentAccessor) obj).getContent();
        for (Object child : children) {
            result.addAll(getAllElementFromObject(child, toSearch));
        }
    }
    return result; 
}


private void replaceTextValue(WordprocessingMLPackage template, String name, String placeholder ) throws Exception{     

    List<Object> texts = getAllElementFromObject(template.getMainDocumentPart(), SdtBlock.class);

    for (Object text : texts) {         

        SdtBlock textElement = (SdtBlock) text;
        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);

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

                }

        }           

    }
}
}

我调用replaceTextValue方法来改变&#34; Klicken Sie hier,um Text einzugeben中的文本。&#34;标签内的文字。可能有一种更有效的方法来做到这一点,但这是我发现的工作。