دعنا نذهب إلى الموضوع ونقدم JasperReport أو IrePort أو Jasperstudio اليوم ، ثم اثنان من أدوات التصور الخاصة به.
ما هو JasperReport؟
هذا المنتج لديه بالفعل العديد من المستخدمين المحليين. إنه منتج أجنبي ، ويمكن القول أنه يستخدم على نطاق واسع في مجال إعداد التقارير Java.
عندما كنت على اتصال مع هذا التقرير لأول مرة ، أعجبتني كثيرًا. الشيء الأكثر أهمية هو أداة التصور الخاصة بها ، والتي جعلتني غير قادر حقًا على التوقف. يمكنني في الواقع تصميم تقارير Java عن طريق رسم الصور ببساطة. عند الحديث عن الرسم ، يمكننا استخدام الأدوات المرئية لتصميم قوالب التقارير بصريًا ، وتنسيقات الملفات التي يدعمها واسعة جدًا ، بما في ذلك Excel ، Word ، PDF ، HTML ، XML ، CSV ، إلخ.
ألا تبدو قوية جدًا؟ تم تصميمه في وقت واحد وإعادة استخدامه عدة مرات. بالطبع ، غالبًا ما يكون للأشياء القوية جانبان. واجهت هذا وعذبني لفترة طويلة. سأصفه بالتفصيل لاحقًا.
ثدي Jasperreport الكبير
قلت في وقت سابق أن JasperReport أو iReport أو Jasperstudio غير دقيق في الواقع. الأخ الثاني IREPORT والشقيق الثالث JASPERSTUDIO هما في الواقع أدوات التصميم المرئي Jasper. يمكنك تصميم تقارير Jasper دون استخدامها ، وكتابة المزيد من البيض XML. قبل 5.5 ، كانت هذه الأداة تسمى iReport. بعد 5.5 ، مع ولادة أخي الثالث Jasperstudio ، تم استبدال iReport بالكامل. في الواقع ، هاتان الأداة هما نفس الشيء ، مواطنو واحد للطفل.
سير عمل محدد:
①first ، سيحصل Jasper على ملف XML لمعلومات التنسيق التي يجب إخراجها ، ثم تجميع ملف نوع .jasper من ملف XML. ثم يمكن تحميل ملف Jasper هذا في تطبيقنا لإنشاء التقرير النهائي. هل لديك شعور مألوف جدا؟ نعم ، هذا يشبه إلى حد كبير جافا ويجب تجميعه.
تعرض الصورة التالية واجهة تشغيل IREPORT. إنه مشابه لـ Jasperstudio ، لذلك لن نشره. يمكنك تنزيله على Baidu بنفسك.
اسمحوا لي أن أقدم باختصار كل نوع من الفرقة في الصورة أعلاه.
(1) نطاق العنوان: يتم عرض قطاع العنوان فقط في الجزء العلوي من الصفحة الأولى من التقرير بأكمله. باستثناء الصفحة الأولى ، بغض النظر عن عدد الصفحات الموجودة في التقرير ، فلن يظهر المحتوى الموجود في نطاق العنوان.
(2) BACEHEDER BAND: كما يوحي الاسم ، سيظهر المحتوى الموجود في شريحة PageHeader في كل صفحة في التقرير بأكمله ، وسيتم عرضه في الجزء العلوي من الصفحة. إذا كانت هذه هي الصفحة الأولى من التقرير ، فسيتم عرض المحتوى الموجود في PageHeader تحت نطاق العنوان. في جميع الصفحات الأخرى باستثناء الصفحة الأولى ، سيتم عرض المحتوى الموجود في PageHeader في الجزء العلوي من الصفحة.
(3) شريط PageFooter: معروض في الطرف السفلي من الصفحة.
(4) LastPageFooter Band: يتم عرضه في أسفل الصفحة الأخيرة.
(5) نطاق التفاصيل: قطاع الإبلاغ عن محتوى الإبلاغ ، المحتوى الذي يجب تكراره في تقرير التصميم في هذا النطاق ، وسيظهر المحتوى في قطاع التفاصيل في كل صفحة.
(6) شريط Columnheader: بالنسبة إلى الجزء الرئيسي من نطاق التفاصيل ، بشكل عام في هذا الجزء ، يتم رسم رأس التقرير.
(7) Bandfooter Band: لنهاية جدول نطاق التفاصيل.
(8) النطاق الموجز: يظهر الجزء الكلي من الجدول بعد نطاق التفاصيل في الصفحة الأخيرة من التقرير بأكمله. يتم استخدامه عمومًا لحساب القيمة الإجمالية لحقول أو عدة حقول في التقرير.
ما سبق هو كل أدوات التصور. في الواقع ، إنه بسيط للغاية للاستخدام. يمكنك العثور عليه من خلال استكشافه. نظرًا لأنه سجل حقيقي للحفرة ، فهذا ليس هو النقطة بشكل طبيعي ، لذلك لن أتحدث عنها.
التطبيقات في الكود
هذه هي الخطوات التي ملخصتها. ربما الوصف ليس دقيقًا جدًا. من فضلك افعل ذلك.
templates تصميم ، إنشاء ملفات jrxml ، ↑↑ ↑↑ يقوم أداة التصور أعلاه بتصميم أنماط القالب التي تحتاجها
② قوالب ترجمة ، يتم تجميع JRXML في ملفات Jasper ، تمامًا مثل ملفات .java و .class في Java ، يحتاج البرنامج إلى تشغيل الملف الثنائي لـ *.jasper.
في الواقع ، يمكن تجميع هذه الخطوة مباشرة باستخدام iReport لتوليد .jasper ، وبالطبع يمكن أيضًا تجميعها من خلال برنامج Jasper في وقت التشغيل. ومع ذلك ، يوصى بأنه إذا تم تجميعه في البرنامج ، فإن إصدار Jasper هو الأفضل مع إصدار iReport أو Jasperstudio.
③ Execute Report (يتم ملء البيانات في تقرير)
1. تحميل القالب لإنشاء كائن JasperReport
2. استخدم JasperfillManager لإنشاء كائن Jasperprint
④ -finally ، استخدم jrxlsxexporter لتصدير التقرير أو عرضه
قوالب التحميل
نظرًا لأننا قد أنشأنا ملفات .jasper أو .jrxml باستخدام أدوات التصور ، نحتاج بطبيعة الحال إلى السماح للبرنامج بتحميله.
رمز محمّل ، إرجاع كائن Jasperport
if (urlPath.endswith (". JasperReport = jaspercompileManager.compilereport (IS) ؛ } catch (ioException e) {رمي baseexception جديد ("تحميل jasper error" ، e) ؛ } catch (jrexception e) {رمي baseexception جديد ("تحويل قالب JRXML إلى خطأ ملف Jasper" ، e) ؛ } catch (throwable e) {رمي baseexception جديد ("تحويل قالب JRXML إلى خطأ ملف jasper" ، e) ؛ } catch (throwable e) {log.error (e) ؛ رمي baseexception جديد (e.getMessage ()) ؛ }} آخر إذا (urlpath.endswith (". jasper")) {try {inputStream is = url.openstream () ؛ jasperreport = (jasperReport) jRovinger.LoadObject (IS) ؛ } catch (ioException e) {رمي baseexception جديد ("تحميل jasper error" ، e) ؛ } catch (jrexception e) {throw new baseexception ("خطأ ملف قالب JRXML" ، e) ؛ } catch (throwable e) {log.error (e) ؛ رمي baseexception جديد (e.getMessage ()) ؛ }} آخر {رمي baseexception جديد ("ملف غير صالح!") ؛ }احصل على مصدر البيانات في التقرير
هنا أستخدم Javabean للحصول عليها
jrdatasource dataSource = null ؛ if (fieldvalues! = null && fieldvalues.size ()> 0) {datasource = new jrbeancollectionDataSource (fieldvalues) ؛ } else {dataSource = new jRemptyDataSource () ؛ } FieldValues هي مجموعة Pojos التي تم الحصول عليها في قاعدة البيانات.
أداء التقرير ملء
احصل على كائن Jasperprint
MAP <String ، Object> parametervalue = new hashmap <string ، Object> () ؛ JasperPrint = jasperfillmanager.fillReport (jasperreport ، parametervalue ، dataSource) ؛
أخيرًا ، نستخدم JRXLSxexporter لتصدير التقرير
هذا هو أيضًا المكان الذي تتطلب فيه معظم معلمات التكوين
BAOS = جديد bytearrayoutputStream () ؛ المصدر = new jrxlsxexporter () ؛ exporter.setParameter (jrexporterparameter.jasper_print ، jasperprint) ؛ Exporter.SetParameter (jrexporterParameter.output_stream ، BAOS) ؛
Exporter.ExporTreport () ؛
أكملت ، تمت كتابة البيانات في دفق الإخراج. أنت تقرر كيفية إخراجها بنفسك ، هل هي أكثر وجيزة من طرق مقدمة الكود الأخرى.
في الواقع ، لدى JasperReport ميزة لا تضاهى في كتابة الكود ، وتم تعبئة واجهات برمجة التطبيقات المختلفة. ولكن قد يكون تشاتشا قد فعلت الكثير وهناك العديد من المشاكل.
مشكلة Jasperreport
1. المساحة الفارغة قبل صفين
إذا كنت تستخدم الكود أعلاه لتصدير Excel ، فستجد أن خلفية Excel بيضاء ، دون شبكات Excel الصغيرة. وذلك لأن الخلفية الافتراضية لجاسبر بيضاء ، لذلك من الأسهل أن تكون متوافقة عند تصدير التنسيقات الأخرى. بالطبع ، ليس من الضروري تصدير التفوق. فقط أضف الخطين التاليين لحلها.
// قم بإزالة المصدر الفارغ. exporter.setparameter (jrxlsexporterParameter.is_remove_empty_between_columns ، boolean.true) ؛ // قم بتعيين لون الخلفية لجدول Excel إلى المصدر الأبيض الافتراضي.
2. حجم البيانات كبير ، يتم كتابة العنوان عدة مرات
إذا كان لديك الكثير من بيانات الورقة ، فقد تواجه الموقف الذي تتم طباعة رأس الجدول عدة مرات. في هذه الحالة ، تحتاج إلى إضافة إعداد الارتفاع.
Field pageHeight = jrbasereport.class.getDeclaredField ("pageheight") ؛ pageheight.setAccible (true) ؛ pageheight.setint (jasperreport ، integer.max_value) ؛3. مشكلة نوع الخلية
في بعض الأحيان ، يجب حساب تقرير Excel الذي نقوم بتصديره باستخدام وظائف Excel. إذا كانت جميعهم في تنسيقات نصية ، فلا يمكننا حسابها بطبيعة الحال. في هذه الحالة ، نحتاج إلى استخدام
.
تذكر ، عند تصميم تقرير ، حدد النوع الصحيح لحقل الحقل.
4. مشكلة الأوراق المتعددة
المثال البسيط أعلاه هو مجرد ملف يحتوي على صفحة ورقة. ماذا لو كان متطلباتنا هو تصدير أوراق متعددة في ملف واحد؟ لا تقلق ، لقد فكر هذا Japser بالفعل بالنسبة لنا.
فقط قم بتغيير خطوات التصدير أعلاه إلى ما يلي
baos = جديد bytearrayoutputstream () ؛ مصدري = جديد jrxlsxexporter () ؛ exporter.setParameter (jrexporterparameter.jasper_print_list ، listjasperprint) ؛ exporter.setParameter (jrexporterparameter.utput_stream ، baos) ؛ exporter.setParameter (jrxlsexporterParameter.is_one_page_per_sheet ، boolean.true) ؛
jrexporterparameter.jasper_print_list ، تمرير في مجموعة من listjasperprints ، كل jasperprint هي صفحة ورقة.
5. لا يوجد خطأ تم الإبلاغ عنه في بدء التشغيل Linux ، ولكن لا يمكن تصدير التقرير
في الواقع ، أزعجتني هذه المشكلة لفترة طويلة. في وقت لاحق ، بمساعدة الرئيس ، تذكرت المشكلة ، لأنها لم ترمي استثناءً على الإطلاق ، ولكن خطأ. رأيت أن بعض زملاء الدراسة طرحوا هذا السؤال عبر الإنترنت ، لذلك قمت بنشره.
يمكنك استخدام رمي لالتقاط رسالة الخطأ والحصول على رسالة الخطأ: java.lang.internalerror: لا يمكن الاتصال بخادم نافذة X11 باستخدام ": 0.0"
الحل: تعديل tomcat/bin/catalina.sh وأضف java_opts = "$ java_opts -djava.awt.headless = true"
6. تفوق ذاكرة البيانات الكبيرة وتسرب الذاكرة! !
أحتاج إلى التحدث عن الفرق بين إصدارات Excel 03 و 07. أتذكر أن إصدار 03 يدعم فقط 65532 سطرًا ، ولكن بعد إصدار 07 ، أصبح أكبر بكثير. لقد نسيت الرقم المحدد ، فهو ليس نفس ترتيب الحجم على أي حال.
يدعم JRXLSXExporter تصدير ملفات XLSX.
JRXLSexporter هو ملف XLS ، وهو أمر سهل التعرف عليه. الأدوات المصدرة هي نفسها تلك الموجودة في Excel.
ثم هناك مشكلات في تدفق الذاكرة وتسرب الذاكرة. أعتقد أن الأصدقاء الذين يلعبون جافا واجهوا هذا بشكل أساسي.
الحل الأكثر شيوعًا لتخفيض الذاكرة هو زيادة حجم ذاكرة الحاوية وزيادة حجم ذاكرة tomcat. يمكنك استخدام Baidu ، وهناك العديد من الطرق ، لذلك لن تقوم بإعادة تشكيل العجلة.
فيما يلي تذكير بأنه إذا كنت تستخدم Tomcat ، فإن طرق تكوين تثبيت Windows وإزالة الضغط و Linux مختلفة ، لذا يرجى الانتباه.
ما أحتاج إلى تقديمه هنا هو طريقة JasperReport. في الواقع ، لدى JasperReport حل للبيانات الضخمة. تم إطلاقه في إصدار مبكر جدًا ، محاكي JrfileVirtualizer.
ما هو هذا الشيء المستخدم؟ في الواقع ، سوف يكتب البيانات إلى ملف مؤقت على القرص الثابت وفقًا للمعلمات التي تحددها ، والتي تحل مشكلة استخدام الذاكرة المفرطة والتدفق عند ملء التقارير.
حاليًا ، لدى JasperReport 3 محاكيات ، يتم استخدامها جميعًا لحل هذه المشكلة.
هم:
①jrfilevirtualizer
②jrswapfilevirtualizer
jrgzipvirtualizer
ما هو الفرق بين هذه المحاكيات الثلاثة؟
أولاً ، أطلقت أقرب JrfileVirtualizer. عندما كنت أختبر ، عندما قمت بتصدير حوالي 30 واط من البيانات ، فإن ذلك سيبلغ عن تدفق الذاكرة. في وقت لاحق ، بعد إضافة هذا ، يمكنني تصديره بشكل طبيعي. سيقوم هذا المحاكي بإنشاء ملف مؤقت لكل كائن وتخزينه على القرص الثابت لحل مشكلة استخدام الذاكرة. ومع ذلك ، نظرًا لوجود العديد من الملفات المؤقتة التي تم إنشاؤها ، يتم زيادة استهلاك الذاكرة لإنشاء الملفات وحذفها بشكل غير مرئي ، لذلك لا ينصح به للغاية.
// اكتب ملفات متعددة jrfilevirtualizer virtualizer = new jrfilevirtualizer (2 ، catchPath) ؛ خريطة <string ، object> parametervalue = new hashmap <string ، object> () ؛ parametervalue.put (jrparameter.report_virtualizer ، Virtualizer) ؛
Virtualizer.setReadOnly (true) ؛
CatchPath هو مسار ذاكرة التخزين المؤقت للملف ويجب أن يكون موجودًا ، وإلا سيتم الإبلاغ عن خطأ.
ثم هناك jrswapfilevirtualizer ، الذي تم إطلاقه لحل مشكلة jrfilevirtualizer. سيقوم هذا المحاكي بإنشاء ملف مؤقت فقط ، وسيتم حساب كل كائن لجزء من هذا الملف ، وبالتالي يتم تقليل استهلاك الذاكرة لإنشاء الملفات وحذفها. في الواقع ، هذا لا ينصح بشكل خاص.
// اكتب ملفًا واحدًا rswapfile arquivoswap = new jrswapfile (catchpath ، 4096 ، 25) ؛ jrabstractlruvirtualizer virtualizer = new jrswapfilevirtualizer (2 ، arquivoswap ، true) ؛ خريطة <string ، object> parametervalue = new hashmap <string ، object> () ؛ parametervalue.put (jrparameter.report_virtualizer ، Virtualizer) ؛
Virtualizer.setReadOnly (true) ؛
أخيرًا ، هناك jrgzipvirtualizer. عندما ترى GZIP ، فأنت لا تعرف ما إذا كان لديك أي اتصال بكلمة ضغط. هذا صحيح ، يستخدم هذا المحاكي خوارزمية ضغط خاصة يمكن أن تضغط بصمة الذاكرة إلى واحد على مدار العشرين أو واحد ، وهو أمر مدهش.
jRabStractlRuvIruvuleBizer Virtualizer = new jrgzipvirtualizer (2) ؛ خريطة <string ، object> parametervalue = new hashmap <string ، object> () ؛ parametervalue.put (jrparameter.report_virtualizer ، virtualizer) ؛ مصدر البيانات) ؛
بعد قوله كثيرًا ، باختصار ، هناك ثلاثة أنواع من المحاكيات لحل مشكلة تدفق الذاكرة. لقد قرأت أيضًا العديد من المدونات التي تستخدم JRFileVirtualizer لحل مشكلة البيانات الكبيرة في الذاكرة. ثم أود أن أقول هنا أنني أوصي بأقل من ذلك استخدام محاكي JRFileVirtualizer لأنه لا يستهلك الكثير من الملفات فقط ، ولكن لديه أيضًا خطأ خطير للغاية وتسرب للذاكرة! ! ! هناك أيضا jrswapfilevirtualizer التي لديها هذه المشكلة.
بالإضافة إلى ذلك ، تجدر الإشارة إلى أنه بدون استخدام المحاكي ، ستكون هناك مشاكل في تسرب الذاكرة. عندما تقوم بتصدير التقرير ، قم بتفريغ معلومات المكدس وتجد أن هناك العديد من حالات Net.sf.jasperreports.engine.fill.jrtemplatePrinttext ، والتي لا يمكن إعادة تدويرها ولا يمكن إعادة تدويرها! ! ! ولا تزال هذه المشكلة موجودة في أحدث إصدار من JapserReport 6.x. هناك العديد من هذه المشكلات في مجتمع Jasper ومكدس الفائض ، ولكن لا يوجد حل.
هنا نوصي Jrgzipvirtualizer المحاكي. على الرغم من أنه لا تزال هناك مشاكل في التسرب ، نظرًا لخوارزمية الضغط الفريدة ، تم التحكم في مشكلة تسرب الذاكرة إلى نطاق صغير جدًا. يعتبر حلاً لتخفيف استخدام الذاكرة المسرب بحوالي 90 ٪.
بشكل عام ، لقد تخليت عن هذه الخطة الآن ، وكتبتها حتى يتجنب إخواني التحويلات لاحقًا. بعد الحصول على فئة أداة POI ، سأستعد بعد ذلك لتغيير جميع التقارير إلى أساليب تصدير POI. الحديث عن ، حل POI Big Data جيد جدًا.