2013-11-13 1 views
2

Я пытаюсь создать новую таблицу в зависимости от входных данных и вставить ее в документ docx. После приводит к поврежденным выходного файла:Создать таблицу с docx4j

private Tbl getSampleTable(WordprocessingMLPackage wPMLpackage) { 

     ObjectFactory factory = Context.getWmlObjectFactory(); 
     int writableWidthTwips = wPMLpackage.getDocumentModel().getSections().get(0).getPageDimensions().getWritableWidthTwips(); 
     List<Map<String, String>> data = getSampleTableData(); 
     TableDefinition tableDef = getSampleTableDef(); 
     int cols = tableDef.getColumns().size(); 
     int cellWidthTwips = new Double(Math.floor((writableWidthTwips/cols))).intValue(); 

     Tbl table = TblFactory.createTable((data.size() + 1), cols, cellWidthTwips); 

     Tr headerRow = (Tr) table.getContent().get(0); 

     int f = 0; 
     for (Column column : tableDef.getColumns()) { 
      Tc column = (Tc) headerRow.getContent().get(f); 
      f++; 
      Text text = factory.createText(); 
      text.setValue(column.getName()); 
      R run = factory.createR(); 
      run.getContent().add(text); 
      column.getContent().add(run); 
      headerRow.getContent().add(column); 
     } 
     int i = 1; 

     for (Map<String, String> entry : data) { 
      Tr row = (Tr) table.getContent().get(i); 
      i++; 
      int p = 0; 
      for (String key : entry.keySet()) { 
       Tc column = (Tc) row.getContent().get(p); 
       p++; 
       Text tx = factory.createText(); 
       R run = factory.createR(); 
       tx.setValue(entry.get(key)); 
       run.getContent().add(tx); 
       column.getContent().add(run); 
       row.getContent().add(column); 
      } 
     } 
     return table; 
    } 

без вставки таблицы, DOCX-документ создается, как оно должно быть.

Я использую эту функцию, пытаясь вставить эту таблицу в файл, который я получаю в качестве входного параметра:

ByteArrayInputStream bis = new ByteArrayInputStream(file); 
    WordprocessingMLPackage wPMLpackage = null; 
    wPMLpackage = WordprocessingMLPackage.load(bis); 

    // Zip it up 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    SaveToZipFile saver = new SaveToZipFile(wPMLpackage); 
    saver.save(baos); 
    byte[] template = baos.toByteArray(); 

    WordprocessingMLPackage target = WordprocessingMLPackage.load(new ByteArrayInputStream(template)); 
    target.getMainDocumentPart().getContent().clear(); 

    target.getMainDocumentPart().addObject(getSampleTable(target)); 
    ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); 
    SaveToZipFile saver2 = new SaveToZipFile(target); 
    saver2.save(baos2); 
    return baos2.toByteArray(); 

Кто-то имеет представление о том, почему сгенерированный файл не может быть истолковано Microsoft Word? Сообщение об ошибке «Файл не может быть открыт, поскольку его содержимое вызывает проблемы». Манипуляция документа работает до тех пор, пока я не вставляю эту таблицу.

+2

Как выглядит итоговый XML-стол? Word не любит пустые ячейки таблицы; убедитесь, что каждая ячейка содержит w: p, которая может быть пустой. – JasonPlutext

ответ

4

Установка прогонов в пунктах приводит к желаемому результату:

private Tbl getSampleTable(WordprocessingMLPackage wPMLpackage) { 

    ObjectFactory factory = Context.getWmlObjectFactory(); 
    int writableWidthTwips = wPMLpackage.getDocumentModel().getSections() 
             .get(0).getPageDimensions() 
             .getWritableWidthTwips(); 
    List<Map<String, String>> data = getSampleTableData(); 
    TableDefinition tableDef = getSampleTableDef(); 
    int cols = tableDef.getColumns().size(); 
    int cellWidthTwips = new Double(
      Math.floor((writableWidthTwips/cols)) 
     ).intValue(); 

    Tbl table = TblFactory.createTable((data.size() + 1), cols, cellWidthTwips); 

    Tr headerRow = (Tr) table.getContent().get(0); 

    int f = 0; 
    for (Column column : tableDef.getColumns()) { 
     Tc column = (Tc) headerRow.getContent().get(f); 
     P columnPara = (P) column.getContent().get(0); 
     f++; 
     Text text = factory.createText(); 
     text.setValue(column.getName()); 
     R run = factory.createR(); 
     run.getContent().add(text); 
     columnPara.getContent().add(run); 
    } 
    int i = 1; 

    for (Map<String, String> entry : data) { 
     Tr row = (Tr) table.getContent().get(i); 
     i++; 
     int d = 0; 
     for (String key : entry.keySet()) { 
      Tc column = (Tc) row.getContent().get(d); 
      P columnPara = (P) column.getContent().get(0); 
      d++; 
      Text tx = factory.createText(); 
      R run = factory.createR(); 
      tx.setValue(entry.get(key)); 
      run.getContent().add(tx); 
      columnPara.getContent().add(run); 
     } 
    } 
    return table; 
} 
+0

Это пример суперпользователя для создания таблицы в слове. Благодаря! – EdgeCaseBerg

0

При создании таблицы (или что-нибудь еще в этом отношении), один подход, стоит иметь в виду, чтобы создать то, что вы хотите в Word, затем используйте один из инструментов кода кода docx4j для генерации соответствующего кода Java.

Код поколение инструмента доступен 2 способа:

Преимущества Слова надстройки в том, что вы избежать save-upload.