Uma maneira melhor de gerar word(docx) com template, baseado no Apache POI。
FreeMarker ou Velocity gera novas páginas HTML ou arquivos de configuração baseados em modelos de texto e dados. poi-tl é um mecanismo de modelo do Word que gera novos documentos com base em modelos e dados do Word.
O modelo do Word possui estilos ricos. Poi-tl manterá perfeitamente os estilos do modelo nos documentos gerados. Você também pode definir estilos para as tags. Os estilos das tags serão aplicados ao texto substituído, para que você possa se concentrar no design do modelo.
poi-tl é um mecanismo de modelo "sem lógica" . Não há estrutura de controle complicada e atribuição de variáveis, apenas tags , algumas tags podem ser substituídas por texto, imagens, tabelas, etc., algumas tags ocultarão algum conteúdo do documento, enquanto outras tags farão um loop em uma série de conteúdo do documento.
Construções "poderosas", como atribuição de variáveis ou instruções condicionais, facilitam a modificação exclusiva da aparência de um aplicativo dentro do sistema de modelos... no entanto, ao custo da separação, transformando os próprios modelos em parte da lógica do aplicativo.
《Google CTemplate》
poi-tl suporta funções personalizadas (plug-ins) , funções podem ser executadas em qualquer lugar no modelo do Word, fazer qualquer coisa em qualquer lugar do documento é o objetivo do poi-tl.
Recurso | Descrição |
---|---|
✅ Texto | Renderize a tag como texto |
✅ Foto | Renderize a tag como uma imagem |
✅ Mesa | Renderize a tag como uma tabela |
✅ Numeração | Renderize a tag como uma numeração |
✅ Gráfico | Gráfico de barras (gráfico de barras 3D), gráfico de colunas (gráfico de colunas 3D), gráfico de área (gráfico de área 3D), gráfico de linhas (gráfico de linhas 3D), gráfico de radar, gráfico de pizza (figura de pizza 3D) e outras renderizações de gráficos |
✅ Se condição | Ocultar ou exibir determinado conteúdo do documento (incluindo texto, parágrafos, imagens, tabelas, listas, gráficos, etc.) de acordo com as condições |
✅ Loop Foreach | Percorrer determinado conteúdo do documento (incluindo texto, parágrafos, imagens, tabelas, listas, gráficos, etc.) de acordo com a coleção |
✅ Linha da tabela de loop | Loop para copiar uma linha da tabela renderizada |
✅ Coluna da tabela de loop | Copiar e renderizar uma coluna da tabela |
✅ Lista ordenada de loop | Apoie o loop da lista ordenada e apoie a lista de vários níveis ao mesmo tempo |
✅ Código de destaque | Destaque de palavras de blocos de código, suportando 26 idiomas e centenas de estilos de cores |
✅ Remarcação | Converter Markdown em um documento do Word |
✅ Anexo de palavra | Inserir anexo no Word |
✅ Comentários de palavras | Concluir comentário de suporte, criar comentário, modificar comentário, etc. |
✅ Palavra SDT | Tag de documento estruturado de suporte completo |
✅ Caixa de texto | Suporte de tags na caixa de texto |
✅ Substituição de imagem | Substitua a imagem original por outra imagem |
✅ marcadores, âncoras, hiperlinks | Suporte à configuração de marcadores, âncoras e hiperlinks em documentos |
✅ Linguagem de Expressão | Suporta totalmente expressões SpringEL e pode estender mais expressões: OGNL, MVEL... |
✅ Estilo | O modelo é o estilo e o código também pode definir o estilo |
✅ Aninhamento de modelo | O modelo contém submodelos e os submodelos contêm submodelos |
✅ Mesclar | Mesclagem de palavras Mesclar, você também pode mesclar na posição especificada |
✅ funções personalizadas (plug-ins) | Design de plug-in, execute funções em qualquer lugar do documento |
< dependency >
< groupId >com.deepoove</ groupId >
< artifactId >poi-tl</ artifactId >
< version >1.12.2</ version >
</ dependency >
NOTA: poi-tl
1.12.x
requer POI versão5.2.2+
.
Comece com um exemplo extremamente simples: substitua {{title}}
por "poi-tl template engine".
template.docx
, incluindo o conteúdo {{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" );
Abra o documento out_template.docx
, tudo está como você deseja.
A tag consiste em duas chaves, {{title}}
é uma tag, {{?title}}
também é uma tag, title
é o nome da tag e ?
identifica o tipo de tag. A seguir, vamos ver quais tipos de tags existem.
A tag de texto é o tipo de tag mais básico no modelo do Word. {{name}}
será substituído pelo valor do name
da chave no modelo de dados. Se a chave não existir, a tag será limpa (o programa pode configurar se deseja manter a tag ou lançar uma exceção).
O estilo da tag de texto será aplicado ao texto substituído, conforme mostrado no exemplo a seguir.
Código:
put ( "name" , "Mama" );
put ( "thing" , "chocolates" );
Modelo:
{{name}} sempre disse que a vida era como uma caixa de {{thing}}.
Saída:
Mamãe sempre disse que a vida era como uma caixa de chocolates.
A tag da imagem começa com @
, por exemplo, {{@logo}}
irá procurar o valor com a chave do logo
no modelo de dados e então substituir a tag pela imagem. Os dados correspondentes à tag da imagem podem ser um simples URL ou string de caminho, ou uma estrutura contendo a largura e a altura da imagem.
Código:
put ( "watermelon" , "assets/watermelon.png" );
put ( "watermelon" , "http://x/lemon.png" );
put ( "lemon" , Pictures . ofLocal ( "sob.jpeg" , PictureType . JPEG ). size ( 24 , 24 ). create ());
Modelo:
Fruit Logo:
watermelon {{@watermelon}}
lemon {{@lemon}}
banana {{@banana}}
Saída:
Fruit Logo:
watermelon ?
lemon ?
banana ?
A tag da tabela começa com #
, como {{#table}}
, e será renderizada como uma tabela do Word com N linhas e N colunas. O valor de N depende dos dados da tag table
.
Código:
put ( "table" , Tables . of ( new String [][] {
new String [] { "Song name" , "Artist" }
}). border ( BorderStyle . DEFAULT ). create ());
Modelo:
{{#table}}
Saída:
Nome da música | Artista |
A tag list corresponde à lista de símbolos ou lista numerada do Word, começando com *
, como {{*number}}
.
Código:
put ( "list" , Numberings . create ( "Plug-in grammar" ,
"Supports word text, pictures, table..." ,
"Template, not just template, but also style template" ));
Modelo:
{{*list}}
Saída:
● Plug-in grammar
● Supports word text, pictures, table...
● Templates, not just templates, but also style templates
Uma seção é composta por duas tags antes e depois, a tag inicial é identificada por ?
, e a tag final é identificada por /
, como {{?section}}
como a tag inicial do bloco de seções, {{/section} }
é a tag final e section
é o nome desta seção.
As seções são muito úteis ao processar uma série de elementos de documentos. Os elementos do documento (texto, imagens, tabelas, etc.) localizados em uma seção podem ser renderizados zero, uma ou N vezes, dependendo do valor da seção.
Se o valor da seção for null
, false
ou uma coleção vazia, todos os elementos do documento localizados na seção não serão exibidos , semelhante à condição da instrução if é false
.
Modelo de dados:
{
"announce" : false
}
Modelo:
Made it,Ma!{{?announce}}Top of the world!{{/announce}}
Made it,Ma!
{{?announce}}
Top of the world!?
{{/announce}}
Saída:
Made it,Ma!
Made it,Ma!
Se o valor da seção não for null
, false
e não for uma coleção, todos os elementos do documento na seção serão renderizados uma vez , semelhante à condição da instrução if for true
.
Modelo de dados:
{
"person" : { "name" : " Sayi " }
}
Modelo:
{{?person}}
Hi {{name}}!
{{/person}}
Saída:
Hi Sayi!
Se o valor da seção for uma coleção não vazia, os elementos do documento na seção serão repetidos uma vez ou N vezes , dependendo do tamanho da coleção, semelhante à sintaxe foreach.
Modelo de dados:
{
"songs" : [
{ "name" : " Memories " },
{ "name" : " Sugar " },
{ "name" : " Last Dance " }
]
}
Modelo:
{{?songs}}
{{name}}
{{/songs}}
Saída:
Memories
Sugar
Last Dance
No loop, uma tag especial {{=#this}}
pode ser usada para se referir diretamente ao objeto da iteração atual.
Modelo de dados:
{
"produces" : [
" application/json " ,
" application/xml "
]
}
Modelo:
{{?produces}}
{{=#this}}
{{/produces}}
Saída:
application/json
application/xml
Aninhamento é a fusão de outro modelo do Word em um modelo do Word, que pode ser entendido como importação, inclusão ou mesclagem de documento do Word, marcada com +
, como {{+nested}}
.
Código:
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 ());
Modelo de duas palavras:
principal.docx:
Hello, World
{{+nested}}
sub.docx:
Address: {{addr}}
Saída:
Hello, World
Address: Hangzhou,China
Address: Shanghai,China
中文文档
Para obter mais exemplos e o código-fonte de todos os exemplos, consulte Casos de teste JUnit.
Você pode participar deste projeto de várias maneiras, não se limitando às seguintes:
Consulte Perguntas frequentes.