当前位置: 首页 > 知识库问答 >
问题:

如何用Docx4j在word中添加合并域?

秦阳旭
2023-03-14

我可以添加文本和段落到word中,也可以用文本替换任何合并字段,但我需要添加一个新的合并字段使用docx4j来创建一个word模板。我怎么能这么做?

是否使用wordmlpackage.getmainDocumentPart().addTargetPart(targetpart);添加合并字段。如果是,怎么做?

<w:document xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:ns21="urn:schemas-microsoft-com:office:powerpoint" xmlns:ns23="http://schemas.microsoft.com/office/2006/coverPageProps" xmlns:dsp="http://schemas.microsoft.com/office/drawing/2008/diagram" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:odx="http://opendope.org/xpaths" xmlns:odgm="http://opendope.org/SmartArt/DataHierarchy" xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram" xmlns:ns17="urn:schemas-microsoft-com:office:excel" xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:odi="http://opendope.org/components" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ns32="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:ns30="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns:ns12="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" xmlns:ns31="http://schemas.openxmlformats.org/drawingml/2006/compatibility" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:odq="http://opendope.org/questions" xmlns:ns8="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:odc="http://opendope.org/conditions" xmlns:oda="http://opendope.org/answers">
    <w:body>
        <w:p w:rsidR="00F66879" w:rsidP="00E80FA3" w:rsidRDefault="003B0B3A">
            <w:r>
                <w:t>Dear</w:t>
            </w:r>
            <w:r w:rsidR="00E80FA3">
                <w:t xml:space="preserve"> </w:t>
            </w:r>
            <w:fldSimple w:instr=" MERGEFIELD  lastName  \* MERGEFORMAT ">
                <w:r w:rsidR="005C0283">
                    <w:rPr>
                        <w:noProof/>
                    </w:rPr>
                    <w:t>«lastName»</w:t>
                </w:r>
            </w:fldSimple>
            <w:r w:rsidR="00E80FA3">
                <w:t>,</w:t>
            </w:r>
        </w:p>
        <w:p w:rsidR="00532EBF" w:rsidP="00E80FA3" w:rsidRDefault="00532EBF">
            <w:r>
                <w:t>On the Insert tab, the galleries include items that are designed to coordinate with the overall look of your document. You can use these galleries to insert tables, headers, footers, lists, cover pages, and other document building blocks. When you create pictures, charts, or diagrams, they also coordinate with your current document look.</w:t>
            </w:r>
        </w:p>
        <w:p w:rsidR="00532EBF" w:rsidP="00E80FA3" w:rsidRDefault="00532EBF">
            <w:r>
                <w:t>You can easily change the formatting of selected text in the document text by choosing a look for the selected text from the Quick Styles gallery on the Home tab. You can also format text directly by using the other controls on the Home tab. Most controls offer a choice of using the look from the current theme or using a format that you specify directly.
</w:t>
            </w:r>
        </w:p>
        <w:p w:rsidR="001E4C13" w:rsidP="00E80FA3" w:rsidRDefault="001E4C13">
            <w:r>
                <w:t>Thank you</w:t>
            </w:r>
        </w:p>
        <w:p w:rsidR="001E4C13" w:rsidP="00E80FA3" w:rsidRDefault="001E00E0">
            <w:r>
                <w:t>Sincerely,</w:t>
            </w:r>
        </w:p>
        <w:p w:rsidRPr="00F66879" w:rsidR="001E00E0" w:rsidP="00E80FA3" w:rsidRDefault="00C3747B">
            <w:fldSimple w:instr=" MERGEFIELD  sender  \* MERGEFORMAT ">
                <w:r w:rsidR="001E00E0">
                    <w:rPr>
                        <w:noProof/>
                    </w:rPr>
                    <w:t>«sender»</w:t>
                </w:r>
            </w:fldSimple>
        </w:p>
        <w:p w:rsidR="00E80FA3" w:rsidRDefault="00E80FA3"/>
        <w:sectPr w:rsidR="00E80FA3" w:rsidSect="00961253">
            <w:pgSz w:w="12240" w:h="15840"/>
            <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/>
            <w:cols w:space="720"/>
            <w:docGrid w:linePitch="360"/>
        </w:sectPr>
    </w:body>
</w:document>

从这里我可以看到MergeField在xml元素w:fldsimple中,所以我可能需要像这样创建这个xml:

   CTSimpleField ctSimple = factory.createCTSimpleField();
        ctSimple.setInstr(" MERGEFIELD lastname \\* MERGEFORMAT");

        RPr RPr = factory.createRPr();
        RPr.setNoProof(new BooleanDefaultTrue());

        Text t = factory.createText();
        t.setValue("fieldValue");

        R run = factory.createR();
        run.getContent().add(RPr);
        run.getContent().add(t);   

        JAXBElement<CTSimpleField> fldSimple = factory
                .createPFldSimple(ctSimple);

任何帮助都是非常感谢的!

共有1个答案

鲁龙野
2023-03-14

终于解决了自己的问题!只是在这里加上,这样比其他任何一个陷入同样问题的人都能找到答案。

ObjectFactory factory = Context.getWmlObjectFactory();


    CTSimpleField ctSimple = factory.createCTSimpleField();
    ctSimple.setInstr(" MergeField fieldValue \\* MERGEFORMAT ");

    RPr RPr = factory.createRPr();
    RPr.setNoProof(new BooleanDefaultTrue());

    Text t = factory.createText();
    t.setValue("fieldValue");

    R run = factory.createR();
    run.getRunContent().add(RPr);
    run.getRunContent().add(t);

    ctSimple.getParagraphContent().add(run);

    JAXBElement<CTSimpleField> fldSimple = factory
            .createPFldSimple(ctSimple);

    // P
    P para = factory.createP();
    para.getParagraphContent().add(fldSimple);


    Body body = factory.createBody();
    body.getEGBlockLevelElts().add(para);
    wordMLPackage.getMainDocumentPart().addObject(body);
 类似资料: