Создайте таблицу с помощью docx4j

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

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? Сообщение об ошибке: «Файл не может быть открыт, так как его содержимое вызывает проблемы». Манипуляции с документом работают до тех пор, пока я не вставлю эту таблицу.


person user1335772    schedule 13.11.2013    source источник
comment
Как выглядит результирующий XML таблицы? Word не любит пустые ячейки таблицы; убедитесь, что каждая ячейка содержит w:p, который может быть пустым.   -  person JasonPlutext    schedule 14.11.2013


Ответы (2)


Вставка прогонов в абзацы приводит к нужному результату:

 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;
}
person user1335772    schedule 15.11.2013
comment
Это пример суперпользователя о том, как создать таблицу в слове. Спасибо! - person EdgeCaseBerg; 31.01.2018

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

Инструмент генерации кода доступен двумя способами:

Преимущество надстройки Word заключается в том, что вы избегаете цикла сохранения-загрузки.

person JasonPlutext    schedule 13.10.2015