В этой статье мы продолжим знакомство с java библиотекой Apache POI, а именно научимся создавать документы пакета MS Word в современном формате .docx
.
Кто не знаком с библиотекой Apache POI, почитайте эту статью (краткое описание и настройка библиотеки в Java проекте). С помощью этой библиотеки мы уже создавали Excel файл, редактировали его и просто считывали данные с xls-файла. Сегодня настало время потренироваться на документах Word.
Сегодня мы создадим новый docx файл с колонтитулами и каким-то содержимым. Давайте ознакомимся с небольшой теорией и далее перейдем к примеру создания такого файла.
Для работы с современным форматом документа MS Word, нам понадобится библиотека Apache POI версии 3.11 с артефактом poi-ooxml
. Обратите внимание, что шаблоны файлов пакета MS Office постоянно обновляются и дорабатываются, а сама Apache POI перерабатывается, поэтому работоспособность приведенного в статье кода в новых версиях не гарантируется.
Подключите следующую зависимость в свой maven проект:
1 2 3 4 5 |
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.11</version> </dependency> |
Создание документа Word (.docx) с помощью Apache POI. Теория
В описании мы указали, что будем создавать документ с колонтитулами, поэтому давайте ознакомимся со специальными классами, которые позволят это сделать.
Apache POI предоставляет классы XWPFHeaderFooterPolicy
и XWPFHeaderFooterPolicy
для работы с колонтитулами. В каждом из этих классов есть методы создания createHeader()
и createFooter()
. Для работы с содержимым документа есть специальные классы XWPFParagraph
and XWPFRun API
.
Ход создания docx документа будет следующий:
- Создаем объект
XWPFDocument
— для создания модели самого docx-документа. - Создаем экземпляр класса
XWPFHeaderFooterPolicy
для доступа к колонтитулам. Создаем экземпляры CTP
для верхнего и нижнего колонтитулов- Создаем классы-оболочки
XWPFParagraph
для каждого колонтитула и тела Word документа. - Устанавливаем полученные оболочки в модель
XWPFDocument
и сохраняем модель в файл с расширением docx.
Создание документа Word в формате docx с помощью Apache POI. Пример
А теперь реализуем наш алгоритм в коде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
package ua.com.prologistic; import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText; import java.io.FileOutputStream; public class WordWorker { public static void main(String[] args) { try { // создаем модель docx документа, // к которой будем прикручивать наполнение (колонтитулы, текст) XWPFDocument docxModel = new XWPFDocument(); CTSectPr ctSectPr = docxModel.getDocument().getBody().addNewSectPr(); // получаем экземпляр XWPFHeaderFooterPolicy для работы с колонтитулами XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(docxModel, ctSectPr); // создаем верхний колонтитул Word файла CTP ctpHeaderModel = createHeaderModel( "Верхний колонтитул - создано с помощью Apache POI на Java :)" ); // устанавливаем сформированный верхний // колонтитул в модель документа Word XWPFParagraph headerParagraph = new XWPFParagraph(ctpHeaderModel, docxModel); headerFooterPolicy.createHeader( XWPFHeaderFooterPolicy.DEFAULT, new XWPFParagraph[]{headerParagraph} ); // создаем нижний колонтитул docx файла CTP ctpFooterModel = createFooterModel("Просто нижний колонтитул"); // устанавливаем сформированый нижний // колонтитул в модель документа Word XWPFParagraph footerParagraph = new XWPFParagraph(ctpFooterModel, docxModel); headerFooterPolicy.createFooter( XWPFHeaderFooterPolicy.DEFAULT, new XWPFParagraph[]{footerParagraph} ); // создаем обычный параграф, который будет расположен слева, // будет синим курсивом со шрифтом 25 размера XWPFParagraph bodyParagraph = docxModel.createParagraph(); bodyParagraph.setAlignment(ParagraphAlignment.RIGHT); XWPFRun paragraphConfig = bodyParagraph.createRun(); paragraphConfig.setItalic(true); paragraphConfig.setFontSize(25); // HEX цвет без решетки # paragraphConfig.setColor("06357a"); paragraphConfig.setText( "Prologistic.com.ua - новые статьи по Java и Android каждую неделю. Подписывайтесь!" ); // сохраняем модель docx документа в файл FileOutputStream outputStream = new FileOutputStream("F:/Apache POI Word Test.docx"); docxModel.write(outputStream); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } System.out.println("Успешно записан в файл"); } private static CTP createFooterModel(String footerContent) { // создаем футер или нижний колонтитул CTP ctpFooterModel = CTP.Factory.newInstance(); CTR ctrFooterModel = ctpFooterModel.addNewR(); CTText cttFooter = ctrFooterModel.addNewT(); cttFooter.setStringValue(footerContent); return ctpFooterModel; } private static CTP createHeaderModel(String headerContent) { // создаем хедер или верхний колонтитул CTP ctpHeaderModel = CTP.Factory.newInstance(); CTR ctrHeaderModel = ctpHeaderModel.addNewR(); CTText cttHeader = ctrHeaderModel.addNewT(); cttHeader.setStringValue(headerContent); return ctpHeaderModel; } } |
Обратите внимание, что цвет текста задается в шестнадцатеричном представлении RGB, то есть HEX, но без знака #.
Запустим пример и посмотрим содержимое документа Apache POI Word Test.docx на диске F:
Нижний колонтитул есть, но просто не поместился в скрин.
Вот такой просто пример создания документа Word в формате docx с помощью библиотеки Apache POI. Подписывайтесь на обновления.
cttFooter.setStringValue(footerContent);
setStringValue горит красным, хоть java.lang.String импортнул.
Что делать?
Интересная статья, спасибо за труды.
Не подскажите, как в вордовском документе создать таблицу, объединить ячейки, сделать видимыми границы, перейти на новый лист в документе (на каждом листе вордовского документа создать свою таблицу)?
«Apache POI предоставляет классы XWPFHeaderFooterPolicy и XWPFHeaderFooterPolicy». Опечатка?