طريقة أفضل لإنشاء كلمة (docx) باستخدام القالب، استنادًا إلى Apache POI.
يقوم FreeMarker أو Velocity بإنشاء صفحات html جديدة أو ملفات تكوين بناءً على قالب النص والبيانات. poi-tl هو محرك قالب Word يقوم بإنشاء مستندات جديدة بناءً على قالب Word وبياناته .
يحتوي قالب Word على أنماط غنية. سيحتفظ Poi-tl تمامًا بالأنماط الموجودة في القالب في المستندات التي تم إنشاؤها. يمكنك أيضًا تعيين أنماط للعلامات. سيتم تطبيق أنماط العلامات على النص المستبدل، حتى تتمكن من التركيز على تصميم القالب.
poi-tl هو محرك قوالب "بدون منطق" . لا توجد بنية تحكم معقدة وتعيين متغير، فقط العلامات ، ويمكن استبدال بعض العلامات بالنص والصور والجداول وما إلى ذلك، وبعض العلامات ستخفي بعض محتوى المستند، بينما ستؤدي العلامات الأخرى إلى تكرار سلسلة من محتوى المستند.
تجعل التركيبات "القوية" مثل التعيين المتغير أو البيانات الشرطية من السهل تعديل مظهر التطبيق داخل نظام القالب حصريًا... ومع ذلك، على حساب الانفصال، تحويل القوالب نفسها إلى جزء من منطق التطبيق.
《قالب جوجل CT》
يدعم poi-tl الوظائف المخصصة (المكونات الإضافية) ، ويمكن تنفيذ الوظائف في أي مكان في قالب Word، والقيام بأي شيء في أي مكان في المستند هو هدف poi-tl.
ميزة | وصف |
---|---|
✅ نص | قم بتقديم العلامة كنص |
✅ صورة | تقديم العلامة كصورة |
✅ طاولة | قم بعرض العلامة كجدول |
✅ الترقيم | قم بتقديم العلامة كرقم |
✅ الرسم البياني | مخطط شريطي (مخطط شريطي ثلاثي الأبعاد)، مخطط عمودي (مخطط عمودي ثلاثي الأبعاد)، مخطط مساحي (مخطط مساحي ثلاثي الأبعاد)، مخطط خطي (مخطط خطي ثلاثي الأبعاد)، مخطط راداري، مخطط دائري (شكل دائري ثلاثي الأبعاد) وعرض المخططات الأخرى |
✅ إذا كان الشرط | إخفاء أو عرض محتوى مستند معين (بما في ذلك النص والفقرات والصور والجداول والقوائم والمخططات وما إلى ذلك) وفقًا للشروط |
✅ حلقة Foreach | قم بالمراجعة عبر محتوى مستند معين (بما في ذلك النص والفقرات والصور والجداول والقوائم والمخططات وما إلى ذلك) وفقًا للمجموعة |
✅ حلقة صف الجدول | تكرار لنسخ صف من الجدول المعروض |
✅ عمود الجدول الحلقي | تكرار النسخ وتقديم عمود من الجدول |
✅ حلقة قائمة مرتبة | دعم حلقة القائمة المرتبة، ودعم القائمة متعددة المستويات في نفس الوقت |
✅ تسليط الضوء على الكود | تسليط الضوء على كتل التعليمات البرمجية للكلمات، ودعم 26 لغة ومئات من أنماط التلوين |
✅ تخفيض السعر | تحويل Markdown إلى مستند Word |
✅مرفق كلمة | أدخل المرفق في Word |
✅ تعليقات الكلمات | استكمال تعليق الدعم، وإنشاء تعليق، وتعديل التعليق، وما إلى ذلك. |
✅كلمة SDT | دعم كامل لعلامة الوثيقة المنظمة |
✅ مربع النص | دعم العلامة في مربع النص |
✅ استبدال الصورة | استبدال الصورة الأصلية بصورة أخرى |
✅ الإشارات المرجعية والمراسي والارتباطات التشعبية | دعم وضع الإشارات المرجعية والمثبتات والارتباطات التشعبية في المستندات |
✅ لغة التعبير | يدعم بشكل كامل تعبيرات SpringEL ويمكنه توسيع المزيد من التعبيرات: OGNL، MVEL... |
✅ الطراز | القالب هو النمط، ويمكن للكود أيضًا تعيين النمط |
✅ تداخل القالب | يحتوي القالب على قوالب فرعية، ثم تحتوي القوالب الفرعية على قوالب فرعية |
✅ دمج | دمج الكلمات دمج، يمكنك أيضًا الدمج في الموضع المحدد |
✅ وظائف مخصصة (المكونات الإضافية) | تصميم المكونات الإضافية وتنفيذ الوظيفة في أي مكان في المستند |
< dependency >
< groupId >com.deepoove</ groupId >
< artifactId >poi-tl</ artifactId >
< version >1.12.2</ version >
</ dependency >
ملاحظة: يتطلب poi-tl
1.12.x
إصدار POI5.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}} قال دائمًا أن الحياة مثل صندوق {{شيء}}.
الإخراج:
قالت ماما دائمًا أن الحياة مثل علبة الشوكولاتة.
تبدأ علامة الصورة بـ @
، على سبيل المثال، سيبحث {{@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، والذي يمكن فهمه على أنه استيراد أو تضمين أو دمج مستند 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}}
ملف فرعي:
Address: {{addr}}
الإخراج:
Hello, World
Address: Hangzhou,China
Address: Shanghai,China
中文文档
لمزيد من الأمثلة والكود المصدري لجميع الأمثلة، راجع حالات اختبار JUnit.
يمكنك الانضمام إلى هذا المشروع بعدة طرق، ولا يقتصر الأمر على الطرق التالية:
راجع الأسئلة الشائعة.