Una mejor manera de generar palabras (docx) con plantilla, basada en Apache POI.
FreeMarker o Velocity generan nuevas páginas html o archivos de configuración basados en plantillas de texto y datos. poi-tl es un motor de plantillas de Word que genera nuevos documentos basados en plantillas y datos de Word.
La plantilla de Word tiene estilos ricos. Poi-tl conservará perfectamente los estilos de la plantilla en los documentos generados. También puede establecer estilos para las etiquetas. Los estilos de las etiquetas se aplicarán al texto reemplazado, para que puedas concentrarte en el diseño de la plantilla.
poi-tl es un motor de plantillas "sin lógica" . No existe una estructura de control complicada ni una asignación de variables, solo etiquetas . Algunas etiquetas se pueden reemplazar con texto, imágenes, tablas, etc., algunas etiquetas ocultarán cierto contenido del documento, mientras que otras etiquetas repetirán una serie de contenidos del documento.
Las construcciones "poderosas" como la asignación de variables o las declaraciones condicionales facilitan la modificación del aspecto de una aplicación dentro del sistema de plantillas exclusivamente... sin embargo, a costa de la separación, convierten las plantillas mismas en parte de la lógica de la aplicación.
《Plantilla C de Google》
poi-tl admite funciones personalizadas (complementos) , las funciones se pueden ejecutar en cualquier lugar de la plantilla de Word, hacer cualquier cosa en cualquier parte del documento es el objetivo de poi-tl.
Característica | Descripción |
---|---|
✅ Texto | Representar la etiqueta como texto |
✅ Imagen | Representar la etiqueta como una imagen |
✅ Mesa | Representar la etiqueta como una tabla |
✅ Numeración | Representar la etiqueta como una numeración |
✅ Gráfico | Gráfico de barras (gráfico de barras 3D), gráfico de columnas (gráfico de columnas 3D), gráfico de áreas (gráfico de áreas 3D), gráfico de líneas (gráfico de líneas 3D), gráfico de radar, gráfico circular (figura circular 3D) y otras representaciones de gráficos. |
✅ Si Condición | Ocultar o mostrar cierto contenido del documento (incluido texto, párrafos, imágenes, tablas, listas, gráficos, etc.) según las condiciones. |
✅ Bucle para cada uno | Recorra cierto contenido del documento (incluido texto, párrafos, imágenes, tablas, listas, gráficos, etc.) según la colección. |
✅ Fila de tabla de bucle | Bucle para copiar una fila de la tabla renderizada |
✅ Columna de tabla de bucle | Copia en bucle y renderiza una columna de la tabla. |
✅ Lista ordenada en bucle | Admite el bucle de lista ordenada y admite lista de varios niveles al mismo tiempo |
✅ Resaltar código | Resaltado de palabras de bloques de código, compatible con 26 idiomas y cientos de estilos de coloración |
✅ Rebaja | Convertir Markdown en un documento de Word |
✅ Adjunto de palabras | Insertar archivo adjunto en Word |
✅ Comentarios de palabras | Completar comentarios de soporte, crear comentarios, modificar comentarios, etc. |
✅ Palabra SDT | Etiqueta de documento estructurado de soporte completo |
✅ Cuadro de texto | Soporte de etiquetas en el cuadro de texto |
✅ Reemplazo de imagen | Reemplazar la imagen original con otra imagen. |
✅ marcadores, anclajes, hipervínculos | Admite la configuración de marcadores, anclajes e hipervínculos en documentos |
✅ Lenguaje de Expresión | Es totalmente compatible con expresiones SpringEL y puede ampliar más expresiones: OGNL, MVEL... |
✅ Estilo | La plantilla es el estilo y el código también puede establecer el estilo. |
✅ Anidamiento de plantillas | La plantilla contiene subplantillas y las subplantillas contienen subplantillas. |
✅ Fusionar | Fusionar palabras Fusionar, también puede fusionar en la posición especificada |
✅ funciones personalizadas (complementos) | Diseño de complemento, ejecute la función en cualquier parte del documento |
< dependency >
< groupId >com.deepoove</ groupId >
< artifactId >poi-tl</ artifactId >
< version >1.12.2</ version >
</ dependency >
NOTA: poi-tl
1.12.x
requiere POI versión5.2.2+
.
Comience con un ejemplo increíblemente simple: reemplace {{title}}
con "motor de plantillas poi-tl".
template.docx
, incluido el contenido {{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 el documento out_template.docx
, todo está como desea.
La etiqueta consta de dos llaves, {{title}}
es una etiqueta, {{?title}}
también es una etiqueta, title
es el nombre de la etiqueta y ?
Identifica el tipo de etiqueta. A continuación, veamos qué tipos de etiquetas existen.
La etiqueta de texto es el tipo de etiqueta más básico en la plantilla de Word. {{name}}
será reemplazado por el valor del name
de clave en el modelo de datos. Si la clave no existe, la etiqueta se borrará (el programa puede configurar si desea conservar la etiqueta o generar una excepción).
El estilo de la etiqueta de texto se aplicará al texto reemplazado, como se muestra en el siguiente ejemplo.
Código:
put ( "name" , "Mama" );
put ( "thing" , "chocolates" );
Plantilla:
{{name}} siempre dijo que la vida era como una caja de {{thing}}.
Producción:
Mamá siempre decía que la vida era como una caja de bombones.
La etiqueta de imagen comienza con @
, por ejemplo, {{@logo}}
buscará el valor con la clave del logo
en el modelo de datos y luego reemplazará la etiqueta con la imagen. Los datos correspondientes a la etiqueta de la imagen pueden ser una URL simple o una cadena de ruta, o una estructura que contenga el ancho y el alto de la imagen.
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 ());
Plantilla:
Fruit Logo:
watermelon {{@watermelon}}
lemon {{@lemon}}
banana {{@banana}}
Producción:
Fruit Logo:
watermelon ?
lemon ?
banana ?
La etiqueta de la tabla comienza con #
, como {{#table}}
, se representará como una tabla de Word con N filas y N columnas. El valor de N depende de los datos de la etiqueta table
.
Código:
put ( "table" , Tables . of ( new String [][] {
new String [] { "Song name" , "Artist" }
}). border ( BorderStyle . DEFAULT ). create ());
Plantilla:
{{#table}}
Producción:
Nombre de la canción | Artista |
La etiqueta de lista corresponde a la lista de símbolos o lista numerada de Word, que comienza con *
, como {{*number}}
.
Código:
put ( "list" , Numberings . create ( "Plug-in grammar" ,
"Supports word text, pictures, table..." ,
"Template, not just template, but also style template" ));
Plantilla:
{{*list}}
Producción:
● Plug-in grammar
● Supports word text, pictures, table...
● Templates, not just templates, but also style templates
Una sección se compone de dos etiquetas antes y después, la etiqueta de inicio se identifica con ?
, y la etiqueta final se identifica con /
, como {{?section}}
como la etiqueta inicial del bloque de secciones, {{/section} }
es la etiqueta final y section
es el nombre de esta sección.
Las secciones son muy útiles al procesar una serie de elementos de un documento. Los elementos del documento (texto, imágenes, tablas, etc.) ubicados en una sección se pueden representar cero, una o N veces, según el valor de la sección.
Si el valor de la sección es null
, false
o una colección vacía, no se mostrarán todos los elementos del documento ubicados en la sección, similar a la condición de la declaración if es false
.
Modelo de datos:
{
"announce" : false
}
Plantilla:
Made it,Ma!{{?announce}}Top of the world!{{/announce}}
Made it,Ma!
{{?announce}}
Top of the world!?
{{/announce}}
Producción:
Made it,Ma!
Made it,Ma!
Si el valor de la sección no es null
, false
y no es una colección, todos los elementos del documento en la sección se representarán una vez , similar a la condición de la declaración if es true
.
Modelo de datos:
{
"person" : { "name" : " Sayi " }
}
Plantilla:
{{?person}}
Hi {{name}}!
{{/person}}
Producción:
Hi Sayi!
Si el valor de la sección es una colección no vacía, los elementos del documento en la sección se repetirán una o N veces , dependiendo del tamaño de la colección, similar a la sintaxis foreach.
Modelo de datos:
{
"songs" : [
{ "name" : " Memories " },
{ "name" : " Sugar " },
{ "name" : " Last Dance " }
]
}
Plantilla:
{{?songs}}
{{name}}
{{/songs}}
Producción:
Memories
Sugar
Last Dance
En el bucle, se puede utilizar una etiqueta especial {{=#this}}
para hacer referencia directamente al objeto de la iteración actual.
Modelo de datos:
{
"produces" : [
" application/json " ,
" application/xml "
]
}
Plantilla:
{{?produces}}
{{=#this}}
{{/produces}}
Producción:
application/json
application/xml
Anidar es la combinación de otra plantilla de Word en una plantilla de Word, que puede entenderse como importación, inclusión o combinación de documentos de Word, marcados con +
, 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 ());
Plantilla de dos palabras:
principal.docx:
Hello, World
{{+nested}}
sub.docx:
Address: {{addr}}
Producción:
Hello, World
Address: Hangzhou,China
Address: Shanghai,China
中文文档
Para obtener más ejemplos y el código fuente de todos los ejemplos, consulte Casos de prueba de JUnit.
Puedes unirte a este proyecto de muchas maneras, no limitándote a las siguientes:
Ver preguntas frecuentes.