วิธีที่ดีกว่าในการสร้างคำ (docx) ด้วยเทมเพลต ตาม Apache POI
FreeMarker หรือ Velocity สร้างหน้า html หรือไฟล์การกำหนดค่าใหม่ตามเทมเพลตข้อความและข้อมูล poi-tl เป็นเครื่องมือเทมเพลต Word ที่สร้าง เอกสารใหม่ โดยใช้ เทมเพลต Word และ ข้อมูล
เทมเพลต Word มีสไตล์ที่หลากหลาย Poi-tl จะรักษาสไตล์ในเทมเพลตในเอกสารที่สร้างขึ้นอย่างสมบูรณ์แบบ คุณยังสามารถกำหนดสไตล์ให้กับแท็กได้ รูปแบบของแท็กจะถูกนำไปใช้กับข้อความที่ถูกแทนที่ ดังนั้นคุณจึงสามารถมุ่งเน้นไปที่การออกแบบเทมเพลตได้
poi-tl เป็นเครื่องมือเทมเพลต ที่ "ไร้ตรรกะ" ไม่มีโครงสร้างการควบคุมที่ซับซ้อนและการกำหนดตัวแปร มีเพียง แท็ก เท่านั้น บางแท็กสามารถแทนที่ด้วยข้อความ รูปภาพ ตาราง ฯลฯ บางแท็กจะซ่อนเนื้อหาเอกสารบางส่วน ในขณะที่แท็กอื่นๆ จะวนชุดเนื้อหาเอกสาร
โครงสร้าง "ที่มีประสิทธิภาพ" เช่น การกำหนดตัวแปรหรือคำสั่งแบบมีเงื่อนไขทำให้ง่ายต่อการปรับเปลี่ยนรูปลักษณ์ของแอปพลิเคชันภายในระบบเทมเพลตโดยเฉพาะ... อย่างไรก็ตาม การเปลี่ยนเทมเพลตให้เป็นส่วนหนึ่งของตรรกะของแอปพลิเคชันต้องเสียค่าใช้จ่ายในการแยก
《Google Cเทมเพลต》
poi-tl รองรับ ฟังก์ชั่นที่กำหนดเอง (ปลั๊กอิน) ฟังก์ชั่นสามารถดำเนินการได้ทุกที่ในเทมเพลต Word ทำอะไรก็ได้ในเอกสารคือเป้าหมายของ poi-tl
คุณสมบัติ | คำอธิบาย |
---|---|
✅ข้อความ | แสดงแท็กเป็นข้อความ |
✅ รูปภาพ | แสดงแท็กเป็นรูปภาพ |
✅ โต๊ะ | แสดงแท็กเป็นตาราง |
✅ การนับเลข | แสดงแท็กเป็นการกำหนดหมายเลข |
✅ แผนภูมิ | แผนภูมิแท่ง (แผนภูมิแท่ง 3 มิติ) แผนภูมิคอลัมน์ (แผนภูมิคอลัมน์ 3 มิติ) แผนภูมิพื้นที่ (แผนภูมิพื้นที่ 3 มิติ) แผนภูมิเส้น (แผนภูมิเส้น 3 มิติ) แผนภูมิเรดาร์ แผนภูมิวงกลม (รูปวงกลม 3 มิติ) และการเรนเดอร์แผนภูมิอื่นๆ |
✅ ถ้าสภาพ | ซ่อนหรือแสดงเนื้อหาเอกสารบางอย่าง (รวมถึงข้อความ ย่อหน้า รูปภาพ ตาราง รายการ แผนภูมิ ฯลฯ) ตามเงื่อนไข |
✅ ห่วงหน้า | วนซ้ำเนื้อหาเอกสารบางอย่าง (รวมถึงข้อความ ย่อหน้า รูปภาพ ตาราง รายการ แผนภูมิ ฯลฯ) ตามคอลเลกชัน |
✅ วนแถวโต๊ะได้ | วนซ้ำเพื่อคัดลอกแถวของตารางที่แสดงผล |
✅ คอลัมน์ตารางแบบวนรอบ | คัดลอกแบบวนซ้ำและแสดงคอลัมน์ของตาราง |
✅ รายการสั่งแบบวนรอบ | รองรับการวนซ้ำของรายการสั่งซื้อและรองรับรายการหลายระดับในเวลาเดียวกัน |
✅ โค้ดไฮไลท์ | การเน้นคำของบล็อคโค้ด รองรับ 26 ภาษา และสไตล์การระบายสีนับร้อย |
✅มาร์กดาวน์ | แปลง Markdown เป็นเอกสารคำ |
✅ไฟล์แนบคำ | แทรกไฟล์แนบใน 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 template engine"
template.docx
รวมถึงเนื้อหา {{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" );
เปิดเอกสาร out_template.docx
ทุกอย่างเป็นไปตามที่คุณต้องการ
แท็กประกอบด้วยวงเล็บปีกกาสองตัว {{title}}
คือแท็ก {{?title}}
คือแท็กด้วย title
คือชื่อของแท็ก และ ?
ระบุประเภทของแท็ก ต่อไปเรามาดูกันว่ามีแท็กประเภทใดบ้าง
แท็กข้อความเป็นประเภทแท็กพื้นฐานที่สุดในเทมเพลต Word {{name}}
จะถูกแทนที่ด้วยค่าของ name
คีย์ในแบบจำลองข้อมูล หากไม่มีคีย์ แท็กจะถูกล้าง (โปรแกรมสามารถกำหนดค่าว่าจะเก็บแท็กไว้หรือส่งข้อยกเว้น)
รูปแบบของแท็กข้อความจะถูกนำไปใช้กับข้อความที่ถูกแทนที่ ดังที่แสดงในตัวอย่างต่อไปนี้
รหัส:
put ( "name" , "Mama" );
put ( "thing" , "chocolates" );
แม่แบบ:
{{name}} พูดเสมอว่าชีวิตก็เหมือนกับกล่องของ {{thing}}
เอาท์พุท:
แม่ พูดเสมอว่าชีวิตก็เหมือนกล่องช็อคโกแลต
แท็กรูปภาพขึ้นต้นด้วย @
เช่น {{@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}}
โดยจะแสดงผลเป็นตาราง Word ที่มี N แถวและ N คอลัมน์ ค่าของ N ขึ้นอยู่กับข้อมูลของแท็ก table
รหัส:
put ( "table" , Tables . of ( new String [][] {
new String [] { "Song name" , "Artist" }
}). border ( BorderStyle . DEFAULT ). create ());
แม่แบบ:
{{#table}}
เอาท์พุท:
ชื่อเพลง | ศิลปิน |
แท็กรายการสอดคล้องกับรายการสัญลักษณ์ของ 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
ส่วนประกอบด้วยสองแท็กก่อนและหลัง แท็กเริ่มต้นจะถูกระบุด้วย ?
และแท็กปิดท้ายจะถูกระบุโดย /
เช่น {{?section}}
เป็นแท็กเริ่มต้นของบล็อกส่วน {{/section} }
คือแท็กปิดท้าย และ section
คือชื่อของส่วนนี้
ส่วนต่างๆ มีประโยชน์มากเมื่อประมวลผลชุดองค์ประกอบเอกสาร องค์ประกอบเอกสาร (ข้อความ รูปภาพ ตาราง ฯลฯ) ที่อยู่ในส่วนสามารถแสดงผลเป็นศูนย์ หนึ่งหรือ 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
โมเดลข้อมูล:
{
"person" : { "name" : " Sayi " }
}
แม่แบบ:
{{?person}}
Hi {{name}}!
{{/person}}
เอาท์พุท:
Hi Sayi!
หากค่าของส่วนเป็นคอลเลกชันที่ไม่ว่างเปล่า องค์ประกอบเอกสารในส่วนนั้นจะ ถูกวนซ้ำหนึ่งครั้งหรือ N ครั้ง ขึ้นอยู่กับขนาดของคอลเลกชัน ซึ่งคล้ายกับไวยากรณ์ foreach
โมเดลข้อมูล:
{
"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}}
รหัส:
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 ());
เทมเพลตสองคำ:
main.docx:
Hello, World
{{+nested}}
sub.docx:
Address: {{addr}}
เอาท์พุท:
Hello, World
Address: Hangzhou,China
Address: Shanghai,China
中文档
สำหรับตัวอย่างเพิ่มเติมและซอร์สโค้ดของตัวอย่างทั้งหมด โปรดดูที่กรณีทดสอบ JUnit
คุณสามารถเข้าร่วมโครงการนี้ได้หลายวิธี ไม่จำกัดเพียงวิธีต่อไปนี้:
ดูคำถามที่พบบ่อย