Generate docx in java

Введение в Docx4J

В этой статье мы сосредоточимся на создании документа . docx с использованием библиотеки docx4j .

Docx4j — это библиотека Java, используемая для создания и управления файлами Office OpenXML — это означает, что она может работать только с типом файлов .docx , в то время как в старых версиях Microsoft Word используется расширение .doc (двоичные файлы).

  • Обратите внимание, что формат OpenXML поддерживается Microsoft Office, начиная с версии 2007 года. **

2. Maven Setup

Чтобы начать работать с docx4j, нам нужно добавить необходимую зависимость в наш pom.xml :

 org.docx4j docx4j 3.3.5  javax.xml.bind jaxb-api 2.1 

Обратите внимание, что мы всегда можем посмотреть последние версии зависимостей в https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.docx4j%22%20AND%20a%3A%22docx4j% 22[Центральное хранилище Maven].

Необходима зависимость JAXB , так как docx4j использует эту библиотеку под капотом, чтобы маршалировать/отменять маршализацию частей XML в файле docx .

3. Создать документ в формате Docx

3.1. Элементы текста и стиль

Давайте сначала посмотрим, как создать простой файл docx с текстовым абзацем:

WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage(); MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart(); mainDocumentPart.addStyledParagraphOfText("Title", "Hello World!"); mainDocumentPart.addParagraphOfText("Welcome To Baeldung"); File exportFile = new File("welcome.docx"); wordPackage.save(exportFile);

Вот итоговый файл welcome.docx :

Чтобы создать новый документ, мы должны использовать WordprocessingMLPackage , который представляет файл docx в формате OpenXML , в то время как класс MainDocumentPart содержит представление основной части document.xml .

Чтобы разобраться, давайте распакуем файл welcome.docx и откройте файл word/document.xml , чтобы увидеть, как выглядит представление XML:

     Hello World!    Welcome To Baeldung!   

Как мы видим, каждое предложение представлено серией ( r ) текста ( t ) внутри абзаца ( p ) , и именно для этого предназначен метод addParagraphOfText () .

AddStyledParagraphOfText () делает немного больше; он создает свойства абзаца ( pPr ), который содержит стиль для применения к абзацу.

Проще говоря, абзацы объявляют отдельные прогоны, и каждый прогон содержит несколько текстовых элементов:

Чтобы создать красивый документ, мы должны иметь полный контроль над этими элементами (параграф, запуск, и text) .

Итак, давайте узнаем, как стилизовать наш контент с помощью объекта runProperties ( RPr ):

ObjectFactory factory = Context.getWmlObjectFactory(); P p = factory.createP(); R r = factory.createR(); Text t = factory.createText(); t.setValue("Welcome To Baeldung"); r.getContent().add(t); p.getContent().add(r); RPr rpr = factory.createRPr(); BooleanDefaultTrue b = new BooleanDefaultTrue(); rpr.setB(b); rpr.setI(b); rpr.setCaps(b); Color green = factory.createColor(); green.setVal("green"); rpr.setColor(green); r.setRPr(rpr); mainDocumentPart.getContent().add(p); File exportFile = new File("welcome.docx"); wordPackage.save(exportFile);

Вот как выглядит результат:

После того, как мы создали абзац, прогон и текстовый элемент, используя createP () , createR () и createText () соответственно, мы объявили новый объект runProperties ( RPr ), чтобы добавить некоторые стили к текстовому элементу ,

Объект rpr используется для установки свойств форматирования: полужирный ( B ), выделенный курсивом ( I ) и прописной ( Caps ), эти свойства применяются к текстовому прогону с использованием метода setRPr () .

3.2. Работа с изображениями

Docx4j предлагает простой способ добавления изображений в наш документ Word:

File image = new File("image.jpg" ); byte[]fileContent = Files.readAllBytes(image.toPath()); BinaryPartAbstractImage imagePart = BinaryPartAbstractImage .createImagePart(wordPackage, fileContent); Inline inline = imagePart.createImageInline( "Baeldung Image (filename hint)", "Alt Text", 1, 2, false); P Imageparagraph = addImageToParagraph(inline); mainDocumentPart.getContent().add(Imageparagraph);

А вот как выглядит реализация метода addImageToParagraph () :

private static P addImageToParagraph(Inline inline)

Сначала мы создали файл, содержащий изображение, которое мы хотим добавить в нашу основную часть документа, затем мы связали байтовый массив, представляющий изображение, с объектом wordMLPackage .

После создания части изображения нам нужно создать объект Inline с помощью метода createImageInline ( ).

Метод addImageToParagraph () внедряет объект Inline в Drawing , чтобы его можно было добавить в run.

Наконец, как текстовый абзац, абзац, содержащий изображение, добавляется в mainDocumentPart .

3.3. Создание таблиц

Docx4j также позволяет довольно легко манипулировать таблицами (Tbl), строками (Tr) и столбцами (Tc).

Давайте посмотрим, как создать таблицу 3 × 3 и добавить к ней некоторый контент:

int writableWidthTwips = wordPackage.getDocumentModel() .getSections().get(0).getPageDimensions().getWritableWidthTwips(); int columnNumber = 3; Tbl tbl = TblFactory.createTable(3, 3, writableWidthTwips/columnNumber); List rows = tbl.getContent(); for (Object row : rows) < Tr tr = (Tr) row; Listcells = tr.getContent(); for(Object cell : cells) < Tc td = (Tc) cell; td.getContent().add(p); >>

Учитывая некоторые строки и столбцы, метод createTable () создает новый объект Tbl , третий аргумент относится к ширине столбца в твипах (что является измерением расстояния — 1/1440-й дюйма).

После создания мы можем перебирать содержимое объекта tbl и добавлять объекты Paragraph в каждую ячейку.

Давайте посмотрим, как выглядит окончательный результат:

4. Чтение документа в формате Docx

Теперь, когда мы узнали, как использовать docx4j для создания документов, давайте посмотрим, как читать существующий файл docx и печатать его содержимое:

File doc = new File("helloWorld.docx"); WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load(doc); MainDocumentPart mainDocumentPart = wordMLPackage .getMainDocumentPart(); String textNodesXPath = "//w:t"; List textNodes= mainDocumentPart .getJAXBNodesViaXPath(textNodesXPath, true); for (Object obj : textNodes)

В этом примере мы создали объект WordprocessingMLPackage на основе существующего файла helloWorld.docx , используя метод load () .

После этого мы использовали выражение XPath ( //w: t ), чтобы получить все текстовые узлы из основной части документа.

Метод getJAXBNodesViaXPath () возвращает список объектов JAXBElement .

В результате все текстовые элементы внутри объекта mainDocumentPart печатаются в консоли.

Обратите внимание, что мы всегда можем разархивировать наши файлы docx, чтобы лучше понять структуру XML, что помогает анализировать проблемы и дает лучшее представление о том, как их решать.

5. Заключение

В этой статье мы узнали, как docx4j облегчает выполнение сложных операций с документом MSWord, таких как создание абзацев, таблиц, частей документа и добавление изображений.

Фрагменты кода, как всегда, можно найти по адресу over на GitHub .

Источник

Читайте также:  Php fopen permissions denied
Оцените статью