Apache POI に基づいて、テンプレートを使用して Word(docx) を生成するより良い方法。
FreeMarker または Velocity は、テキスト テンプレートとデータに基づいて新しい HTML ページまたは構成ファイルを生成します。 poi-tl は、 Word テンプレートとデータに基づいて新しいドキュメントを生成する Word テンプレート エンジンです。
Word テンプレートには豊富なスタイルがあります。 Poi-tl は、生成されたドキュメント内のテンプレートのスタイルを完全に保持します。タグのスタイルを設定することもできます。タグのスタイルは置換されたテキストに適用されるため、テンプレートのデザインに集中できます。
poi-tl は、「ロジックレス」のテンプレート エンジンです。複雑な制御構造や変数の割り当てはなく、タグのみです。一部のタグはテキスト、画像、表などに置き換えることができ、一部のタグは特定のドキュメント コンテンツを非表示にし、他のタグは一連のドキュメント コンテンツをループします。
変数割り当てや条件ステートメントなどの「強力な」構成により、テンプレート システム内でのみアプリケーションの外観を簡単に変更できます。ただし、分離という代償として、テンプレート自体がアプリケーション ロジックの一部になってしまいます。
《Google CTテンプレート》
poi-tl はカスタム関数 (プラグイン)をサポートしており、関数は Word テンプレート内のどこでも実行でき、文書内のどこでも何でもできるのが poi-tl の目標です。
特徴 | 説明 |
---|---|
✅ テキスト | タグをテキストとしてレンダリングする |
✅ 写真 | タグを画像としてレンダリングする |
✅ テーブル | タグをテーブルとしてレンダリングする |
✅ 番号付け | タグを番号付けとしてレンダリングします |
✅ チャート | 棒グラフ (3D 棒グラフ)、縦棒グラフ (3D 縦棒グラフ)、面グラフ (3D 面グラフ)、折れ線グラフ (3D 折れ線グラフ)、レーダー チャート、円グラフ (3D 円グラフ) およびその他のグラフのレンダリング |
✅ 条件の場合 | 条件に応じて、特定の文書コンテンツ (テキスト、段落、写真、表、リスト、グラフなど) を非表示または表示します。 |
✅ Foreach ループ | コレクションに応じて、特定のドキュメント コンテンツ (テキスト、段落、画像、表、リスト、グラフなど) をループします。 |
✅ ループテーブル行 | レンダリングされたテーブルの行をコピーするループ |
✅ ループテーブル列 | テーブルの列をループコピーしてレンダリングします。 |
✅ 順序付きリストをループする | 順序付きリストのループをサポートし、同時に複数レベルのリストをサポートします |
✅ コードをハイライト表示 | コードブロックの単語の強調表示、26の言語と数百のカラーリングスタイルをサポート |
✅ マークダウン | Markdown を Word ドキュメントに変換する |
✅ Word添付 | Wordに添付ファイルを挿入 |
✅ 一言コメント | サポートコメントの完成、コメントの作成、コメントの変更など。 |
✅ ワードSDT | 完全なサポート構造化文書タグ |
✅ テキストボックス | テキストボックスでのタグのサポート |
✅ 画像の差し替え | 元の画像を別の画像に置き換えます |
✅ ブックマーク、アンカー、ハイパーリンク | ドキュメント内のブックマーク、アンカー、ハイパーリンクの設定をサポート |
✅ 表現言語 | SpringEL 式を完全にサポートし、OGNL、MVEL などのより多くの式を拡張できます。 |
✅ スタイル | テンプレートはスタイルであり、コードでもスタイルを設定できます |
✅ テンプレートのネスト | テンプレートにはサブテンプレートが含まれており、サブテンプレートにはサブテンプレートが含まれています。 |
✅ マージ | Wordの結合結合、指定した位置に結合することもできます |
✅ カスタム関数 (プラグイン) | プラグイン設計、ドキュメント内の任意の場所で関数を実行 |
< dependency >
< groupId >com.deepoove</ groupId >
< artifactId >poi-tl</ artifactId >
< version >1.12.2</ version >
</ dependency >
注: poi-tl
1.12.x
には、POI バージョン5.2.2+
が必要です。
非常に単純な例から始めます。 {{title}}
を「poi-tl テンプレート エンジン」に置き換えます。
{{title}}
を含む新しいドキュメントtemplate.docx
を作成します。 //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" );
out_template.docx
ドキュメントを開くと、すべてが希望どおりになります。
タグは 2 つの中括弧で構成されます。 {{title}}
はタグ、 {{?title}}
もタグ、 title
はタグの名前、 ?
タグのタイプを識別します。次に、どのようなタグの種類があるかを見てみましょう。
テキスト タグは、Word テンプレートの最も基本的なタグ タイプです。 {{name}}
データ モデル内のキーname
の値に置き換えられます。キーが存在しない場合、タグはクリアされます(タグを保持するか例外をスローするかはプログラムで設定できます)。
次の例に示すように、テキスト タグのスタイルが置換されたテキストに適用されます。
コード:
put ( "name" , "Mama" );
put ( "thing" , "chocolates" );
テンプレート:
{{name}}はいつも、人生は{{物}}が入った箱のようなものだと言いました。
出力:
ママはいつも、人生はチョコレートの箱のようなものだと言いました。
画像タグは@
で始まります。たとえば、 {{@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 ());
テンプレート:
Fruit Logo:
watermelon {{@watermelon}}
lemon {{@lemon}}
banana {{@banana}}
出力:
Fruit Logo:
watermelon ?
lemon ?
banana ?
table タグは、 {{#table}}
のように#
で始まり、N 行 N 列の Word テーブルとしてレンダリングされます。 N の値はtable
タグのデータによって異なります。
コード:
put ( "table" , Tables . of ( new String [][] {
new String [] { "Song name" , "Artist" }
}). border ( BorderStyle . DEFAULT ). create ());
テンプレート:
{{#table}}
出力:
曲名 | アーティスト |
list タグは、 Word の記号リストまたは*
で始まる番号付きリスト ( {{*number}}
など) に対応します。
コード:
put ( "list" , Numberings . create ( "Plug-in grammar" ,
"Supports word text, pictures, table..." ,
"Template, not just template, but also style template" ));
テンプレート:
{{*list}}
出力:
● Plug-in grammar
● Supports word text, pictures, table...
● Templates, not just templates, but also style templates
セクションは前後の 2 つのタグで構成され、開始タグは?
で識別されます。 、終了タグは/
で識別されます。たとえば、セクション ブロックの開始タグとして{{?section}}
、 {{/section} }
が終了タグ、 section
このセクションの名前です。
セクションは、一連の文書要素を処理する場合に非常に役立ちます。セクション内のドキュメント要素 (テキスト、画像、表など) は、セクションの値に応じて、0 回、1 回、または 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
の条件と同様に、セクション内のすべてのドキュメント要素が1 回レンダリングされます。
データモデル:
{
"person" : { "name" : " Sayi " }
}
テンプレート:
{{?person}}
Hi {{name}}!
{{/person}}
出力:
Hi Sayi!
セクションの値が空ではないコレクションの場合、セクション内のドキュメント要素は、foreach 構文と同様に、コレクションのサイズに応じて1 回または N 回ループされます。
データモデル:
{
"songs" : [
{ "name" : " Memories " },
{ "name" : " Sugar " },
{ "name" : " Last Dance " }
]
}
テンプレート:
{{?songs}}
{{name}}
{{/songs}}
出力:
Memories
Sugar
Last Dance
ループ内では、特別なタグ{{=#this}}
使用して、現在の反復のオブジェクトを直接参照できます。
データモデル:
{
"produces" : [
" application/json " ,
" application/xml "
]
}
テンプレート:
{{?produces}}
{{=#this}}
{{/produces}}
出力:
application/json
application/xml
ネストとは、Word テンプレート内で別の Word テンプレートを結合することです。これは、 {{+nested}}
のように+
でマークされたインポート、インクルード、または Word ドキュメントの結合として理解できます。
コード:
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 ());
2 つの Word テンプレート:
メイン.docx:
Hello, World
{{+nested}}
サブ.docx:
Address: {{addr}}
出力:
Hello, World
Address: Hangzhou,China
Address: Shanghai,China
中文档
その他の例とすべての例のソース コードについては、「JUnit テストケース」を参照してください。
このプロジェクトには、次の方法に限定されず、さまざまな方法で参加できます。
FAQを参照してください。