Cara yang lebih baik untuk menghasilkan kata (docx) dengan templat, berdasarkan Apache POI。
FreeMarker atau Velocity menghasilkan halaman html baru atau file konfigurasi berdasarkan template teks dan data. poi-tl adalah mesin templat Word yang menghasilkan dokumen baru berdasarkan templat dan data Word .
Templat Word memiliki gaya yang kaya. Poi-tl akan mempertahankan gaya template dengan sempurna di dokumen yang dihasilkan. Anda juga dapat mengatur gaya untuk tag. Gaya tag akan diterapkan pada teks yang diganti, sehingga Anda bisa fokus pada desain templat.
poi-tl adalah mesin templat "tanpa logika" . Tidak ada struktur kontrol yang rumit dan penetapan variabel, hanya tag , beberapa tag dapat diganti dengan teks, gambar, tabel, dll., beberapa tag akan menyembunyikan beberapa konten dokumen tertentu, sementara tag lainnya akan mengulang serangkaian konten dokumen.
Konstruksi yang "kuat" seperti penugasan variabel atau pernyataan kondisional memudahkan untuk mengubah tampilan aplikasi dalam sistem templat secara eksklusif... namun, dengan mengorbankan pemisahan, mengubah templat itu sendiri menjadi bagian dari logika aplikasi.
《Google CTemplate》
poi-tl mendukung fungsi khusus (plug-in) , fungsi dapat dijalankan di mana saja di templat Word, melakukan apa pun di mana pun dalam dokumen adalah tujuan poi-tl.
Fitur | Keterangan |
---|---|
✅ Teks | Jadikan tag sebagai teks |
✅ Gambar | Jadikan tag sebagai gambar |
✅ Meja | Jadikan tag sebagai tabel |
✅ Penomoran | Jadikan tag sebagai penomoran |
✅ Bagan | Diagram batang (diagram batang 3D), diagram kolom (diagram kolom 3D), diagram area (diagram area 3D), diagram garis (diagram garis 3D), diagram radar, diagram lingkaran (Gambar pai 3D) dan rendering diagram lainnya |
✅ Jika Kondisi | Menyembunyikan atau menampilkan isi dokumen tertentu (termasuk teks, paragraf, gambar, tabel, daftar, bagan, dll) sesuai kondisi |
✅ Lingkaran Depan | Ulangi konten dokumen tertentu (termasuk teks, paragraf, gambar, tabel, daftar, bagan, dll.) sesuai dengan koleksinya |
✅ Lingkaran tabel baris | Ulangi untuk menyalin baris tabel yang dirender |
✅ Kolom tabel lingkaran | Ulangi salin dan render kolom tabel |
✅ Ulangi daftar pesanan | Mendukung perulangan daftar terurut, dan mendukung daftar multi-level secara bersamaan |
✅ Sorot kode | Penyorotan kata dari blok kode, mendukung 26 bahasa dan ratusan gaya pewarnaan |
✅ Penurunan harga | Ubah penurunan harga menjadi dokumen Word |
✅ Lampiran kata | Sisipkan lampiran di Word |
✅ Komentar Kata | Selesaikan komentar dukungan, buat komentar, ubah komentar, dll. |
✅ Kata SDT | Tag dokumen terstruktur dukungan lengkap |
✅ Kotak teks | Tandai dukungan di kotak teks |
✅ Penggantian gambar | Ganti gambar asli dengan gambar lain |
✅ bookmark, jangkar, hyperlink | Mendukung pengaturan bookmark, jangkar dan hyperlink dalam dokumen |
✅ Bahasa Ekspresi | Sepenuhnya mendukung ekspresi SpringEL dan dapat memperluas lebih banyak ekspresi: OGNL, MVEL... |
✅ Gaya | Templat adalah gayanya, dan kodenya juga dapat mengatur gayanya |
✅ Templat bersarang | Templat berisi sub-templat, dan sub-templat tersebut kemudian berisi sub-templat |
✅ Gabungkan | Penggabungan kata Gabung, Anda juga dapat menggabungkan di posisi yang ditentukan |
✅ fungsi khusus (plug-in) | Desain plug-in, jalankan fungsi di mana saja dalam dokumen |
< dependency >
< groupId >com.deepoove</ groupId >
< artifactId >poi-tl</ artifactId >
< version >1.12.2</ version >
</ dependency >
CATATAN: poi-tl
1.12.x
memerlukan POI versi5.2.2+
.
Mulailah dengan contoh sederhana yang mematikan: ganti {{title}}
dengan "mesin templat poi-tl".
template.docx
dokumen baru.docx, termasuk kontennya {{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" );
Buka dokumen out_template.docx
, semuanya sesuai keinginan.
Tag terdiri dari dua kurung kurawal, {{title}}
merupakan tag, {{?title}}
juga merupakan tag, title
adalah nama tag, dan ?
mengidentifikasi jenis tag. Selanjutnya, mari kita lihat jenis tag apa saja yang ada.
Tag teks adalah tipe tag paling dasar di templat Word. {{name}}
akan diganti dengan nilai name
kunci dalam model data. Jika kuncinya tidak ada, tag akan dihapus (Program dapat mengonfigurasi apakah akan mempertahankan tag atau memberikan pengecualian).
Gaya tag teks akan diterapkan pada teks yang diganti, seperti yang ditunjukkan pada contoh berikut.
Kode:
put ( "name" , "Mama" );
put ( "thing" , "chocolates" );
Templat:
{{name}} selalu mengatakan hidup itu seperti sekotak {{benda}}.
Keluaran:
Mama selalu bilang hidup itu seperti sekotak coklat.
Tag gambar dimulai dengan @
, misalnya {{@logo}}
akan mencari nilai dengan kunci logo
di model data, lalu mengganti tag dengan gambar. Data yang sesuai dengan tag gambar dapat berupa URL sederhana atau string Jalur, atau struktur yang berisi lebar dan tinggi gambar.
Kode:
put ( "watermelon" , "assets/watermelon.png" );
put ( "watermelon" , "http://x/lemon.png" );
put ( "lemon" , Pictures . ofLocal ( "sob.jpeg" , PictureType . JPEG ). size ( 24 , 24 ). create ());
Templat:
Fruit Logo:
watermelon {{@watermelon}}
lemon {{@lemon}}
banana {{@banana}}
Keluaran:
Fruit Logo:
watermelon ?
lemon ?
banana ?
Tag tabel dimulai dengan #
, seperti {{#table}}
, maka akan dirender sebagai tabel Word dengan N baris dan N kolom. Nilai N bergantung pada data tag table
.
Kode:
put ( "table" , Tables . of ( new String [][] {
new String [] { "Song name" , "Artist" }
}). border ( BorderStyle . DEFAULT ). create ());
Templat:
{{#table}}
Keluaran:
Nama lagu | Artis |
Tag daftar sesuai dengan daftar simbol Word atau daftar bernomor, dimulai dengan *
, seperti {{*number}}
.
Kode:
put ( "list" , Numberings . create ( "Plug-in grammar" ,
"Supports word text, pictures, table..." ,
"Template, not just template, but also style template" ));
Templat:
{{*list}}
Keluaran:
● Plug-in grammar
● Supports word text, pictures, table...
● Templates, not just templates, but also style templates
Bagian terdiri dari dua tag sebelum dan sesudah, tag awal diidentifikasi oleh ?
, dan tag akhir diidentifikasi dengan /
, misalnya {{?section}}
sebagai tag awal blok bagian, {{/section} }
adalah tag akhir, dan section
adalah nama bagian ini.
Bagian sangat berguna saat memproses serangkaian elemen dokumen. Elemen dokumen (teks, gambar, tabel, dll.) yang terletak di suatu bagian dapat dirender nol, satu, atau N kali, bergantung pada nilai bagian tersebut.
Jika nilai bagian tersebut null
, false
atau koleksi kosong, semua elemen dokumen yang terletak di bagian tersebut tidak akan ditampilkan , mirip dengan kondisi pernyataan if adalah false
.
Model data:
{
"announce" : false
}
Templat:
Made it,Ma!{{?announce}}Top of the world!{{/announce}}
Made it,Ma!
{{?announce}}
Top of the world!?
{{/announce}}
Keluaran:
Made it,Ma!
Made it,Ma!
Jika nilai bagian tersebut bukan null
, false
, dan bukan merupakan kumpulan, semua elemen dokumen di bagian tersebut akan dirender satu kali , serupa dengan kondisi pernyataan if bernilai true
.
Model data:
{
"person" : { "name" : " Sayi " }
}
Templat:
{{?person}}
Hi {{name}}!
{{/person}}
Keluaran:
Hi Sayi!
Jika nilai bagian adalah koleksi yang tidak kosong, elemen dokumen di bagian tersebut akan diulang satu kali atau N kali , bergantung pada ukuran koleksi, mirip dengan sintaksis foreach.
Model data:
{
"songs" : [
{ "name" : " Memories " },
{ "name" : " Sugar " },
{ "name" : " Last Dance " }
]
}
Templat:
{{?songs}}
{{name}}
{{/songs}}
Keluaran:
Memories
Sugar
Last Dance
Dalam loop, tag khusus {{=#this}}
dapat digunakan untuk merujuk langsung ke objek iterasi saat ini.
Model data:
{
"produces" : [
" application/json " ,
" application/xml "
]
}
Templat:
{{?produces}}
{{=#this}}
{{/produces}}
Keluaran:
application/json
application/xml
Bersarang adalah penggabungan templat Word lain dalam templat Word, yang dapat dipahami sebagai impor, penyertaan, atau penggabungan dokumen kata, ditandai dengan +
, seperti {{+nested}}
.
Kode:
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 ());
Templat Dua Kata:
utama.docx:
Hello, World
{{+nested}}
sub.docx:
Address: {{addr}}
Keluaran:
Hello, World
Address: Hangzhou,China
Address: Shanghai,China
中文文档
Untuk contoh selengkapnya dan kode sumber semua contoh, lihat Kasus uji JUnit.
Anda dapat mengikuti proyek ini dengan banyak cara, tidak terbatas pada cara berikut:
Lihat FAQ.