Лучший способ создания слова (docx) с помощью шаблона на основе Apache POI.
FreeMarker или Velocity генерирует новые HTML-страницы или файлы конфигурации на основе текстового шаблона и данных. poi-tl — это шаблонизатор Word, который генерирует новые документы на основе шаблона и данных Word .
Шаблон Word имеет богатые стили. Poi-tl прекрасно сохранит стили шаблона в создаваемых документах. Вы также можете установить стили для тегов. К заменяемому тексту будут применены стили тегов, поэтому вы сможете сосредоточиться на оформлении шаблона.
poi-tl — это шаблонизатор без логики . Нет сложной структуры управления и назначения переменных, только теги , некоторые теги можно заменить текстом, изображениями, таблицами и т. д., некоторые теги скрывают определенное содержимое документа, в то время как другие теги зацикливают серию содержимого документа.
«Мощные» конструкции, такие как присвоение переменных или условные операторы, позволяют легко изменять внешний вид приложения исключительно внутри системы шаблонов... однако за счет разделения сами шаблоны превращаются в часть логики приложения.
《Шаблон Google》
poi-tl поддерживает пользовательские функции (плагины) , функции могут выполняться в любом месте шаблона Word, делать что угодно в любом месте документа — цель poi-tl.
Особенность | Описание |
---|---|
✅ Текст | Отобразить тег как текст |
✅ Изображение | Отображение тега в виде изображения |
✅ Стол | Отобразить тег в виде таблицы |
✅ Нумерация | Отобразить тег как нумерацию |
✅ Диаграмма | Гистограмма (3D-линейчатая диаграмма), гистограмма (3D-гистограмма), диаграмма с областями (3D-диаграмма с областями), линейная диаграмма (3D-линейная диаграмма), радиолокационная диаграмма, круговая диаграмма (3D-круговая диаграмма) и другой рендеринг диаграмм |
✅ Если условие | Скрыть или отобразить определенное содержимое документа (включая текст, абзацы, изображения, таблицы, списки, диаграммы и т. д.) в соответствии с условиями. |
✅ Цикл по каждому элементу | Прокручивать определенное содержимое документа (включая текст, абзацы, изображения, таблицы, списки, диаграммы и т. д.) в соответствии с коллекцией. |
✅ Циклический ряд таблицы | Цикл для копирования строки визуализированной таблицы. |
✅ Столбец таблицы циклов | Циклическое копирование и визуализация столбца таблицы |
✅ Циклически упорядоченный список | Поддержка цикла упорядоченного списка и одновременная поддержка многоуровневого списка. |
✅ Выделить код | Подсветка блоков кода по словам, поддержка 26 языков и сотен стилей раскраски. |
✅ Уценка | Преобразование Markdown в текстовый документ |
✅ Прикрепление слов | Вставить вложение в Word |
✅ Словарные комментарии | Заполните комментарий поддержки, создайте комментарий, измените комментарий и т. д. |
✅ Слово СДТ | Полная поддержка тега структурированного документа |
✅ Текстовое поле | Поддержка тегов в текстовом поле |
✅ Замена изображения | Замените исходное изображение другим изображением |
✅ закладки, якоря, гиперссылки | Поддержка установки закладок, привязок и гиперссылок в документах. |
✅ Язык выражений | Полностью поддерживает выражения SpringEL и может расширять другие выражения: OGNL, MVEL... |
✅ Стиль | Шаблон — это стиль, и код также может задать стиль. |
✅ Вложение шаблонов | Шаблон содержит подшаблоны, а подшаблоны затем содержат подшаблоны. |
✅ Объединить | Слияние слов. Слияние, вы также можете объединить слова в указанной позиции. |
✅ пользовательские функции (плагины) | Плагин, выполнение функции в любом месте документа |
< dependency >
< groupId >com.deepoove</ groupId >
< artifactId >poi-tl</ artifactId >
< version >1.12.2</ version >
</ dependency >
ПРИМЕЧАНИЕ. Для poi-tl
1.12.x
требуется POI версии5.2.2+
.
Начните с невероятно простого примера: замените {{title}}
на «шаблонный движок poi-tl».
template.docx
, включая содержимое {{title}}
//The core API uses a minimalist design, only one line of code is required
XWPFTemplate . compile ( "template.docx" ). render ( new HashMap < String , Object >(){{
put ( "title" , "poi-tl template engine" );
}}). writeToFile ( "out_template.docx" );
Откройте документ out_template.docx
, все как пожелаете.
Тег состоит из двух фигурных скобок: {{title}}
— это тег, {{?title}}
— тоже тег, title
— это имя тега и ?
определяет тип тега. Далее давайте посмотрим, какие типы тегов существуют.
Текстовый тег — это самый простой тип тега в шаблоне Word. {{name}}
будет заменено значением name
ключа в модели данных. Если ключ не существует, тег будет очищен (программа может настроить, следует ли сохранить тег или выдать исключение).
К замененному тексту будет применен стиль текстового тега, как показано в следующем примере.
Код:
put ( "name" , "Mama" );
put ( "thing" , "chocolates" );
Шаблон:
{{name}} всегда говорил, что жизнь похожа на коробку с {{вещью}}.
Выход:
Мама всегда говорила, что жизнь похожа на коробку шоколадных конфет.
Тег изображения начинается с @
, например, {{@logo}}
будет искать значение с ключом logo
в модели данных, а затем заменять тег изображением. Данные, соответствующие тегу изображения, могут быть простым URL-адресом или строкой пути или структурой, содержащей ширину и высоту изображения.
Код:
put ( "watermelon" , "assets/watermelon.png" );
put ( "watermelon" , "http://x/lemon.png" );
put ( "lemon" , Pictures . ofLocal ( "sob.jpeg" , PictureType . JPEG ). size ( 24 , 24 ). create ());
Шаблон:
Fruit Logo:
watermelon {{@watermelon}}
lemon {{@lemon}}
banana {{@banana}}
Выход:
Fruit Logo:
watermelon ?
lemon ?
banana ?
Тег таблицы начинается с #
, например {{#table}}
, он будет отображаться как таблица Word с N строками и N столбцами. Значение N зависит от данных тега table
.
Код:
put ( "table" , Tables . of ( new String [][] {
new String [] { "Song name" , "Artist" }
}). border ( BorderStyle . DEFAULT ). create ());
Шаблон:
{{#table}}
Выход:
Название песни | Художник |
Тег списка соответствует списку символов или нумерованному списку Word, начинающемуся с *
, например {{*number}}
.
Код:
put ( "list" , Numberings . create ( "Plug-in grammar" ,
"Supports word text, pictures, table..." ,
"Template, not just template, but also style template" ));
Шаблон:
{{*list}}
Выход:
● Plug-in grammar
● Supports word text, pictures, table...
● Templates, not just templates, but also style templates
Раздел состоит из двух тегов до и после, начальный тег обозначается знаком ?
, а конечный тег обозначается /
, например, {{?section}}
— начальный тег блока разделов, {{/section} }
— конечный тег, а section
— имя этого раздела.
Разделы очень полезны при обработке ряда элементов документа. Элементы документа (текст, картинки, таблицы и т.п.), расположенные в разделе, могут отображаться ноль, один или N раз, в зависимости от значения раздела.
Если значение раздела равно null
, false
или является пустой коллекцией, все элементы документа, расположенные в разделе, отображаться не будут , аналогично условию оператора if false
.
Модель данных:
{
"announce" : false
}
Шаблон:
Made it,Ma!{{?announce}}Top of the world!{{/announce}}
Made it,Ma!
{{?announce}}
Top of the world!?
{{/announce}}
Выход:
Made it,Ma!
Made it,Ma!
Если значение раздела не null
, false
и не является коллекцией, все элементы документа в разделе будут отображены один раз , аналогично условию оператора if true
.
Модель данных:
{
"person" : { "name" : " Sayi " }
}
Шаблон:
{{?person}}
Hi {{name}}!
{{/person}}
Выход:
Hi Sayi!
Если значение раздела — непустая коллекция, элементы документа в разделе будут зациклены один или N раз , в зависимости от размера коллекции, аналогично синтаксису foreach.
Модель данных:
{
"songs" : [
{ "name" : " Memories " },
{ "name" : " Sugar " },
{ "name" : " Last Dance " }
]
}
Шаблон:
{{?songs}}
{{name}}
{{/songs}}
Выход:
Memories
Sugar
Last Dance
В цикле специальный тег {{=#this}}
может использоваться для прямой ссылки на объект текущей итерации.
Модель данных:
{
"produces" : [
" application/json " ,
" application/xml "
]
}
Шаблон:
{{?produces}}
{{=#this}}
{{/produces}}
Выход:
application/json
application/xml
Вложение — это слияние другого шаблона Word с шаблоном Word, которое можно понимать как импорт, включение или слияние документов Word, отмеченное знаком +
, например {{+nested}}
.
Код:
class AddrModel {
String addr ;
public AddrModel ( String addr ) {
this . addr = addr ;
}
}
List < AddrModel > subData = new ArrayList <>();
subData . add ( new AddrModel ( "Hangzhou,China" ));
subData . add ( new AddrModel ( "Shanghai,China" ));
put ( "nested" , Includes . ofLocal ( "sub.docx" ). setRenderModel ( subData ). create ());
Шаблон из двух слов:
основной.docx:
Hello, World
{{+nested}}
суб.docx:
Address: {{addr}}
Выход:
Hello, World
Address: Hangzhou,China
Address: Shanghai,China
中文文档
Дополнительные примеры и исходный код всех примеров см. в разделе Тестовые примеры JUnit.
Присоединиться к этому проекту можно разными способами, не ограничиваясь следующими:
См. Часто задаваемые вопросы.