Как создать стилизованную таблицу в документе docx с помощью docx4j? - PullRequest
0 голосов
/ 09 января 2020

Контекст

Мне необходимо создать совместимые с Microsoft Word файлы docx, содержащие некоторые таблицы, в веб-приложении, работающем в системе Linux. После некоторых исследований я обнаружил, что можно было подготовить пустой документ, содержащий все необходимые стили (для абзацев, символов и таблиц) в слове Microsoft, а затем заполнить его docx4j.

Это действительно хорошо работает для абзацев: Мне просто нужно извлечь стиль из его имени и извлечь атрибут pPr из стиля:

P p = factory.createP();                 // create an empty paragraph
String styleId = wpMLPackage.getMainDocumentPart().getStyleDefinitionsPart()
            .getIDForStyleName(styleName);    // find the styleID because the template has defined names
PPr ppr = wpMLPackage.getMainDocumentPart().getStyleDefinitionsPart().getStyleById(styleId)
            .getPPr();                        // extract the PPr from the style
p.setPPr(ppr);                                // and affect it to the paragraph
}
R r = factory.createR();                 // finally set the paragraph text
Text txt = factory.createText();
txt.setValue(text);
r.getContent().add(txt);
p.getContent().add(r);

Удобный метод wpMLPackage.getMainDocumentPart().addStyledParagraphOfText(styleId, text); работает так же, только требуется найти styleID

Проблема

Когда речь идет о стилях таблиц, их нельзя использовать, поскольку tbl.setTblPr(tblPr) ожидает объект TblPr, тогда как style.getTblPr возвращает CTTblPrBase, который не может быть приведен к TblPr, и я не смог найти способ извлечь TblPr из стиля таблицы.

Вопрос

Как можно создать таблицу из docx4j и повлиять на нее (стиль таблицы) уже присутствует в документе?

1 Ответ

0 голосов
/ 09 января 2020

На стили таблиц влияют совершенно иным образом.

Фактически мы не извлекаем свойство таблицы из стиля, а создаем другой объект, который является TblStyle.

Код так же просто, как:

    tbl = factory.createTbl();                   // create an empty table
    TblPr tblPr = factory.createTblPr();         // create a brand new TblPr
    TblStyle tblStyle = new TblStyle();          // create a brand new TblStyle
    String styleID = wpMLPackage.getMainDocumentPart().getStyleDefinitionsPart()
            .getIDForStyleName(styleName));      // find the style ID from the name
    tblStyle.setVal(styleID);                    // just tell tblStyle what style it shall be
    tblPr.setTblStyle(tblStyle);                 // and affect each object its property...
    this.tbl.setTblPr(tblPr);
    wpMLPackage.getMainDocumentPart().getContent().add(tbl);   // we can now add the styled table
...