Mari kita pergi ke topik dan perkenalkan Jasperreport, Ireport atau Jasperstudio hari ini, dan kemudian dua adalah alat visualisasinya.
Apa itu Jasperreport?
Produk ini sebenarnya memiliki banyak pengguna domestik. Ini adalah produk asing, dan dapat dikatakan bahwa itu banyak digunakan di bidang pelaporan Java.
Ketika saya pertama kali melakukan kontak dengan laporan ini, saya sangat menyukainya. Yang paling penting adalah alat visualisasinya, yang benar -benar membuat saya tidak dapat berhenti. Saya sebenarnya bisa mendesain laporan Java hanya dengan menggambar gambar. Berbicara tentang menggambar, kita dapat menggunakan alat visual untuk merancang templat laporan secara visual, dan format file yang didukungnya sangat luas, termasuk Excel, Word, PDF, HTML, XML, CSV, dll.
Bukankah itu terlihat sangat kuat? Ini dirancang pada satu waktu dan digunakan kembali beberapa kali. Tentu saja, hal -hal yang kuat sering memiliki dua sisi. Saya menemukan ini dan menyiksa saya untuk waktu yang lama. Saya akan menjelaskannya secara rinci nanti.
Payudara besar Jasperreport
Saya mengatakan sebelumnya bahwa Jasperreport atau Ireport atau Jasperstudio sebenarnya tidak akurat. Saudara kedua Ireport dan saudara ketiga Jasperstudio sebenarnya adalah alat desain visual tambahan Jasper. Anda dapat merancang laporan Jasper tanpa menggunakannya, dan menulis lebih banyak putih XML. Sebelum 5.5, alat ini disebut Ireport. Setelah 5.5, dengan kelahiran kakak ketiga saya Jasperstudio, Ireport benar -benar diganti. Faktanya, kedua alat ini pada dasarnya sama, rekan senegaranya satu anak.
Alur kerja spesifik:
First, Jasper akan mendapatkan file XML dari informasi format yang perlu output, dan kemudian menyusun file tipe .Jasper dari file XML. Kemudian file jasper ini dapat dimuat dalam aplikasi kami untuk menghasilkan laporan akhir. Apakah Anda memiliki perasaan yang sangat akrab? Ya, ini sangat mirip dengan Java dan perlu dikompilasi.
Gambar berikut menunjukkan antarmuka operasi Ireport. Mirip dengan Jasperstudio, jadi saya tidak akan mempostingnya. Anda dapat mengunduhnya di Baidu sendiri.
Izinkan saya memperkenalkan setiap jenis band secara singkat pada gambar di atas.
(1) Judul Band: Segmen judul hanya ditampilkan di bagian atas halaman pertama dari seluruh laporan. Kecuali untuk halaman pertama, tidak peduli berapa banyak halaman yang ada dalam laporan, konten di band judul tidak akan lagi muncul.
(2) Band PageHeader: Seperti namanya, konten di segmen PageHeader akan muncul di setiap halaman di seluruh laporan, dan akan ditampilkan di bagian atas halaman. Jika itu adalah halaman pertama dari laporan, konten di halaman Halaman akan ditampilkan di bawah judul band. Di semua halaman lain kecuali halaman pertama, konten di halaman halaman akan ditampilkan di bagian atas halaman.
(3) Band pagefooter: ditampilkan di ujung bawah halaman.
(4) LastPagefooter Band: Ditampilkan di bagian bawah halaman terakhir.
(5) Band detail: Laporkan segmen konten, konten yang perlu diulang dalam laporan desain di band ini, dan konten di segmen detail akan muncul di setiap halaman.
(6) ColumnHeader Band: Untuk segmen header pita detail, umumnya di segmen ini, header laporan ditarik.
(7) Columnfooter Band: Untuk akhir tabel pita detail.
(8) Ringkasan Band: Segmen total tabel muncul setelah pita detail pada halaman terakhir dari seluruh laporan. Umumnya digunakan untuk menghitung nilai total satu atau beberapa bidang dalam laporan.
Di atas adalah semua alat visualisasi. Bahkan, sangat mudah digunakan. Anda dapat menemukannya dengan menjelajahinya. Karena ini adalah catatan nyata dari lubang, ini secara alami bukan intinya, jadi saya tidak akan membicarakannya.
Aplikasi dalam kode
Ini adalah langkah -langkah yang telah saya ringkas. Mungkin deskripsinya tidak terlalu akurat. Tolong lakukan itu.
① Template Desain, Hasilkan File JRXML, ↑↑ Alat visualisasi di atas merancang gaya template yang Anda butuhkan
② Kompilasi templat, JRXML dikompilasi ke dalam file Jasper, seperti file .java dan .class di java, program perlu menjalankan file biner *.jasper.
Faktanya, langkah ini dapat secara langsung dikompilasi dengan Ireport untuk menghasilkan .Jasper, dan tentu saja juga dapat dikompilasi melalui program Jasper saat runtime. Namun, disarankan bahwa jika dikompilasi dalam program ini, versi Jasper paling konsisten dengan versi Ireport atau Jasperstudio.
③Belas Laporan (Data diisi ke dalam laporan)
1. Muat templat untuk menghasilkan objek Jasperreport
2. Gunakan JasperfillManager untuk menghasilkan objek jasperprint
④ally, gunakan jrxlsxexporter untuk mengekspor laporan atau menampilkannya
Memuat template
Karena kami telah menghasilkan file .jasper atau .jrxml menggunakan alat visualisasi, kami secara alami perlu membiarkan program memuatnya.
Kode yang dimuat, kembalikan objek Jasperport
if (urlpath.endswith (". jrxml")) {// kompilasi jrxml ke jasper coba {inputStream is = url.openstream (); jasperreport = jaspercompileManager.compileReport (IS); } catch (ioException e) {lempar baseException baru ("Load Jasper error", e); } catch (JreException e) {lempar baseException baru ("Template JRXML Transformasi ke kesalahan file Jasper", e); } catch (Throwable e) {Throw Baseexception baru ("Template JRXML Transformasi ke kesalahan file Jasper", e); } catch (Throwable e) {log.error (e); melempar baseException baru (e.getMessage ()); }} lain jika (urlpath.endswith (". jasper")) {coba {inputStream is = url.openstream (); jasperreport = (jasperreport) jrloader.loadObject (IS); } catch (ioException e) {lempar baseException baru ("Load Jasper error", e); } catch (JRException e) {lempar Baseexception baru ("Kesalahan File Template JRXML", E); } catch (Throwable e) {log.error (e); melempar baseException baru (e.getMessage ()); }} else {lempar baseException baru ("File tidak valid!"); }Dapatkan sumber data dalam laporan
Di sini saya menggunakan JavaBean untuk mendapatkannya
JrdataSource dataSource = null; if (fieldValues! = null && fieldValues.size ()> 0) {DataSource = JRBeANCollectionDataSource baru (FieldValues); } else {DataSource = new jremplydataSource (); } FieldValues adalah kumpulan POJOS yang diperoleh dalam database.
Lakukan pengisian laporan
Dapatkan Objek Jasperprint
Peta <String, Object> ParameterValue = HashMap baru <String, Object> (); jasperprint = jasperfillManager.fillreport (jasperreport, parameterValue, dataSource);
Akhirnya, kami menggunakan JRXLSXExporter untuk mengekspor laporan
Ini juga merupakan tempat di mana parameter konfigurasi terbanyak diperlukan
Baos = new BytearRayOutputStream (); eksportir = jrxlsxexporter baru (); eksportir.setParameter (jrexporterparameter.jasper_print, jasperprint); eksportir.setParameter (jrexporterparameter.output_stream, baos);
eksportir.Exportreport ();
Selesai, data telah ditulis ke dalam aliran output. Anda memutuskan bagaimana mengeluarkannya sendiri, apakah jauh lebih singkat daripada metode pengantar kode lainnya.
Memang, Jasperreport memiliki keunggulan yang tak tertandingi dalam penulisan kode, dan berbagai API telah dikemas. Tapi mungkin Chacha telah melakukan terlalu banyak dan ada banyak masalah.
Masalah Jasperreport
1. Ruang kosong sebelum dua baris
Jika Anda menggunakan kode di atas untuk mengekspor Excel, Anda akan menemukan bahwa latar belakang Excel berwarna putih, tanpa kisi -kisi kecil Excel. Ini karena latar belakang default Jasper berwarna putih, sehingga lebih mudah untuk menjadi kompatibel saat mengekspor format lain. Tentu saja, tidak perlu mengekspor Excel. Cukup tambahkan dua baris berikut untuk menyelesaikannya.
// Lepaskan eksportir blank.setParameter sebelum dua baris (jrxlsexporterparameter.is_remove_empty_space_between_rows, boolean.true); eksportir.setParameter (jrxlsexporterparameter.is_remove_empty_space_between_columns, boolean.true); // Atur warna latar belakang tabel Excel ke eksportir putih default.setParameter (jrxlsexporterparameter.is_white_page_background, boolean.false);
2. Volume data besar, judulnya ditulis beberapa kali
Jika Anda memiliki banyak data lembar, Anda dapat menemukan situasi di mana header tabel dicetak beberapa kali. Dalam hal ini, Anda perlu menambahkan pengaturan tinggi.
Bidang pageHeight = jrbaserport.class.getDeclaredfield ("PageHeight"); pageHeight.setAccessible (true); pageHeight.setint (Jasperreport, integer.max_value);3. Masalah Jenis Sel
Terkadang, laporan Excel yang kami ekspor perlu dihitung menggunakan fungsi Excel. Jika semuanya dalam format teks, kita secara alami tidak dapat menghitungnya. Dalam hal ini, kita perlu menggunakan
// secara otomatis pilih format eksportir.setParameter (jrxlsexporterparameter.is_detect_cell_type, boolean.true);
Ingat, saat merancang laporan, pilih jenis bidang bidang yang benar.
4. Masalah beberapa lembar
Contoh sederhana di atas hanyalah file yang berisi halaman lembar. Bagaimana jika persyaratan kami adalah mengekspor beberapa lembar dalam satu file? Jangan khawatir, Japser ini sudah memikirkannya untuk kita.
Ubah saja langkah ekspor di atas menjadi berikut
BAOS = ByTeArrayOutputStream () baru (); eksportir = jrxlsxexporter baru (); eksportir.setParameter (jrexporterparameter.jasper_print_list, listjasperprint); ploping.setparameter (jrexporterparameter.output_stream, baos); jrexporterparameter.output_stream, baos); eksportir.setParameter (jrxlsexporterparameter.is_one_page_per_sheet, boolean.true);
Jrexporterparameter.jasper_print_list, lulus dalam koleksi listjasperprints, masing -masing jasperprint adalah halaman lembar.
5. Tidak ada kesalahan yang dilaporkan dalam startup Linux, tetapi laporan tidak dapat diekspor
Bahkan, masalah ini telah mengganggu saya sejak lama. Kemudian, dengan bantuan bos, saya ingat masalahnya, karena itu tidak melempar pengecualian sama sekali, tetapi kesalahan. Saya melihat bahwa beberapa teman sekelas mengajukan pertanyaan ini secara online, jadi saya mempostingnya.
Anda dapat menggunakan Throwable untuk menangkap pesan kesalahan dan mendapatkan pesan kesalahan: java.lang.internalError: tidak dapat terhubung ke server jendela X11 menggunakan ': 0.0' sebagai
Solusi: Modifikasi tomcat/bin/catalina.sh dan tambahkan java_opts = "$ java_opts -djava.awt.headless = true"
6. Big Data memori overflow dan masalah kebocoran memori! Lai
Saya perlu berbicara tentang perbedaan antara Excel 03 dan 07 versi. Saya ingat bahwa versi 03 hanya mendukung 65532 baris, tetapi setelah versi 07, itu menjadi jauh lebih besar. Saya lupa nomor spesifiknya, itu bukan urutan besarnya yang sama.
JRXLSXExporter mendukung pengekspor file XLSX.
JRXLSEXPORTER adalah file XLS, yang mudah diidentifikasi. Alat yang diekspor sama dengan yang ada di Excel.
Lalu ada masalah memori overflow dan bocor memori. Saya percaya bahwa teman -teman yang bermain Java pada dasarnya menemukan ini.
Solusi yang paling umum untuk meluap memori adalah meningkatkan ukuran memori wadah dan meningkatkan ukuran memori Tomcat. Anda dapat menggunakan Baidu, ada banyak metode, jadi Anda tidak akan membuat kembali roda.
Berikut adalah pengingat bahwa jika Anda menggunakan Tomcat, metode konfigurasi pemasangan Windows, dekompresi dan Linux berbeda, jadi harap perhatikan.
Yang perlu saya perkenalkan di sini adalah metode Jasperreport. Faktanya, Jasperreport memiliki solusi untuk data besar. Diluncurkan dalam versi yang sangat awal, emulator Jrfilevirttualizer.
Untuk apa benda ini digunakan? Bahkan, itu akan menulis data ke file sementara pada hard disk sesuai dengan parameter yang Anda atur, yang memecahkan masalah penggunaan memori yang berlebihan dan meluap saat mengisi laporan.
Saat ini, Jasperreport memiliki 3 emulator, yang semuanya digunakan untuk menyelesaikan masalah ini.
Mereka adalah:
①jrfilevirtualizer
②jrswapfilevirtualizer
③jrgzipvirtualzer
Apa perbedaan antara ketiga emulator ini?
Pertama, saya meluncurkan Jrfilevirtualizer paling awal. Ketika saya sedang menguji, ketika saya mengekspor sekitar 30W data, itu akan melaporkan memori overflow. Kemudian, setelah menambahkan ini, saya bisa mengekspornya secara normal. Emulator ini akan menghasilkan file sementara untuk setiap objek dan menyimpannya di hard disk untuk menyelesaikan masalah penggunaan memori. Namun, karena ada banyak file sementara yang dihasilkan, konsumsi memori pembuatan file dan penghapusan tidak terlihat meningkat, sehingga tidak terlalu disarankan.
// Tulis beberapa file jrfilevirtualizer virtualizer = jrfilevirtualizer baru (2, catchpath); Peta <String, Object> parameterValue = HashMap baru <String, Object> (); parameterValue.put (jrparameter.report_virtualizer, virtualizer);
virtualizer.setreadonly (true);
Catchpath adalah jalur cache file dan harus ada, jika tidak kesalahan akan dilaporkan.
Lalu ada Jrswapfilevirtualizer, yang diluncurkan untuk menyelesaikan masalah Jrfilevirtualzer. Emulator ini hanya akan membuat file sementara, dan setiap objek akan memperhitungkan bagian dari file ini, sehingga konsumsi memori pembuatan dan penghapusan file berkurang. Bahkan, ini tidak terlalu disarankan.
// Tulis satu file rswapfile arquivoswap = jrswapfile baru (catchpath, 4096, 25); jrabstractlruvirtualizer virtualizer = jrswapfilevirtualizer baru (2, arquivoswap, true); Peta <string, object> parameterValue = hashMap baru <string, object> (); parameterValue.put (jrparameter.report_virtualizer, virtualizer);
virtualizer.setreadonly (true);
Akhirnya, ada jrgzipvirtualzer. Saat Anda melihat GZIP, Anda tidak tahu apakah Anda memiliki koneksi dengan kata kompresi. Itu benar, emulator ini menggunakan algoritma kompresi khusus yang dapat mengompres jejak memori menjadi satu kedua puluh atau satu-antara, yang luar biasa.
Jrabstractlruvirtuzer virtualizer = jrgzipvirtualizer baru (2); peta <string, objek> parameterValue = hashMap baru <string, objek> (); parameterValue.put (jrparameter.report_virtuzer, virtualizer); jasperprint =. DataSource);
Singkatnya, singkatnya, ada tiga jenis emulator untuk menyelesaikan masalah overflow memori. Saya juga telah membaca banyak blog yang menggunakan jrfilevirtualzer untuk menyelesaikan masalah data besar memori. Lalu saya ingin mengatakan di sini bahwa saya paling tidak merekomendasikan menggunakan emulator JRFilevirtualizer karena tidak hanya mengkonsumsi banyak file untuk dibuat, tetapi juga memiliki bug dan kebocoran memori yang sangat serius! Lai Lai Ada juga Jrswapfilevirtualzer yang memiliki masalah ini.
Selain itu, harus dicatat bahwa tanpa menggunakan emulator, akan ada masalah kebocoran memori. Saat Anda mengekspor laporan, membuang informasi tumpukan dan menemukan bahwa ada banyak contoh dari Net.sf.jasperreports.engine.fill.jrtemplatePrinttext kelas, yang tidak dapat didaur ulang dan tidak dapat didaur ulang! Lai Lai Dan masalah ini masih ada dalam versi terbaru JapserReport 6.X. Ada banyak masalah seperti itu di komunitas Jasper dan Stack Overflow, tetapi tidak ada solusi.
Di sini kami merekomendasikan emulator JRGZIPVIRTUALIZER. Meskipun masih ada masalah kebocoran, karena algoritma kompresi yang unik, masalah kebocoran memori telah dikendalikan ke kisaran yang sangat kecil. Ini dianggap sebagai solusi untuk mengurangi penggunaan memori yang bocor sekitar 90%.
Secara umum, saya telah menyerahkan rencana ini sekarang, dan saya menuliskannya sehingga saudara -saudara saya akan menghindari jalan memutar nanti. Setelah mendapatkan kelas alat POI, saya selanjutnya akan bersiap untuk mengubah semua laporan menjadi metode ekspor POI. Omong -omong, solusi POI Big Data cukup bagus.