2017-05-23 86 views
1

我在DOCX中有一個變量,我想用值替換它。首先,該變量不是放在行的開頭,而是放在一些製表符之後。我的價值是一個郵政地址,我想用相同的縮進在不同的行中設置街道和郵政編碼(+城市)。街道替換變量在他的線,郵政編碼是在一個新行這樣的:DOCX4J插入換行符

      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並創建拉鍊一個新行。這條街是在這個好地方(左邊),但是這個城市在新線的開始。

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

所以我不知道如何將第二行設置爲第一的相同位置?

回答

1

有兩種方法可以做到這一點。

第一種方法是使用選項卡:

<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號碼:

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

的第二種方法是使用瓦特:IND/@瓦特:左:

<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來生成相應的代碼。