Apache poi создание word

Обновлено: 05.07.2024

В этой статье показано, как Apache POI используется для чтения, анализа и записи документа Microsoft Word.

Автор оригинала: Nikita Masand.

В этой статье мы научимся читать и писать Microsoft Word с помощью библиотеки POI Apache .

  1. Apache POI – HWPF и XWPF
  2. Зависимости POI Apache
  3. Создайте документ word
  4. Работа с абзацами, шрифтами и страницей перерывы
  5. Верхний и нижний колонтитулы документа
  6. Добавить изображение
  7. Создайте таблицу
  8. Прочитайте и проанализируйте документ, абзац и таблицу
  9. Обновить документ

P.S Протестировано с Apache POI 4.1.2 и Java 8

1. Apache POI – HWPF и XWPF

Apache POI предоставляет API Java для работы с документами Microsoft. Мы рассмотрим варианты использования, включающие абзацы, шрифты, верхние и нижние колонтитулы, таблицы, изображения, запись, чтение, анализ и обновление документа. Прежде чем изучить варианты использования, давайте рассмотрим основные концепции, связанные с библиотекой POI Apache.

1.1 HWPF (ужасный формат текстового процессора) Эти API-интерфейсы предназначены для более старых форматов файлов Word 6 и Word 95, .doc документы.

1.2 XWPF (формат текстового процессора XML) Эти API предназначены для новых документов Word 2007, .docx .

Документ XWPFDocument Он предоставляет API-интерфейсы высокого уровня для создания / редактирования файлов .docx word
xwpfпараграф Он используется для работы с абзацами
XWPFRun Он определяет область текста с общим набором свойств. Он также используется для редактирования свойств шрифта
XWPFTable Он используется для описания содержимого компонента таблицы, присутствующего в файле word
XWPFTableRow Он определяет строки, присутствующие в компоненте таблицы
Xwpfвордэкстрактор Он используется для извлечения текста из файла word

P.S Эта статья будет посвящена последним XWPF API-интерфейсы, работа с .docx документы.

2. Зависимости POI Apache

Нам нужен только poi-ooxml для работы с Microsoft word.

3. Создайте документ word

В этом примере показано, как создать файл Microsoft Word .docx . Мы используем XWPFParagraph для создания абзацев и XWPFRun для создания текста.

4. Работа с абзацами, шрифтами и разрывы страниц

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

Мы создаем четыре абзаца и устанавливаем различные свойства шрифта, разрывы строк и разрывы страниц для каждого из них.

5. Верхний и нижний колонтитулы документа

В этом примере создается верхний и нижний колонтитулы документа для всех страниц.

6. Добавить изображение

В этом примере в документ добавляется изображение.

7. Создайте таблицу

В этом примере мы рассмотрим, как мы можем вставить таблицу в файл документа Word. Мы будем использовать компонент XWPFTable для создания и инициализации элемента таблицы.

В этом примере вставляется таблица, содержащая 3 строки и 3 столбца.

P.S Предупреждение для OpenOffice 4.1.7, API-интерфейсы таблиц неправильно отформатировали таблицу.

8. Прочитайте и проанализируйте документ, абзац и таблицу.

В этом примере будет показано, как мы можем использовать POI Apache для извлечения и считывания текста из документов.

8.1 Мы можем извлечь весь текст из документа с помощью XWPFWordExtractor . Файл simple.docx генерируется из примера 4. Работа с абзацами, шрифтами и разрывами страниц .

8.2 В этом примере мы используем doc.getparagraphs() для списка абзацев документа. Как только мы получим список, мы сможем повторить отдельные элементы абзаца и получить текст.

8.3 Файл table.docx генерируется из примера 7. Создайте таблицу . Нам нужно получить список всех элементов в файле, а затем выполнить итерацию по нему, чтобы проверить наличие компонента ТАБЛИЦА . Как только мы найдем компонент ТАБЛИЦА , мы можем выполнить итерацию по нему, чтобы извлечь строки таблицы, и, наконец, выполнить итерацию по строкам, чтобы извлечь значения таблицы.

9 . Обновить документ

В этом примере мы будем использовать предварительно заполненный файл шаблона template.docx . Файл шаблона содержит следующий текст Привет $, Поздравляю, вы учитесь чему-то новому! . И мы заменим строку $ предопределенным вводом и создадим новый файл output.docx с обновленным содержимым.

Дальнейшее чтение Для получения дополнительных примеров, пожалуйста, обратитесь к этому официальному Примеры Apache POI XWPF

Для языка Java (как, впрочем, и для любого другого языка программирования) всё еще не придумали более простого и действенного способа генерации документов docx, чем библиотека Apache POI. В конце нулевых появился сей высокоуровнеый API, позволящий говорить с формируемым документом не на языке разметки XML, а с помощью удобных полей и выводов.

Судя по моим Google-запросам на протяжении более чем года сообщество пользователей этой библиотеки продержалось года этак до 2012, в то время как новые версии библиотеки всё еще появляются на главной странице проекта. Не на все вопросы, касающиеся формирования самого примитивного документа, есть ответы в документации или stackoverflow, не говоря уже о текстах на русском языке. Постараемся компенсировать этот недостаток данных для тех, кому это может понадобиться.

Основные классы API

XWPFDocument — целостное представление Word документа. В нём не только содержится xml-код, интерпретируемый редакторами (Word, LibreOffice), но также содержатся и методы для определения метаданных отображения — набора стилей, сносок и т.п. В этой статье поговорим о первом, так как работа с метаданными не так явно задокументирована, к тому же многие редакторы успешно справляются с отображением документа и без подсказок.

Итак, предположим, у вас на руках есть (ненужный) файл docx. Преобразуем его в файл zip (осторожно, обратное преобразование путем переименования zip -> docx может сделать файл недоступным для вашего редактора(!)), в получившемся архиве откроем папку word, а в ней — файл document.xml. Перед нами xml-представление word-файла, которое также можно было бы получить через Apache POI, с меньшими трудностями.


Для того, чтобы поближе познакомиться с содержимым документа, придется вооружиться еще двумя классами API: XWPFParagraph и XWPFTable.

XWPFParagraph — как следует из названия, представляет собой параграф документа. Расположен он может быть как внутри XWPFDocument,


так и внутри таблицы (если точнее — внутри ячейки таблицы, вложенной в ряд таблицы, вложенного непосредственно в таблицу).


Параграф предоставляет изрядный набор информации для вёрстки и размещения текста. Официальная документация на этот счёт достаточно красноречива: отступы слева и справа, сверху и снизу, в том числе и между строками, добавление гиперссылок и границ для параграфа.

XWPFTable — класс, олицетворяющий таблицу. Также как и в XWPFParagraph, XWPFTable можно добавлять к самому документу и к ячейке таблицы (создавая, тем самым, таблицу внутри таблицы). Семантика в таком случае чуточку усложняется.


XWPFRun — набор данных о выводе текста внутри параграфа. Находится может только внутри параграфа, создается через вызов метода параграфа-родителя:


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

Как становится видно из обзора классов, перенос, скажем, css-стиля в документ будет связан с дополнительной сложностью: часть свойств необходимо будет применить к параграфу docx, часть — к объекту класса XWPFRun.

Итак, библиотека легла в External Libraries/jar лежит под рукой, пора творить.

Создадим документ, добавим таблицу 2х2 и параграф.


Заполним параграф, добавив ран для вывода текста. После перевода строки стилизация параграфа будет потеряна, и в Word новый параграф будет выведен без красной строки.


Теперь займёмся заполнением таблицы. Мы можем обращаться не только к уже созданным элементам, но и вызвать у сформированной таблицы метод для добавления рядов или колонок.


Опускаемся глубже, на уровень ряда таблицы. Именно в таком порядке предстаёт разбор таблицы в Apache POI — сначала ряды, потом клетки. Напрямую из таблицы можно получить лишь количество колонок в таблице:


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

Итак, можно легко уловить суть структуры документа в Word: вкладывай одно в другое и предоставляй доступ (в том числе и к созданию новых экземпляров). К сожалению, далеко не всегда есть возможность получить последний элемент во вложенной коллекции. Чаще всего приходится пользоваться такими вот ухищрениями:


Хорошо, с содержимым таблицы разобрались. Что если нам нужно явно уточнить ширину таблицы, а не оставлять её для волной интерпретации редактора?

Для некоторых на первый взгляд числовых значений, например, ширины таблицы, в Apache POI существуют целые классы.


С помощью типа укажем, какая именно ширина нам нужна: auto, pct или dxa. В первом случае таблицы займёт всю предоставленную ей ширину, во втором — процент от всей ширины, указанный позже методом setW. В нашем же случае вмешиватеся специальная единица измерения — dxa, равная 1/20 точки.

Классы, подобные CTTblWidth, используются повсеместно: для определения ширины страницы (PgSize), ширины ячейки и др.

Единцы измерения в Apache POI

В хорошем документе всё выверенно и расчерчено идеально, вплоть до самого пикселя. Возможно, в теории можно сделать всё средствами Apache POI и без углубления в тему единиц измерения, но лучше уделить им внимание сразу, чтобы избежать недопониманий в духе «почему это схлопнулось» и «когда переместил картинку в word на один сантиметр».

О поддержке сантиметров и остальной метрической системы тут остается только мечтать. Это резонно (каждый шрифт уникален, у каждого редактора своя специфика), но дико неудобно. Придется прибегнуть ко множеству конвертаций, если вы хотите задавать отступы (ведь именно в сантиметрах мы привыкли видеть их в word) в сантиметрах. Итак, указав тип измерения dxa для некоторой ширины, как описно в параграфе выше, мы получаем в распоряжение некоторое точное значение, но абсолютно не представляем как им воспользоваться. Для перевода в сантиметры на stackoverflow есть формула. Для всего остального существует класс Units. В нем определены как методы для перевода единиц измерения, так и сами соотношения между значениями.

Запись готового документа

Для записи в конечный файл есть удобный метод XWPFDocument — write. На вход принимается поток, в который пойдёт запись.


Если готовый документ нужно куда-то передать можно подать в качестве аргумента не File-, а ByteArrayOutputStream.

Информация об элементе отображения в формате xml

Имея документ, отображающийся корректно в определенном редакторе, полезно было бы узнать как именно представлен необходимый параграф или другой элемент. Для этого определенны специальные методы, возвращающие объекты классов пакета org.openxmlformats.schemas.wordprocessingml.x2006.main. Из названия (wordprocessingml) видно, что данный набор классов используется только для работы с документами word. Например, для xlsx документов есть пакет spreadsheetml, некоторые классы которого очень и очень похожи на классы wordprocessingml, поэтому конвертация между форматами достаточно затруднена.


Так, пустой параграф будет иметь скромное представление


Пустая таблица покажет больше интересного.


Что здесь интересного? Свойства tblPr — всевозможные свойства таблицы. Внутри уже описанная ширина таблицы (установлена 0, но свойство «auto» все равно выведет таблицу в приемлимой, автоматической ширине). Также tblBorders — набор информации о границах таблицы. Далее идёт явно выраженное представление внутренностей таблицы. tr — ряд таблицы, внутри вложенны tc. Внутри tc оказался бы набор вложенный параграфов, если бы мы добавили хотя бы один.
Попробуем пополнить параграф информацией и посмотреть что из этого получится.


Здесь ситуация ровно такая же: объект с мета-информацией (в него добавлена информация об отступе красной строки, который мы вложили в коде), а так же само содержимое: там размещается список «ранов». В первый и единственный мы добавили текст и информацию о шрифте. Эта информация также разделилась внутри «рана» — информация о шрифте попала в rPr, сам текст — в элемент t.

Часто для создания справочных документов в формате файла Microsoft Word требуется программное приложение. Иногда даже ожидается, что приложение получит файлы Word в качестве входных данных.

Любой Java-программист, который хочет создавать файлы MS-Office в качестве выходных данных, должен использовать для этого предопределенный API только для чтения.

Что такое Apache POI?

Компоненты Apache POI

Этот учебник проведет вас через процесс работы с файлами MS-Word с использованием Java. Поэтому обсуждение ограничивается компонентами HWPF и XWPF.

Примечание. Старые версии двоичных файлов формата поддержки POI, такие как DOC, XLS, PPT, ETC. ВЕРСИЯ 3.5 ​​ВПЕРЕД, POI ПОДДЕРЖИВАЕТ ФОРМАТЫ OOXML-ФАЙЛОВ MS-OFFICE ТАКИМИ КАК DOCX, XLSX, PPTX, ETC.

В этой главе рассказывается о настройке Apache POI в системах на базе Windows и Linux. Apache POI можно легко установить и интегрировать в текущую среду Java, выполнив несколько простых шагов без каких-либо сложных процедур настройки. Администрация пользователя требуется при установке.

Системные Требования

JDK Java SE 2 JDK 1.5 или выше
объем памяти 1 ГБ ОЗУ (рекомендуется)
Дисковое пространство Нет минимальных требований
Версия операционной системы Windows XP или выше, Linux

Давайте теперь перейдем к этапам установки Apache POI.

Шаг 1. Проверьте вашу установку Java

Прежде всего, вам необходимо установить Java Software Development Kit (SDK) в вашей системе. Чтобы убедиться в этом, выполните любую из двух команд, упомянутых ниже, в зависимости от платформы, на которой вы работаете.

Если установка Java была выполнена правильно, то на ней отобразится текущая версия и спецификация вашей установки Java. Пример вывода приведен в следующей таблице:

\> Java-версия

Среда выполнения Java (TM) SE (сборка 1.7.0_60-b19)

64-разрядная серверная виртуальная машина Java Hotspot (TM) (сборка 24.60-b09, смешанный режим)

$ java – версия

Открытая среда выполнения JDK (rhel-2.3.10.4.el6_4-x86_64)

Откройте виртуальную машину 64-разрядного сервера JDK (сборка 23.7-b01, смешанный режим)

\> Java-версия

Среда выполнения Java (TM) SE (сборка 1.7.0_60-b19)

64-разрядная серверная виртуальная машина Java Hotspot (TM) (сборка 24.60-b09, смешанный режим)

$ java – версия

Открытая среда выполнения JDK (rhel-2.3.10.4.el6_4-x86_64)

Откройте виртуальную машину 64-разрядного сервера JDK (сборка 23.7-b01, смешанный режим)

Шаг 2. Установите среду Java

Установите переменную среды JAVA_HOME, чтобы она указывала на местоположение базовой директории, где установлена ​​Java на вашем компьютере. Например,

Платформа Описание
Windows Установите JAVA_HOME в C: \ ProgramFiles \ java \ jdk1.7.0_60
Linux Экспорт JAVA_HOME = / usr / local / java-current

Добавьте полный путь расположения компилятора Java к системному пути.

Платформа Описание
Windows Добавьте строку «C: \ Program Files \ Java \ jdk1.7.0_60 \ bin» в конец системной переменной PATH.
Linux Экспорт PATH = $ PATH: $ JAVA_HOME / bin /

Шаг 3: Установите Apache POI Library

На следующих рисунках показаны каталоги и файловая структура внутри загруженной папки:

Jar Hierarchy1

Jar Hierarchy2

Добавьте полный путь к пяти банкам, как показано на изображении выше, к CLASSPATH.

«C: \ пои-3,9 \ пои-3.9-20121203.jar;»

«C: \ пои-3,9 \ пои-OOXML-3.9-20121203.jar;»

«C: \ пои-3,9 \ пои-OOXML-схемы-3.9-20121203.jar;»

«C: \ пои-3,9 \ OOXML Пб \ dom4j-1.6.1.jar;»

«C:. \ Пои-3,9 \ OOXML Пб \ XMLBeans-2.3.0.jar;»;

Экспортировать CLASSPATH = $ CLASSPATH:

«C: \ пои-3,9 \ пои-3.9-20121203.jar;»

«C: \ пои-3,9 \ пои-OOXML-3.9-20121203.jar;»

«C: \ пои-3,9 \ пои-OOXML-схемы-3.9-20121203.jar;»

«C: \ пои-3,9 \ OOXML Пб \ dom4j-1.6.1.jar;»

«C:. \ Пои-3,9 \ OOXML Пб \ XMLBeans-2.3.0.jar;»;

Экспортировать CLASSPATH = $ CLASSPATH:

В этой главе рассказывается о классах и методах Apache POI для управления документом Word.

Документ

Это маркерный интерфейс (интерфейс не содержит никаких методов), который уведомляет о том, что реализованный класс может создавать текстовый документ.

XWPFDocument

Методы класса

Сохраняет и сохраняет документ.

createParagraph ()

Добавляет новый абзац к этому документу.

CreateTable ()

Создает пустую таблицу с одной строкой и одним столбцом по умолчанию.

Создает оглавление для документа Word.

getParagraphs ()

Возвращает параграф (ы), который содержит текст верхнего или нижнего колонтитула.

Возвращает используемый объект стилей.

Сохраняет и сохраняет документ.

createParagraph ()

Добавляет новый абзац к этому документу.

CreateTable ()

Создает пустую таблицу с одной строкой и одним столбцом по умолчанию.

Создает оглавление для документа Word.

getParagraphs ()

Возвращает параграф (ы), который содержит текст верхнего или нижнего колонтитула.

В этой главе рассказывается о классах и методах Apache POI для управления документом Word.

Документ

Это маркерный интерфейс (интерфейс не содержит никаких методов), который уведомляет о том, что реализованный класс может создавать текстовый документ.

XWPFDocument

Методы класса

Сохраняет и сохраняет документ.

createParagraph ()

Добавляет новый абзац к этому документу.

CreateTable ()

Создает пустую таблицу с одной строкой и одним столбцом по умолчанию.

Создает оглавление для документа Word.

getParagraphs ()

Возвращает параграф (ы), который содержит текст верхнего или нижнего колонтитула.

Возвращает используемый объект стилей.

Сохраняет и сохраняет документ.

createParagraph ()

Добавляет новый абзац к этому документу.

CreateTable ()

Создает пустую таблицу с одной строкой и одним столбцом по умолчанию.

Создает оглавление для документа Word.

getParagraphs ()

Возвращает параграф (ы), который содержит текст верхнего или нижнего колонтитула.

Возвращает используемый объект стилей.

XWPFParagraph

Методы класса

Добавляет новый прогон к этому абзацу.

getAlignment ()

Возвращает выравнивание абзаца, которое должно применяться к тексту в этом абзаце.

setAlignment (ParagraphAlignment align)

Определяет выравнивание абзаца, которое должно применяться к тексту в этом абзаце.

setBorderBottom (Граница границы)

Определяет границу, которая должна отображаться под набором абзацев, которые имеют одинаковый набор настроек границ абзаца.

setBorderLeft (Граница границы)

Определяет границу, которая должна отображаться в левой части страницы вокруг указанного абзаца.

setBorderRight (Граница границы)

Определяет границу, которая должна отображаться в правой части страницы вокруг указанного абзаца.

setBorderTop (Граница границы)

Определяет границу, которая должна отображаться над набором абзацев с одинаковым набором настроек границ абзаца.

Добавляет новый прогон к этому абзацу.

getAlignment ()

Возвращает выравнивание абзаца, которое должно применяться к тексту в этом абзаце.

setAlignment (ParagraphAlignment align)

Определяет выравнивание абзаца, которое должно применяться к тексту в этом абзаце.

setBorderBottom (Граница границы)

Определяет границу, которая должна отображаться под набором абзацев, которые имеют одинаковый набор настроек границ абзаца.

setBorderLeft (Граница границы)

XWPFRun

Методы класса

Указывает, что перерыв должен быть размещен в текущем местоположении в содержимом прогона.

Указывает, что вкладка должна быть размещена в текущем местоположении в содержимом прогона.

setColor (java.lang.String rgbStr)

Устанавливает цвет текста.

setFontSize (int size)

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

setText (значение java.lang.String)

Устанавливает текст этого текстового прогона.

setBold (логическое значение)

Указывает, должно ли свойство bold применяться ко всем не сложным символам сценария в содержимом этого прогона при отображении в документе.

Указывает, что перерыв должен быть размещен в текущем местоположении в содержимом прогона.

Указывает, что вкладка должна быть размещена в текущем местоположении в содержимом прогона.

setColor (java.lang.String rgbStr)

Устанавливает цвет текста.

setFontSize (int size)

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

setText (значение java.lang.String)

Устанавливает текст этого текстового прогона.

setBold (логическое значение)

Указывает, должно ли свойство bold применяться ко всем не сложным символам сценария в содержимом этого прогона при отображении в документе.

XWPFStyle

Методы класса

getNextStyleID ()

Он используется для получения StyleID следующего стиля.

getStyleId ()

Используется для получения StyleID стиля.

Используется для получения стилей.

setStyleId (java.lang.String styleId)

Используется для установки styleID.

getNextStyleID ()

Он используется для получения StyleID следующего стиля.

getStyleId ()

Используется для получения StyleID стиля.

Используется для получения стилей.

setStyleId (java.lang.String styleId)

Используется для установки styleID.

XWPFTable

Методы класса

Добавляет новый столбец для каждой строки в этой таблице.

addRow (строка XWPFTableRow, int pos)

Добавляет новую строку в таблицу в позиции поз.

Создает новый объект XWPFTableRow с количеством ячеек, равным количеству столбцов, определенных в данный момент.

setWidth (int width)

Устанавливает ширину столбца.

Добавляет новый столбец для каждой строки в этой таблице.

addRow (строка XWPFTableRow, int pos)

Добавляет новую строку в таблицу в позиции поз.

Создает новый объект XWPFTableRow с количеством ячеек, равным количеству столбцов, определенных в данный момент.

setWidth (int width)

Устанавливает ширину столбца.

Остальные методы этого класса см. В полном документе API по адресу: Документация по POI API.

XWPFWordExtractor

Это класс в пакете org.apache.poi.xwpf.extractor . Это базовый класс синтаксического анализатора, используемый для извлечения простого текста из документа Word.

Методы класса

Извлекает весь текст из документа.

Извлекает весь текст из документа.

Остальные методы этого класса см. В полном документе API по адресу: Документация по POI API.

Читайте также: