2017-09-04 5 views
0

Ich habe eine Tabelle und ich muss mehrere Zeilen hinzufügen, anstatt die Variablen, die Sie im Bild sehen. Ich benutze docx4j. table ich ändern Variablen wie folgt aus:Wie man mehrere Zeilen zu einer Tabelle mit docx4j hinzufügt

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

Antwort

0

Dies funktioniert für mich - aber ich habe keine Spaltenüberschriften in meiner Word-Vorlage, also seien Sie vorsichtig, sie könnten diese Funktionalität zu brechen.
Füllen Sie einfach das HashMap richtig und es sollte aus der Box funktionieren, wenn Sie alles Setup Recht haben;)

Dies sind die drei Funktionen, die ich für den Ersatz verwenden:

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

Und etwa hier, wie zu verwenden, es für Ihr Beispiel:

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