DOCX4J 插入一个换行符
DOCX4J Insert a line break
我在 DOCX 中有一个变量,我想用一个值替换它。首先,该变量没有放在行首,而是放在一些制表符之后。我的值是一个邮政地址,我希望街道和邮政编码(+城市)在不同的行中具有相同的缩进。街道替换他行中的变量,邮政编码在新行中,如下所示:
4 Privet Drive
Little Whinging
这是变量的 XML:
<w:p>
<w:pPr>
<w:tabs>
<w:tab w:val="left" w:pos="6120"/>
</w:tabs>
<w:ind w:firstLine="6300"/>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:sz w:val="22"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:sz w:val="22"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>$address$</w:t>
</w:r>
</w:p>
我可以替换变量并将邮政编码和城市放在新行中(我使用 getJAXBNodesViaXPath()
检索我的变量)
r.clear(); //r contains the variable it's <w:r> </w:r> in my XML exemple, it's a list
org.docx4j.wml.Text text = factory.createText(); //For the street
r.add(k, text);
org.docx4j.wml.Br br = factory.createBr();
r.add(k, br);
org.docx4j.wml.Text text2 = factory.createText();
r.add(k, text2);
text.setValue(zip);
text2.setValue(street);
它将 varibale 替换为 street,并使用 zip 创建一个新行。街道在好地方(左边)但城市在新线的起点。
在新的 DOCX 中,我的 XML 看起来像这样:
<w:p>
<w:pPr>
<w:tabs>
<w:tab w:val="left" w:pos="6120"/>
</w:tabs>
<w:ind w:firstLine="6300"/>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:sz w:val="22"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:sz w:val="22"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>4 Privet Drive</w:t>
<:br/>
<w:t>Little Whinging</w:t>
</w:r>
</w:p>
所以我不知道如何将第二行设置到与第一行相同的位置?
有两种方法可以做到这一点。
首先是使用制表符:
<w:p>
<w:r>
<w:tab/>
<w:t>4 Privet Drive</w:t>
<w:br/>
<w:tab/>
<w:t>Little Whinging</w:t>
</w:r>
</w:p>
对应代码,假设P p:
// Create object for r
R r = wmlObjectFactory.createR();
p.getContent().add( r);
// Create object for tab (wrapped in JAXBElement)
R.Tab rtab = wmlObjectFactory.createRTab();
JAXBElement<org.docx4j.wml.R.Tab> rtabWrapped = wmlObjectFactory.createRTab(rtab);
r.getContent().add( rtabWrapped);
// Create object for t (wrapped in JAXBElement)
Text text = wmlObjectFactory.createText();
JAXBElement<org.docx4j.wml.Text> textWrapped = wmlObjectFactory.createRT(text);
r.getContent().add( textWrapped);
text.setValue( "4 Privet Drive");
// Create object for br
Br br = wmlObjectFactory.createBr();
r.getContent().add( br);
// Create object for tab (wrapped in JAXBElement)
R.Tab rtab2 = wmlObjectFactory.createRTab();
JAXBElement<org.docx4j.wml.R.Tab> rtabWrapped2 = wmlObjectFactory.createRTab(rtab2);
r.getContent().add( rtabWrapped2);
// Create object for t (wrapped in JAXBElement)
Text text2 = wmlObjectFactory.createText();
JAXBElement<org.docx4j.wml.Text> textWrapped2 = wmlObjectFactory.createRT(text2);
r3.getContent().add( textWrapped2);
text2.setValue( "Little Whinging");
第二种是使用w:ind/@w:left:
<w:p>
<w:pPr>
<w:ind w:left="720"/>
</w:pPr>
<w:r>
<w:t>4 Privet Drive</w:t>
<w:br/>
<w:t>Little Whinging</w:t>
</w:r>
</w:p>
为此,Java 的关键位是:
// Create object for ind
PPrBase.Ind pprbaseind = wmlObjectFactory.createPPrBaseInd();
ppr.setInd(pprbaseind);
pprbaseind.setLeft( BigInteger.valueOf( 720) );
一般来说,要自己回答此类问题,请创建在 Word 中看起来正确的内容,然后检查 XML。您可以使用 Docx4j Word Helper AddIn 或 Docx4j Webapp 来生成相应的代码。
我在 DOCX 中有一个变量,我想用一个值替换它。首先,该变量没有放在行首,而是放在一些制表符之后。我的值是一个邮政地址,我希望街道和邮政编码(+城市)在不同的行中具有相同的缩进。街道替换他行中的变量,邮政编码在新行中,如下所示:
4 Privet Drive
Little Whinging
这是变量的 XML:
<w:p>
<w:pPr>
<w:tabs>
<w:tab w:val="left" w:pos="6120"/>
</w:tabs>
<w:ind w:firstLine="6300"/>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:sz w:val="22"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:sz w:val="22"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>$address$</w:t>
</w:r>
</w:p>
我可以替换变量并将邮政编码和城市放在新行中(我使用 getJAXBNodesViaXPath()
检索我的变量)
r.clear(); //r contains the variable it's <w:r> </w:r> in my XML exemple, it's a list
org.docx4j.wml.Text text = factory.createText(); //For the street
r.add(k, text);
org.docx4j.wml.Br br = factory.createBr();
r.add(k, br);
org.docx4j.wml.Text text2 = factory.createText();
r.add(k, text2);
text.setValue(zip);
text2.setValue(street);
它将 varibale 替换为 street,并使用 zip 创建一个新行。街道在好地方(左边)但城市在新线的起点。
在新的 DOCX 中,我的 XML 看起来像这样:
<w:p>
<w:pPr>
<w:tabs>
<w:tab w:val="left" w:pos="6120"/>
</w:tabs>
<w:ind w:firstLine="6300"/>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:sz w:val="22"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
<w:b/>
<w:sz w:val="22"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>4 Privet Drive</w:t>
<:br/>
<w:t>Little Whinging</w:t>
</w:r>
</w:p>
所以我不知道如何将第二行设置到与第一行相同的位置?
有两种方法可以做到这一点。
首先是使用制表符:
<w:p>
<w:r>
<w:tab/>
<w:t>4 Privet Drive</w:t>
<w:br/>
<w:tab/>
<w:t>Little Whinging</w:t>
</w:r>
</w:p>
对应代码,假设P p:
// Create object for r
R r = wmlObjectFactory.createR();
p.getContent().add( r);
// Create object for tab (wrapped in JAXBElement)
R.Tab rtab = wmlObjectFactory.createRTab();
JAXBElement<org.docx4j.wml.R.Tab> rtabWrapped = wmlObjectFactory.createRTab(rtab);
r.getContent().add( rtabWrapped);
// Create object for t (wrapped in JAXBElement)
Text text = wmlObjectFactory.createText();
JAXBElement<org.docx4j.wml.Text> textWrapped = wmlObjectFactory.createRT(text);
r.getContent().add( textWrapped);
text.setValue( "4 Privet Drive");
// Create object for br
Br br = wmlObjectFactory.createBr();
r.getContent().add( br);
// Create object for tab (wrapped in JAXBElement)
R.Tab rtab2 = wmlObjectFactory.createRTab();
JAXBElement<org.docx4j.wml.R.Tab> rtabWrapped2 = wmlObjectFactory.createRTab(rtab2);
r.getContent().add( rtabWrapped2);
// Create object for t (wrapped in JAXBElement)
Text text2 = wmlObjectFactory.createText();
JAXBElement<org.docx4j.wml.Text> textWrapped2 = wmlObjectFactory.createRT(text2);
r3.getContent().add( textWrapped2);
text2.setValue( "Little Whinging");
第二种是使用w:ind/@w:left:
<w:p>
<w:pPr>
<w:ind w:left="720"/>
</w:pPr>
<w:r>
<w:t>4 Privet Drive</w:t>
<w:br/>
<w:t>Little Whinging</w:t>
</w:r>
</w:p>
为此,Java 的关键位是:
// Create object for ind
PPrBase.Ind pprbaseind = wmlObjectFactory.createPPrBaseInd();
ppr.setInd(pprbaseind);
pprbaseind.setLeft( BigInteger.valueOf( 720) );
一般来说,要自己回答此类问题,请创建在 Word 中看起来正确的内容,然后检查 XML。您可以使用 Docx4j Word Helper AddIn 或 Docx4j Webapp 来生成相应的代码。