ไปที่หัวข้อและแนะนำ Jasperreport, Ireport หรือ Jasperstudio ของวันนี้แล้วสองเป็นเครื่องมือสร้างภาพข้อมูล
JasperReport คืออะไร?
ผลิตภัณฑ์นี้มีผู้ใช้ในประเทศจำนวนมาก มันเป็นผลิตภัณฑ์จากต่างประเทศและอาจกล่าวได้ว่ามีการใช้กันอย่างแพร่หลายในสาขาการรายงาน Java
เมื่อฉันติดต่อกับรายงานนี้ครั้งแรกฉันชอบมันมาก สิ่งที่สำคัญที่สุดคือเครื่องมือสร้างภาพซึ่งทำให้ฉันไม่สามารถหยุดได้ จริง ๆ แล้วฉันสามารถออกแบบรายงาน Java โดยเพียงแค่วาดรูปภาพ เมื่อพูดถึงการวาดภาพเราสามารถใช้เครื่องมือภาพเพื่อออกแบบแม่แบบรายงานด้วยสายตาและรูปแบบไฟล์ที่รองรับนั้นกว้างมากรวมถึง Excel, Word, PDF, HTML, XML, CSV ฯลฯ
มันดูไม่ทรงพลังมากเหรอ? มันได้รับการออกแบบในครั้งเดียวและนำกลับมาใช้ใหม่หลายครั้ง แน่นอนสิ่งที่ทรงพลังมักจะมีสองด้าน ฉันพบสิ่งนี้และทรมานฉันเป็นเวลานาน ฉันจะอธิบายรายละเอียดในภายหลัง
หน้าอกใหญ่ของ Jasperreport
ฉันได้กล่าวก่อนหน้านี้ว่า JasperReport หรือ iReport หรือ Jasperstudio นั้นไม่ถูกต้องจริง ๆ Ireport พี่ชายคนที่สองและ Jasperstudio น้องชายคนที่สามเป็นเครื่องมือออกแบบภาพเสริมของแจสเปอร์ คุณสามารถออกแบบรายงาน Jasper โดยไม่ต้องใช้งานและเขียน XML Whites เพิ่มเติม ก่อน 5.5 เครื่องมือนี้เรียกว่า iReport หลังจาก 5.5 ด้วยการกำเนิดของ Jasperstudio พี่ชายคนที่สามของฉัน Ireport ถูกแทนที่อย่างสมบูรณ์ ในความเป็นจริงเครื่องมือทั้งสองนี้เป็นเพื่อนร่วมชาติที่เหมือนกันหนึ่งลูก
เวิร์กโฟลว์เฉพาะ:
①FIRST JASPER จะได้รับไฟล์ XML ของข้อมูลรูปแบบที่จำเป็นต้องส่งออกจากนั้นรวบรวมไฟล์ประเภท. JASPER จากไฟล์ XML จากนั้นไฟล์ Jasper นี้สามารถโหลดได้ในแอปพลิเคชันของเราเพื่อสร้างรายงานขั้นสุดท้าย คุณมีความรู้สึกคุ้นเคยมากหรือไม่? ใช่สิ่งนี้คล้ายกับ Java มากและต้องรวบรวม
ภาพต่อไปนี้แสดงอินเทอร์เฟซการทำงานของ IREPORT มันคล้ายกับ Jasperstudio ดังนั้นฉันจะไม่โพสต์ คุณสามารถดาวน์โหลดได้บน Baidu ด้วยตัวเอง
ให้ฉันแนะนำวงดนตรีแต่ละประเภทสั้น ๆ ในภาพด้านบน
(1) ชื่อวงดนตรี: เซ็กเมนต์ชื่อจะแสดงเฉพาะในส่วนบนของหน้าแรกของรายงานทั้งหมด ยกเว้นหน้าแรกไม่ว่าจะมีกี่หน้าในรายงานเนื้อหาในวงชื่อจะไม่ปรากฏอีกต่อไป
(2) วงหัวหน้า: ตามชื่อแนะนำเนื้อหาในเซ็กเมนต์หน้าหน้าจะปรากฏในทุกหน้าในรายงานทั้งหมดและจะปรากฏที่ด้านบนของหน้า หากเป็นหน้าแรกของรายงานเนื้อหาในหน้าเว็บจะแสดงภายใต้ชื่อวง ในหน้าอื่น ๆ ทั้งหมดยกเว้นหน้าแรกเนื้อหาในหน้าเว็บจะแสดงที่ด้านบนของหน้า
(3) Band PageFooter: แสดงที่ด้านล่างสุดของหน้า
(4) LastPageFooter Band: แสดงที่ด้านล่างของหน้าสุดท้าย
(5) Band Detail: รายงานส่วนเนื้อหาเนื้อหาที่ต้องทำซ้ำในรายงานการออกแบบในวงนี้และเนื้อหาในเซ็กเมนต์รายละเอียดจะปรากฏในทุกหน้า
(6) วงดนตรีคอลัมน์: สำหรับส่วนส่วนหัวของแถบรายละเอียดโดยทั่วไปในส่วนนี้ส่วนหัวของรายงานจะถูกวาด
(7) Band ColumnFooter: สำหรับส่วนท้ายของตารางของแถบรายละเอียด
(8) วงสรุป: ส่วนรวมของตารางจะปรากฏขึ้นหลังจากแถบรายละเอียดในหน้าสุดท้ายของรายงานทั้งหมด โดยทั่วไปจะใช้เพื่อนับมูลค่ารวมของหนึ่งหรือหลายฟิลด์ในรายงาน
ข้างต้นเป็นเครื่องมือการสร้างภาพทั้งหมด ในความเป็นจริงมันใช้งานง่ายมาก คุณสามารถค้นหาได้โดยการสำรวจ เนื่องจากมันเป็นบันทึกที่แท้จริงของหลุมนี่ไม่ใช่ประเด็นดังนั้นฉันจึงไม่พูดถึงมัน
แอปพลิเคชันในรหัส
นี่คือขั้นตอนที่ฉันได้สรุป บางทีคำอธิบายอาจไม่แม่นยำมาก กรุณาทำ
①design Templates สร้างไฟล์ JRXML, เครื่องมือสร้างภาพข้อมูลด้านบนออกแบบสไตล์เทมเพลตที่คุณต้องการ
②คอมไพล์เทมเพลต, JRXML ถูกรวบรวมเป็นไฟล์ Jasper เช่น. Java และ. class ใน Java โปรแกรมจำเป็นต้องเรียกใช้ไฟล์ไบนารีของ *.jasper
ในความเป็นจริงขั้นตอนนี้สามารถรวบรวมโดยตรงกับ IREPORT เพื่อสร้าง. JASPER และแน่นอนว่ามันยังสามารถรวบรวมผ่านโปรแกรม Jasper ที่รันไทม์ อย่างไรก็ตามขอแนะนำว่าหากรวบรวมในโปรแกรมเวอร์ชัน Jasper นั้นสอดคล้องกับเวอร์ชัน iReport หรือ Jasperstudio ที่ดีที่สุด
③ Execute Report (ข้อมูลถูกกรอกลงในรายงาน)
1. โหลดเทมเพลตเพื่อสร้างวัตถุ JasperReport
2. ใช้ jasperfillmanager เพื่อสร้างวัตถุ Jasperprint
④สุดท้ายใช้ JRXLSXExporter เพื่อส่งออกรายงานหรือแสดง
เทมเพลตการโหลด
เนื่องจากเราได้สร้างไฟล์. jasper หรือ. jrxml โดยใช้เครื่องมือสร้างภาพเราจึงต้องปล่อยให้โปรแกรมโหลด
โหลดรหัสส่งคืนวัตถุ Jasperport
if (urlpath.endswith (". jrxml")) {// รวบรวม jrxml ถึง jasper ลอง {inputstream คือ = url.openstream (); JasperReport = JasperCompileManager.Compilereport (IS); } catch (ioexception e) {โยน baseException ใหม่ ("โหลดข้อผิดพลาด Jasper", 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")) {ลอง {inputstream คือ = url.openstream (); jasperReport = (jasperreport) jrloader.loadObject (IS); } catch (ioexception e) {โยน baseException ใหม่ ("โหลดข้อผิดพลาด Jasper", e); } catch (jrexception e) {โยน baseexception ใหม่ ("ข้อผิดพลาดไฟล์เทมเพลต JRXML", e); } catch (throwable e) {log.error (e); โยน baseexception ใหม่ (e.getMessage ()); }} else {โยน baseexception ใหม่ ("ไฟล์ไม่ถูกต้อง!"); -รับแหล่งข้อมูลในรายงาน
ที่นี่ฉันใช้ Javabean เพื่อรับมัน
JrDataSource DataSource = null; if (fieldValues! = null && fieldValues.size ()> 0) {dataSource = ใหม่ jrbeanCollectionDataSource (FieldValues); } else {dataSource = ใหม่ jremptyDataSource (); - FieldValues เป็นคอลเลกชันของ pojos ที่ได้รับในฐานข้อมูล
ดำเนินการกรอกรายงาน
รับวัตถุ Jasperprint
แผนที่ <string, Object> parameterValue = new hashmap <string, object> (); jasperprint = jasperfillmanager.fillreport (JasperReport, parameterValue, DataSource);
ในที่สุดเราใช้ JRXLSxExporter เพื่อส่งออกรายงาน
นี่คือสถานที่ที่จำเป็นต้องใช้พารามิเตอร์การกำหนดค่ามากที่สุด
BAOS = ใหม่ byteArrayOutputStream (); ผู้ส่งออก = ใหม่ JRXLSXEXPORTER (); Exporter.SetParameter (jrexporterparameter.jasper_print, Jasperprint); Exporter.SetParameter (jrexporterparameter.output_stream, baos);
Exporter.ExportReport ();
เสร็จสิ้นข้อมูลได้ถูกเขียนลงในสตรีมเอาต์พุต คุณตัดสินใจว่าจะส่งออกด้วยตัวเองอย่างไรมันสั้นกว่าวิธีการแนะนำรหัสอื่น ๆ
อันที่จริง JasperReport มีข้อได้เปรียบที่หาที่เปรียบมิได้ในการเขียนโค้ดและ API ต่างๆได้รับการบรรจุ แต่อาจเป็นไปได้ว่า Chacha ทำมากเกินไปและมีปัญหามากมาย
ปัญหาของ Jasperreport
1. พื้นที่ว่างก่อนสองแถว
หากคุณใช้รหัสด้านบนเพื่อส่งออก Excel คุณจะพบว่าพื้นหลังของ Excel เป็นสีขาวโดยไม่มีกริดขนาดเล็กของ Excel นี่เป็นเพราะพื้นหลังเริ่มต้นของแจสเปอร์เป็นสีขาวดังนั้นจึงง่ายกว่าที่จะเข้ากันได้เมื่อส่งออกรูปแบบอื่น ๆ แน่นอนไม่จำเป็นต้องส่งออก Excel เพียงเพิ่มสองบรรทัดต่อไปนี้เพื่อแก้ปัญหา
// ลบผู้ส่งออกว่างเปล่า SetParameter ก่อนสองบรรทัด (jrxlsexporterparameter.is_remove_empty_space_between_rows, boolean.true); Exporter.SetParameter (jrxlsexporterparameter.is_remove_empty_space_between_columns, boolean.true); // ตั้งค่าสีพื้นหลังของตาราง Excel เป็นผู้ส่งออกสีขาวเริ่มต้น SetSetParameter (JRXLSEXPORTERPARAMETER.IS_WHITE_PAGE_BACKGRUNG, BOOLEAN.FALSE);
2. ปริมาณข้อมูลมีขนาดใหญ่ชื่อจะถูกเขียนหลายครั้ง
หากคุณมีข้อมูลแผ่นจำนวนมากคุณอาจพบสถานการณ์ที่ส่วนหัวของตารางถูกพิมพ์หลายครั้ง ในกรณีนี้คุณต้องเพิ่มการตั้งค่าความสูง
Field PageHeight = jrbasereport.class.getDeclaredField ("PageHeight"); pageHeight.setAccessible (จริง); pageHeight.setint (JasperReport, Integer.max_value);3. ปัญหาประเภทเซลล์
บางครั้งรายงาน Excel ที่เราส่งออกจะต้องคำนวณโดยใช้ฟังก์ชั่น Excel หากพวกเขาทั้งหมดอยู่ในรูปแบบข้อความเราไม่สามารถคำนวณได้โดยธรรมชาติ ในกรณีนี้เราต้องใช้
// เลือก Format Exporter.SetParameter โดยอัตโนมัติ (JRXLSEXPORTERPARAMETER.IS_DETECT_CELL_TYPE, BOOLEAN.TRUE);
โปรดจำไว้ว่าเมื่อออกแบบรายงานเลือกประเภทที่ถูกต้องของฟิลด์ฟิลด์
4. ปัญหาของหลายแผ่น
ตัวอย่างง่ายๆด้านบนเป็นเพียงไฟล์ที่มีหน้าแผ่น ถ้าข้อกำหนดของเราคือการส่งออกหลายแผ่นในไฟล์เดียว ไม่ต้องกังวล Japser คนนี้ได้คิดถึงมันแล้วสำหรับเรา
เพียงเปลี่ยนขั้นตอนการส่งออกด้านบนเป็นต่อไปนี้
BAOS = ใหม่ byteArrayOutputStream (); exporter = ใหม่ jrxlsxexporter (); exporter.setParameter (jrexporterparameter.jasper_print_list, listjasperprint); exporter.setparameter Sheet Exporter.SetParameter (JRXLSEXPORTERPARAMETER.IS_ONE_PAGE_PER_SHEET, BOOLEAN.TRUE);
jrexporterparameter.jasper_print_list ผ่านในคอลเลกชันของ listjasperprints แต่ละ Jasperprint เป็นหน้าแผ่น
5. ไม่มีการรายงานข้อผิดพลาดใน Linux Startup แต่รายงานไม่สามารถส่งออกได้
ในความเป็นจริงปัญหานี้รบกวนฉันมานานแล้ว ต่อมาด้วยความช่วยเหลือของเจ้านายฉันจำปัญหาได้เพราะมันไม่ได้มีข้อยกเว้นเลย แต่เป็นข้อผิดพลาด ฉันเห็นว่าเพื่อนร่วมชั้นบางคนถามคำถามนี้ทางออนไลน์ดังนั้นฉันจึงโพสต์
คุณสามารถใช้ throwable เพื่อจับข้อความแสดงข้อผิดพลาดและรับข้อความแสดงข้อผิดพลาด: 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
จากนั้นมีหน่วยความจำล้นและปัญหาการรั่วไหลของหน่วยความจำ ฉันเชื่อว่าเพื่อนที่เล่น Java ได้พบกับสิ่งนี้โดยทั่วไป
ทางออกที่พบบ่อยที่สุดในหน่วยความจำล้นคือการเพิ่มขนาดหน่วยความจำของคอนเทนเนอร์และเพิ่มขนาดหน่วยความจำของ Tomcat คุณสามารถใช้ Baidu มีหลายวิธีดังนั้นคุณจะไม่สร้างวงล้อใหม่
นี่คือการเตือนว่าหากคุณใช้ Tomcat วิธีการกำหนดค่าของการติดตั้ง Windows การบีบอัดและ Linux นั้นแตกต่างกันดังนั้นโปรดให้ความสนใจ
สิ่งที่ฉันต้องแนะนำที่นี่คือวิธี JasperReport ในความเป็นจริง JasperReport มีวิธีแก้ปัญหาขนาดใหญ่ มันเปิดตัวในรุ่นแรก ๆ Emulator of Jrfilevirtualizer
สิ่งนี้ใช้ทำเพื่ออะไร? ในความเป็นจริงมันจะเขียนข้อมูลไปยังไฟล์ชั่วคราวบนฮาร์ดดิสก์ตามพารามิเตอร์ที่คุณตั้งค่าซึ่งแก้ปัญหาการใช้หน่วยความจำที่มากเกินไปและล้นเมื่อกรอกรายงาน
ปัจจุบัน JasperReport มี 3 emulators ซึ่งทั้งหมดใช้เพื่อแก้ปัญหานี้
พวกเขาคือ:
①jrfilevirtualizer
②JrSwapFileVirtualizer
③jrgzipvirtualizer
อะไรคือความแตกต่างระหว่างอีมูเลเตอร์ทั้งสามนี้?
ก่อนอื่นฉันเปิดตัว JRFilevirtualizer ที่เร็วที่สุด เมื่อฉันทดสอบเมื่อฉันส่งออกข้อมูลประมาณ 30W มันจะรายงานหน่วยความจำล้น ต่อมาหลังจากเพิ่มสิ่งนี้ฉันสามารถส่งออกได้ตามปกติ ตัวจำลองนี้จะสร้างไฟล์ชั่วคราวสำหรับแต่ละวัตถุและเก็บไว้ในฮาร์ดดิสก์เพื่อแก้ปัญหาการใช้หน่วยความจำ อย่างไรก็ตามเนื่องจากมีไฟล์ชั่วคราวจำนวนมากที่สร้างขึ้นการใช้หน่วยความจำของการสร้างไฟล์และการลบจะเพิ่มขึ้นอย่างล้นหลามดังนั้นจึงไม่แนะนำมาก
// เขียนหลายไฟล์ jrfilevirtualizer virtualizer = ใหม่ jrfilevirtualizer (2, catchpath); แผนที่ <string, Object> parameterValue = new hashmap <string, object> (); parametervalue.put (jrparameter.report_virtualizer, virtualizer);
virtualizer.setReadonly (จริง);
CatchPath เป็นเส้นทางแคชไฟล์และต้องมีอยู่มิฉะนั้นจะมีการรายงานข้อผิดพลาด
จากนั้นก็มี JRSWAPFileVirtualizer ซึ่งเปิดตัวเพื่อแก้ปัญหา JRFilevirtualizer ตัวจำลองนี้จะสร้างไฟล์ชั่วคราวเท่านั้นและแต่ละวัตถุจะบัญชีสำหรับส่วนหนึ่งของไฟล์นี้ดังนั้นการใช้หน่วยความจำการสร้างไฟล์และการลบจะลดลง ในความเป็นจริงไม่แนะนำโดยเฉพาะอย่างยิ่ง
// เขียนไฟล์เดียว rswapfile arquivoswap = new jrswapfile (catchpath, 4096, 25); jrabstractlruvirtualizer virtualizer = JRSWAPFilevirtualizer ใหม่ (2, Arquivoswap, True); MAP <String, Object> ParamEterValue = new HashMap <String, Object> (); ParameterValue.put (JRParameter.Report_Virtualizer, Virtualizer);
virtualizer.setReadonly (จริง);
ในที่สุดก็มี jrgzipvirtualizer เมื่อคุณเห็น GZIP คุณไม่ทราบว่าคุณมีการเชื่อมต่อกับการบีบอัดคำหรือไม่ ถูกต้องแล้ว Emulator นี้ใช้อัลกอริทึมการบีบอัดพิเศษที่สามารถบีบอัดรอยเท้าหน่วยความจำเป็นหนึ่งยี่สิบหรือหนึ่ง-tween ซึ่งน่าทึ่งมาก
JRABSTRACTLRUVIRTUALIZER VIRTUALIZER = ใหม่ JRGZIPVIRTULIZER (2); แผนที่ <สตริง, วัตถุ> parameterValue = hashmap ใหม่ <String, Object> (); parameterValue.put (JRParameter.Report_Virtualizer, Virtualizer); แหล่งข้อมูล);
ต้องพูดมากในระยะสั้นมีอีมูเลเตอร์สามประเภทเพื่อแก้ปัญหาความทรงจำล้น ฉันได้อ่านบล็อกจำนวนมากที่ใช้ JrFilevirtualizer เพื่อแก้ปัญหาข้อมูลขนาดใหญ่ของหน่วยความจำ จากนั้นฉันอยากจะบอกว่าที่นี่ฉันแนะนำให้ใช้ jrfilevirtualizer emulator เพราะมันไม่เพียง แต่ใช้ไฟล์จำนวนมากในการสร้าง แต่ยังมีข้อผิดพลาดที่ร้ายแรงและการรั่วไหลของหน่วยความจำ! - - นอกจากนี้ยังมี JRSwapFilevirtualizer ที่มีปัญหานี้
นอกจากนี้ควรสังเกตว่าโดยไม่ต้องใช้อีมูเลเตอร์จะมีปัญหาการรั่วไหลของหน่วยความจำ เมื่อคุณส่งออกรายงานทิ้งข้อมูลสแต็กและพบว่ามีหลายกรณีของ net.sf.jasperreports.engine.fill.jrtemplateprinttext คลาสซึ่งไม่สามารถรีไซเคิลได้และไม่สามารถรีไซเคิลได้! - - และปัญหานี้ยังคงมีอยู่ในเวอร์ชันล่าสุดของ JapSerReport 6.x มีปัญหามากมายในชุมชนแจสเปอร์และสแต็กล้น แต่ไม่มีทางออก
ที่นี่เราขอแนะนำ jrgzipvirtualizer emulator แม้ว่าจะยังมีปัญหาการรั่วไหลเนื่องจากอัลกอริทึมการบีบอัดที่เป็นเอกลักษณ์ปัญหาการรั่วไหลของหน่วยความจำได้ถูกควบคุมในช่วงที่เล็กมาก ถือว่าเป็นวิธีแก้ปัญหาในการบรรเทาการใช้หน่วยความจำที่รั่วไหลออกมาประมาณ 90%
โดยทั่วไปฉันได้เลิกทำแผนนี้แล้วและฉันก็เขียนมันออกมาเพื่อให้พี่น้องของฉันจะหลีกเลี่ยงการหยุดในภายหลัง หลังจากได้รับคลาสเครื่องมือ POI ฉันจะเตรียมการเปลี่ยนรายงานทั้งหมดเป็นวิธีการส่งออก POI การพูดถึงเรื่องนี้โซลูชันข้อมูลขนาดใหญ่ของ POI นั้นค่อนข้างดี