2017-09-04 16 views
0

私はテーブルを持っているので、画像に表示される変数の代わりに複数の行を追加する必要があります。私はdocx4jを使用しています。 table は、私はこのような変数を変更します。docx4jでテーブルに複数の行を追加するには

HashMap mappings = new HashMap(); 
VariablePrepare.prepare(template); 
mappings.put("example", "example"); 
template.getMainDocumentPart().variableReplace(mappings); 

答えて

0

VariableReplaceは、データを繰り返すためのものではありません。

代わりにOpenDoPEコンテンツコントロールのデータバインディングを使用することができます。リピートコンテンツコントロールをテーブル行の周りにラップします。

https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/model/datastorage/migration/FromVariableReplacement.javaは、VariableReplaceからOpenDoPEへの移行に役立つ場合があります。

0

これは私にとっては効果的ですが、単語テンプレートに列見出しがないため、この機能が壊れる可能性があります。
だけ正しくHashMapを記入し、あなたはすべての設定権を持っている場合、それは箱から出して動作するはずです。これらは私が交換のために使用する3つの機能です)

private void replaceTable(String[] placeholders, List<Map<String, String>> textToAdd, WordprocessingMLPackage template) throws Docx4JException, JAXBException { 
    List<Object> tables = doc.getAllElementFromObject(template.getMainDocumentPart(), Tbl.class); 
    Tbl tempTable = getTemplateTable(tables, placeholders[0]); 
    List<Object> rows = doc.getAllElementFromObject(tempTable, Tr.class); 
    if (rows.size() == 1) { //careful only tables with 1 row are considered here 
     Tr templateRow = (Tr) rows.get(0); 
     for (Map<String, String> replacements : textToAdd) { 
      addRowToTable(tempTable, templateRow, replacements); 
     } 
     assert tempTable != null; 
     tempTable.getContent().remove(templateRow); 
    } 
} 

private void addRowToTable(Tbl reviewTable, Tr templateRow, Map<String, String> replacements) { 
    Tr workingRow = (Tr) XmlUtils.deepCopy(templateRow); 
    List<?> textElements = doc.getAllElementFromObject(workingRow, Text.class); 
    for (Object object : textElements) { 
     Text text = (Text) object; 
     String replacementValue = (String) replacements.get(text.getValue()); 
     if (replacementValue != null) 
      text.setValue(replacementValue); 
    } 
    reviewTable.getContent().add(workingRow); 
} 

private Tbl getTemplateTable(List<Object> tables, String templateKey) throws Docx4JException, JAXBException { 
    for (Object tbl : tables) { 
     List<?> textElements = doc.getAllElementFromObject(tbl, Text.class); 
     for (Object text : textElements) { 
      Text textElement = (Text) text; 
      if (textElement.getValue() != null && textElement.getValue().equals(templateKey)) 
       return (Tbl) tbl; 
     } 
    } 
    return null; 
} 

そしてここでは、使用方法を大まかですあなたの例:

ArrayList<Map<String, String>> list = new ArrayList<>(); 
//Create a loop here through all entries 
Map<String, String> entry = new HashMap<>(); 
entry.put("${nrCrt}", "1"); 
list.add(entry); 
//... 
entry.put("${tva}", "55"); 
list.add(entry); 
entry.put("${nrCrt}", "2"); 
list.add(entry); 
//... 

replaceTable(new String[]{"${nrCrt}"}, list, template); 
関連する問題