Eine bessere Möglichkeit, Word (docx) mit einer Vorlage zu generieren, basierend auf Apache POI.
FreeMarker oder Velocity generieren neue HTML-Seiten oder Konfigurationsdateien basierend auf Textvorlagen und Daten. poi-tl ist eine Word-Vorlagen-Engine, die neue Dokumente basierend auf Word-Vorlagen und -Daten generiert.
Die Word-Vorlage verfügt über umfangreiche Stile. Poi-tl behält die Stile der Vorlage in den generierten Dokumenten perfekt bei. Sie können auch Stile für die Tags festlegen. Die Stile der Tags werden auf den ersetzten Text angewendet, sodass Sie sich auf das Vorlagendesign konzentrieren können.
poi-tl ist eine „logiklose“ Template-Engine. Es gibt keine komplizierte Kontrollstruktur und Variablenzuweisung, nur Tags . Einige Tags können durch Text, Bilder, Tabellen usw. ersetzt werden, einige Tags verbergen bestimmte Dokumentinhalte, während andere Tags eine Reihe von Dokumentinhalten in einer Schleife ausführen.
„Leistungsstarke“ Konstrukte wie Variablenzuweisungen oder bedingte Anweisungen machen es einfach, das Aussehen einer Anwendung ausschließlich innerhalb des Vorlagensystems zu ändern – allerdings auf Kosten der Trennung, wodurch die Vorlagen selbst Teil der Anwendungslogik werden.
„Google CTTemplate“
poi-tl unterstützt benutzerdefinierte Funktionen (Plug-Ins) . Funktionen können überall in der Word-Vorlage ausgeführt werden. Das Ziel von poi-tl ist es, alles an einer beliebigen Stelle im Dokument auszuführen.
Besonderheit | Beschreibung |
---|---|
✅ Text | Rendern Sie das Tag als Text |
✅ Bild | Rendern Sie das Tag als Bild |
✅ Tisch | Rendern Sie das Tag als Tabelle |
✅ Nummerierung | Rendern Sie das Tag als Nummerierung |
✅ Diagramm | Balkendiagramm (3D-Balkendiagramm), Säulendiagramm (3D-Säulendiagramm), Flächendiagramm (3D-Flächendiagramm), Liniendiagramm (3D-Liniendiagramm), Radardiagramm, Kreisdiagramm (3D-Kreisfigur) und andere Diagrammdarstellungen |
✅ Wenn Bedingung | Bestimmte Dokumentinhalte (einschließlich Text, Absätze, Bilder, Tabellen, Listen, Diagramme usw.) entsprechend den Bedingungen ausblenden oder anzeigen |
✅ Foreach-Schleife | Durchlaufen Sie bestimmte Dokumentinhalte (einschließlich Text, Absätze, Bilder, Tabellen, Listen, Diagramme usw.) entsprechend der Sammlung |
✅ Tabellenzeile durchschleifen | Schleife zum Kopieren einer Zeile der gerenderten Tabelle |
✅ Schleifentabellenspalte | Kopieren und rendern Sie eine Spalte der Tabelle in einer Schleife |
✅ Schleife geordnete Liste | Unterstützen Sie die Schleife geordneter Listen und unterstützen Sie gleichzeitig mehrstufige Listen |
✅ Code hervorheben | Worthervorhebung von Codeblöcken, unterstützt 26 Sprachen und Hunderte von Farbstilen |
✅ Abschlag | Konvertieren Sie Markdown in ein Word-Dokument |
✅ Wortanhang | Anhang in Word einfügen |
✅ Word-Kommentare | Support-Kommentar vervollständigen, Kommentar erstellen, Kommentar ändern usw. |
✅ Wort-SDT | Vollständige Unterstützung strukturierter Dokument-Tags |
✅ Textfeld | Tag-Unterstützung im Textfeld |
✅ Bildaustausch | Ersetzen Sie das Originalbild durch ein anderes Bild |
✅ Lesezeichen, Anker, Hyperlinks | Unterstützt das Setzen von Lesezeichen, Ankern und Hyperlinks in Dokumenten |
✅ Ausdruckssprache | Unterstützt SpringEL-Ausdrücke vollständig und kann weitere Ausdrücke erweitern: OGNL, MVEL ... |
✅ Stil | Die Vorlage ist der Stil, und der Code kann auch den Stil festlegen |
✅ Vorlagenverschachtelung | Die Vorlage enthält Untervorlagen, und die Untervorlagen enthalten dann Untervorlagen |
✅ Zusammenführen | Wortzusammenführung Zusammenführen, Sie können auch an der angegebenen Position zusammenführen |
✅ Benutzerdefinierte Funktionen (Plug-Ins) | Plug-in-Design, Funktion überall im Dokument ausführen |
< dependency >
< groupId >com.deepoove</ groupId >
< artifactId >poi-tl</ artifactId >
< version >1.12.2</ version >
</ dependency >
HINWEIS: poi-tl
1.12.x
erfordert POI-Version5.2.2+
.
Beginnen Sie mit einem absolut einfachen Beispiel: Ersetzen Sie {{title}}
durch „poi-tl template engine“.
template.docx
, einschließlich des Inhalts {{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" );
Öffnen Sie das Dokument out_template.docx
, alles ist wie gewünscht.
Das Tag besteht aus zwei geschweiften Klammern, {{title}}
ist ein Tag, {{?title}}
ist ebenfalls ein Tag, title
ist der Name des Tags und ?
identifiziert den Typ des Tags. Als nächstes schauen wir uns an, welche Tag-Typen es gibt.
Das Text-Tag ist der einfachste Tag-Typ in der Word-Vorlage. {{name}}
wird durch den Wert des name
im Datenmodell ersetzt. Wenn der Schlüssel nicht vorhanden ist, wird das Tag gelöscht (Das Programm kann konfigurieren, ob das Tag beibehalten oder eine Ausnahme ausgelöst werden soll).
Der Stil des Text-Tags wird auf den ersetzten Text angewendet, wie im folgenden Beispiel gezeigt.
Code:
put ( "name" , "Mama" );
put ( "thing" , "chocolates" );
Vorlage:
{{name}} sagte immer, das Leben sei wie eine Schachtel mit {{Ding}}.
Ausgabe:
Mama sagte immer, das Leben sei wie eine Schachtel Pralinen.
Das Bild-Tag beginnt mit @
. Beispielsweise sucht {{@logo}}
im Datenmodell nach dem Wert mit dem Schlüssel logo
und ersetzt dann das Tag durch das Bild. Die dem Bild-Tag entsprechenden Daten können eine einfache URL oder Pfadzeichenfolge oder eine Struktur sein, die die Breite und Höhe des Bildes enthält.
Code:
put ( "watermelon" , "assets/watermelon.png" );
put ( "watermelon" , "http://x/lemon.png" );
put ( "lemon" , Pictures . ofLocal ( "sob.jpeg" , PictureType . JPEG ). size ( 24 , 24 ). create ());
Vorlage:
Fruit Logo:
watermelon {{@watermelon}}
lemon {{@lemon}}
banana {{@banana}}
Ausgabe:
Fruit Logo:
watermelon ?
lemon ?
banana ?
Das Tabellen-Tag beginnt mit #
, beispielsweise {{#table}}
. Es wird als Word-Tabelle mit N Zeilen und N Spalten gerendert. Der Wert von N hängt von den Daten des table
-Tags ab.
Code:
put ( "table" , Tables . of ( new String [][] {
new String [] { "Song name" , "Artist" }
}). border ( BorderStyle . DEFAULT ). create ());
Vorlage:
{{#table}}
Ausgabe:
Songname | Künstler |
Das Listen-Tag entspricht der Symbolliste oder nummerierten Liste von Word, beginnend mit *
, z. B. {{*number}}
.
Code:
put ( "list" , Numberings . create ( "Plug-in grammar" ,
"Supports word text, pictures, table..." ,
"Template, not just template, but also style template" ));
Vorlage:
{{*list}}
Ausgabe:
● Plug-in grammar
● Supports word text, pictures, table...
● Templates, not just templates, but also style templates
Ein Abschnitt besteht aus zwei Tags davor und danach. Das Start-Tag wird durch ?
gekennzeichnet. , und das End-Tag wird durch /
identifiziert, z. B. {{?section}}
als Start-Tag des Abschnittsblocks, {{/section} }
ist das End-Tag und section
ist der Name dieses Abschnitts.
Abschnitte sind sehr nützlich, wenn eine Reihe von Dokumentelementen verarbeitet werden. Dokumentelemente (Text, Bilder, Tabellen usw.), die sich in einem Abschnitt befinden, können je nach Wert des Abschnitts null, einmal oder N-mal gerendert werden.
Wenn der Wert des Abschnitts null
, false
oder eine leere Sammlung ist, werden alle Dokumentelemente, die sich im Abschnitt befinden, nicht angezeigt , ähnlich wie bei der Bedingung der if-Anweisung ist false
.
Datenmodell:
{
"announce" : false
}
Vorlage:
Made it,Ma!{{?announce}}Top of the world!{{/announce}}
Made it,Ma!
{{?announce}}
Top of the world!?
{{/announce}}
Ausgabe:
Made it,Ma!
Made it,Ma!
Wenn der Wert des Abschnitts nicht null
oder false
ist und es sich nicht um eine Sammlung handelt, werden alle Dokumentelemente im Abschnitt einmal gerendert , ähnlich der Bedingung der if-Anweisung ist true
.
Datenmodell:
{
"person" : { "name" : " Sayi " }
}
Vorlage:
{{?person}}
Hi {{name}}!
{{/person}}
Ausgabe:
Hi Sayi!
Wenn der Wert des Abschnitts eine nicht leere Sammlung ist, werden die Dokumentelemente im Abschnitt je nach Größe der Sammlung einmal oder N-mal wiederholt , ähnlich wie bei der foreach-Syntax.
Datenmodell:
{
"songs" : [
{ "name" : " Memories " },
{ "name" : " Sugar " },
{ "name" : " Last Dance " }
]
}
Vorlage:
{{?songs}}
{{name}}
{{/songs}}
Ausgabe:
Memories
Sugar
Last Dance
In der Schleife kann ein spezielles Tag {{=#this}}
verwendet werden, um direkt auf das Objekt der aktuellen Iteration zu verweisen.
Datenmodell:
{
"produces" : [
" application/json " ,
" application/xml "
]
}
Vorlage:
{{?produces}}
{{=#this}}
{{/produces}}
Ausgabe:
application/json
application/xml
Unter Verschachtelung versteht man das Zusammenführen einer anderen Word-Vorlage in eine Word-Vorlage, was als Importieren, Einbinden oder Zusammenführen von Word-Dokumenten verstanden werden kann, markiert mit +
, wie z. B. {{+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 ());
Zwei-Word-Vorlage:
main.docx:
Hello, World
{{+nested}}
sub.docx:
Address: {{addr}}
Ausgabe:
Hello, World
Address: Hangzhou,China
Address: Shanghai,China
中文文档
Weitere Beispiele und den Quellcode aller Beispiele finden Sie unter JUnit-Testfälle.
Sie können diesem Projekt auf viele Arten beitreten, nicht nur auf die folgenden:
Siehe FAQ.