Лучший способ создания документов Word (docx) с использованием шаблонов, основанный на Apache POI — Java API для Microsoft документов.
FreeMarker или Velocity генерируют новые HTML-страницы или конфигурационные файлы на основе текстовых шаблонов и данных. poi-tl — это движок шаблонов для Word, который создаёт новые документы на основе Word-шаблонов и данных.
Word-шаблон имеет богатые стили. Poi-tl идеально сохраняет стили из шаблона в создаваемых документах. Вы также можете задавать стили для тегов. Стили тегов применяются к заменённому тексту, поэтому вы можете сосредоточиться на дизайне шаблона.
poi-tl — это "безлогический" движок шаблонов. Здесь нет сложных конструкций управления и присваивания переменных, только теги, некоторые теги могут быть заменены текстом, изображениями, таблицами и т.д., некоторые теги скрывают определённые части документа, в то время как другие теги выполняют цикл по серии содержимого документа.> "Сильные" конструкции, такие как присваивание переменных или условные операторы, делают удобным изменение внешнего вида приложения внутри системы шаблонов, однако за счёт утраты разделения, шаблоны сами становятся частью логики приложения.
«Google CTemplate»poi-tl поддерживает пользовательские функции (плагины), которые могут выполняться в любом месте Word-шаблона и делать всё что угодно в любом месте документа — это цель poi-tl.## Содержание
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.11.0</version>
</dependency>
ВАЖНО: версия poi-tl
1.11.0
требует версии POI5.1.0
.
Начнем с простого примера: заменим {{title}}
на "poi-tl template engine".
template.docx
, содержащий текст {{title}}
// Основной API использует минималистичный подход, требуется всего одна строка кода
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}} всегда говорила, что жизнь похожа на коробку {{thing}}.
Выходной документ:
Mama всегда говорила, что жизнь похожа на коробку шоколадов.
Тег изображения начинается с @
, например, {{@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());
Шаблон:
Фруктовый логотип:
watermelon {{@watermelon}}
lemon {{@lemon}}
banana {{@banana}}
Выходной документ:
Фруктовый логотип:
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}}
Выход:
<table>
<tr><td>Название песни</td><td>Исполнитель</td></tr>
</table>
### Нумерованные списки
Тег списка соответствует списку символов или нумерованному списку в Word, начинающемуся с `*`, например, `{{*list}}`.
Код:
```java
put("list", Numberings.create("Плагин грамматики",
"Поддерживает текст слова, изображения, таблицы...",
"Шаблон, не просто шаблон, а также стиль шаблона"));
Шаблон:
{{*list}}
Выход:
● Плагин грамматики
● Поддерживает текст слова, изображения, таблицы...
● Шаблон, не просто шаблон, а также стиль шаблона
Раздел состоит из двух тегов перед и после, начальный тег определяется символом ?
, а конечный тег — символом /
, например, {{?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`.
Модель данных:
```json
{
"person": { "name": "Sayi" }
}
Шаблон:
{{?person}}
Привет {{name}}!
{{/person}}
Выход:
Привет Sayi!
Модель данных:
{
"песни": [
{ "название": "Memories" },
{ "название": "Sugar" },
{ "название": "Last Dance" }
]
}
Шаблон:
{{?песни}}
{{название}}
{{/песни}}
Выход:
Memories
Sugar
Last Dance
В цикле можно использовать специальный тег {{=#this}}
для прямого обращения к объекту текущей итерации.
Модель данных:
{
"производит": [
"application/json",
"application/xml"
]
}
Шаблон:
{{?производит}}
{{=#this}}
{{/производит}}
Выход:
application/json
application/xml
Вложенность — это объединение одного шаблона Word в другой шаблон Word, что можно понять как импорт, включение или объединение документов Word, отмеченное символом +
, например {{+вложенный}}
.
Код:
class AddrModel {
String addr;
public AddrModel(String addr) {
this.addr = addr;
}
}
List<AddrModel> подДанные = new ArrayList<>();
подДанные.add(new AddrModel("Hangzhou,China"));
подДанные.add(new AddrModel("Shanghai,China"));
put("вложенный", Includes.ofLocal("sub.docx").setRenderModel(подДанные).create());
```Два шаблона Word:
main.docx:
Привет, Мир {{+вложенный}}
sub.docx:
Адрес: {{адрес}}
Выход:
Привет, Мир Адрес: Hangzhou,China Адрес: Shanghai,China
## Документация и примеры
[Китайская документация](http://deepoove.com/poi-tl)
* [Основной пример](http://deepoove.com/poi-tl/#_Передоставление_документа)
* [Пример с таблицей](http://deepoove.com/poi-tl/#example-table)
* [Пример с разделами и графиками](http://deepoove.com/poi-tl/#example-animal)
* [Пример с текстовым полем](http://deepoove.com/poi-tl/#example-certificate)
* [Пример с комментариями](http://deepoove.com/poi-tl/#plugin-comment)
* [Пример: Создание резюме](http://deepoove.com/poi-tl/#example-resume)
* [Пример: Выделение кода](http://deepoove.com/poi-tl/#plugin-highlight)
* [Пример: Преобразование Markdown в Word](http://deepoove.com/poi-tl/#plugin-markdown)
* [Пример: Преобразование Swagger в Word](http://deepoove.com/poi-tl/#example-swagger)
Для получения дополнительных примеров и исходного кода всех примеров, см. JUnit тестовые случаи.


## Вклад
Вы можете присоединиться к этому проекту различными способами, не ограничиваясь следующими:
* Обратная связь по проблемам, с которыми вы столкнулись
* Поделиться радостью успеха
* Обновление и улучшение документации
* Решение и обсуждение проблем
## Часто задаваемые вопросы
См. [Часто задаваемые вопросы](http://deepoove.com/poi-tl/#_Популярные_вопросы)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )