Une meilleure façon de générer un mot (docx) avec un modèle, basé sur Apache POI.
FreeMarker ou Velocity génère de nouvelles pages HTML ou fichiers de configuration basés sur un modèle de texte et des données. poi-tl est un moteur de modèles Word qui génère de nouveaux documents basés sur le modèle et les données Word .
Le modèle Word a des styles riches. Poi-tl conservera parfaitement les styles du modèle dans les documents générés. Vous pouvez également définir des styles pour les balises. Les styles des balises seront appliqués au texte remplacé, afin que vous puissiez vous concentrer sur la conception du modèle.
poi-tl est un moteur de modèles « sans logique » . Il n'y a pas de structure de contrôle compliquée ni d'affectation de variables, seulement des balises , certaines balises peuvent être remplacées par du texte, des images, des tableaux, etc., certaines balises masqueront certains contenus du document, tandis que d'autres balises boucleront une série de contenu du document.
Des constructions « puissantes » telles que l'affectation de variables ou les instructions conditionnelles facilitent la modification de l'apparence d'une application au sein du système de modèles exclusivement... cependant, au prix de la séparation, transformant les modèles eux-mêmes en une partie de la logique de l'application.
《Google CTemplate》
poi-tl prend en charge les fonctions personnalisées (plug-ins) , les fonctions peuvent être exécutées n'importe où dans le modèle Word, faire n'importe quoi n'importe où dans le document est l'objectif de poi-tl.
Fonctionnalité | Description |
---|---|
✅ Texte | Afficher la balise sous forme de texte |
✅ Photo | Rendre la balise sous forme d'image |
✅Tableau | Afficher la balise sous forme de tableau |
✅ Numérotation | Rendre la balise sous forme de numérotation |
✅ Graphique | Graphique à barres (graphique à barres 3D), graphique à colonnes (graphique à colonnes 3D), graphique en aires (graphique en aires 3D), graphique en courbes (graphique en courbes 3D), graphique en radar, graphique à secteurs (figure à secteurs 3D) et autre rendu de graphique |
✅ Si condition | Masquer ou afficher certains contenus du document (notamment le texte, les paragraphes, les images, les tableaux, les listes, les graphiques, etc.) selon les conditions |
✅ Boucle Foreach | Parcourez certains contenus de documents (y compris le texte, les paragraphes, les images, les tableaux, les listes, les graphiques, etc.) en fonction de la collection |
✅ Ligne de table en boucle | Boucle pour copier une ligne du tableau rendu |
✅ Colonne du tableau des boucles | Copie en boucle et rendu d'une colonne du tableau |
✅ Liste ordonnée en boucle | Prend en charge la boucle de la liste ordonnée et prend en charge la liste à plusieurs niveaux en même temps |
✅ Surligner le code | Mise en évidence des blocs de code, prenant en charge 26 langues et des centaines de styles de coloration |
✅ Démarquage | Convertir Markdown en un document Word |
✅ Mot joint | Insérer une pièce jointe dans Word |
✅ Commentaires verbaux | Compléter le commentaire de support, créer un commentaire, modifier le commentaire, etc. |
✅ Mot SDT | Balise de document structuré de support complet |
✅ Zone de texte | Prise en charge des balises dans la zone de texte |
✅ Remplacement d'image | Remplacer l'image originale par une autre image |
✅ signets, ancres, hyperliens | Prise en charge de la définition de signets, d'ancres et de liens hypertextes dans les documents |
✅ Langage d'expression | Prend entièrement en charge les expressions SpringEL et peut étendre davantage d'expressions : OGNL, MVEL... |
✅Style | Le modèle est le style, et le code peut également définir le style |
✅ Imbrication de modèles | Le modèle contient des sous-modèles, et les sous-modèles contiennent ensuite des sous-modèles |
✅ Fusionner | Fusion de mots Fusionner, vous pouvez également fusionner à la position spécifiée |
✅ fonctions personnalisées (plug-ins) | Conception de plug-in, exécution de la fonction n'importe où dans le document |
< dependency >
< groupId >com.deepoove</ groupId >
< artifactId >poi-tl</ artifactId >
< version >1.12.2</ version >
</ dependency >
REMARQUE : poi-tl
1.12.x
nécessite la version POI5.2.2+
.
Commencez par un exemple simple et mortel : remplacez {{title}}
par "moteur de modèle poi-tl".
template.docx
, incluant le contenu {{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" );
Ouvrez le document out_template.docx
, tout est comme vous le souhaitez.
La balise se compose de deux accolades, {{title}}
est une balise, {{?title}}
est également une balise, title
est le nom de la balise et ?
identifie le type de balise. Voyons ensuite quels sont les types de balises.
La balise de texte est le type de balise le plus basique du modèle Word. {{name}}
sera remplacé par la valeur du name
de clé dans le modèle de données. Si la clé n'existe pas, la balise sera effacée (le programme peut configurer s'il doit conserver la balise ou lever une exception).
Le style de la balise de texte sera appliqué au texte remplacé, comme le montre l'exemple suivant.
Code:
put ( "name" , "Mama" );
put ( "thing" , "chocolates" );
Modèle:
{{name}} a toujours dit que la vie était comme une boîte de {{thing}}.
Sortir:
Maman disait toujours que la vie était comme une boîte de chocolats.
La balise d'image commence par @
, par exemple, {{@logo}}
recherchera la valeur avec la clé du logo
dans le modèle de données, puis remplacera la balise par l'image. Les données correspondant à la balise image peuvent être une simple URL ou chaîne de chemin, ou une structure contenant la largeur et la hauteur de l'image.
Code:
put ( "watermelon" , "assets/watermelon.png" );
put ( "watermelon" , "http://x/lemon.png" );
put ( "lemon" , Pictures . ofLocal ( "sob.jpeg" , PictureType . JPEG ). size ( 24 , 24 ). create ());
Modèle:
Fruit Logo:
watermelon {{@watermelon}}
lemon {{@lemon}}
banana {{@banana}}
Sortir:
Fruit Logo:
watermelon ?
lemon ?
banana ?
La balise table commence par #
, comme {{#table}}
, elle sera rendue sous forme de tableau Word avec N lignes et N colonnes. La valeur de N dépend des données de la balise table
.
Code:
put ( "table" , Tables . of ( new String [][] {
new String [] { "Song name" , "Artist" }
}). border ( BorderStyle . DEFAULT ). create ());
Modèle:
{{#table}}
Sortir:
Nom de la chanson | Artiste |
La balise list correspond à la liste de symboles ou à la liste numérotée de Word, commençant par *
, telle que {{*number}}
.
Code:
put ( "list" , Numberings . create ( "Plug-in grammar" ,
"Supports word text, pictures, table..." ,
"Template, not just template, but also style template" ));
Modèle:
{{*list}}
Sortir:
● Plug-in grammar
● Supports word text, pictures, table...
● Templates, not just templates, but also style templates
Une section est composée de deux balises avant et après, la balise de début est identifiée par ?
, et la balise de fin est identifiée par /
, comme {{?section}}
comme balise de début du bloc sections, {{/section} }
est la balise de fin et section
est le nom de cette section.
Les sections sont très utiles lors du traitement d’une série d’éléments de document. Les éléments du document (texte, images, tableaux, etc.) situés dans une section peuvent être rendus zéro, une ou N fois, selon la valeur de la section.
Si la valeur de la section est null
, false
ou une collection vide, tous les éléments du document situés dans la section ne seront pas affichés , similaire à la condition de l'instruction if qui est false
.
Modèle de données :
{
"announce" : false
}
Modèle:
Made it,Ma!{{?announce}}Top of the world!{{/announce}}
Made it,Ma!
{{?announce}}
Top of the world!?
{{/announce}}
Sortir:
Made it,Ma!
Made it,Ma!
Si la valeur de la section n'est pas null
, false
et n'est pas une collection, tous les éléments du document de la section seront rendus une fois , similaire à la condition de l'instruction if est true
.
Modèle de données :
{
"person" : { "name" : " Sayi " }
}
Modèle:
{{?person}}
Hi {{name}}!
{{/person}}
Sortir:
Hi Sayi!
Si la valeur de la section est une collection non vide, les éléments du document dans la section seront bouclés une ou N fois , selon la taille de la collection, similaire à la syntaxe foreach.
Modèle de données :
{
"songs" : [
{ "name" : " Memories " },
{ "name" : " Sugar " },
{ "name" : " Last Dance " }
]
}
Modèle:
{{?songs}}
{{name}}
{{/songs}}
Sortir:
Memories
Sugar
Last Dance
Dans la boucle, une balise spéciale {{=#this}}
peut être utilisée pour faire directement référence à l'objet de l'itération en cours.
Modèle de données :
{
"produces" : [
" application/json " ,
" application/xml "
]
}
Modèle:
{{?produces}}
{{=#this}}
{{/produces}}
Sortir:
application/json
application/xml
L'imbrication est la fusion d'un autre modèle Word dans un modèle Word, qui peut être comprise comme une importation, une inclusion ou une fusion de documents Word, marquée par +
, comme {{+nested}}
.
Code:
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 ());
Modèle en deux mots :
main.docx :
Hello, World
{{+nested}}
sous.docx :
Address: {{addr}}
Sortir:
Hello, World
Address: Hangzhou,China
Address: Shanghai,China
中文文档
Pour plus d'exemples et le code source de tous les exemples, consultez les cas de test JUnit.
Vous pouvez rejoindre ce projet de plusieurs manières, sans toutefois vous limiter aux suivantes :
Voir FAQ.