Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add merge field in word with docx4j?

Tags:

java

docx4j

I am able to add text and paragraphs to word and also replace any merge fields with text but I need to add a new merge field using docx4j to create a word template. How can I do this?

Do I use wordMLPackage.getMainDocumentPart().addTargetPart(targetpart); to add merge field. If so how?

Edit:

After uploading a sample word to http://webapp.docx4java.org/OnlineDemo/PartsList.html and object representing parts I probably need to add org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart object?

But I still don't understand how to add the Mergefield. I also generated the following xml to find any clue I could get:

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

From this I can see that the MergeField is in xml element w:fldSimple so I probably need to create this xml perhaps like this:

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

Any help would be great Thanks!

like image 697
Sujal Avatar asked Oct 01 '22 21:10

Sujal


1 Answers

Finally solved my own problem! Just adding here so than anyone else stuck in the same problem can find the answer.

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);
like image 192
Sujal Avatar answered Oct 05 '22 11:10

Sujal