このトピックにアクセスして、今日のJasperReport、IreportまたはJasperstudioを紹介しましょう。その後、2つが視覚化ツールです。
JasperReportとは何ですか?
この製品には、実際には多くの国内ユーザーがいます。それは外国の製品であり、Javaレポートフィールドで広く使用されていると言えます。
私がこのレポートに最初に接触したとき、私はそれがとても気に入りました。最も重要なことは、視覚化ツールであり、本当に止まることができなくなりました。単に写真を描くだけで、実際にJavaレポートを設計できました。描画といえば、視覚ツールを使用してレポートテンプレートを視覚的に設計できます。サポートするファイル形式は、Excel、Word、PDF、HTML、XML、CSVなどを含む非常に幅が広いです。
それは非常に強力に見えませんか?一度に設計されており、複数回再利用されています。もちろん、強力なものにはしばしば2つの側面があります。私はこれに遭遇し、長い間私を拷問しました。後で詳しく説明します。
JasperReportの大きな胸
私は以前、JasperReportまたはIreportまたはJasperstudioは実際には不正確であると言いました。 2番目の兄弟Ireportと3番目の兄弟Jasperstudioは、実際にはJasperの補助視覚設計ツールです。 Jasperレポートを使用せずに設計し、より多くのXMLホワイトを書くことができます。 5.5の前に、このツールはIreportと呼ばれていました。 5.5の後、3番目の兄弟Jasperstudioの誕生で、Ireportは完全に交換されました。実際、これらの2つのツールは、基本的に同じ1つの子供の同胞です。
特定のワークフロー:
first、Jasperは、出力する必要があるフォーマット情報のXMLファイルを取得し、XMLファイルから.Jasperタイプファイルをコンパイルします。次に、このJasperファイルをアプリケーションにロードして、最終レポートを生成できます。とても馴染みのある気持ちはありますか?はい、これはJavaに非常に似ており、コンパイルする必要があります。
次の写真は、Ireport操作インターフェイスを示しています。 Jasperstudioに似ているので、投稿しません。バイドゥで自分でダウンロードできます。
上の写真に各タイプのバンドを簡単に紹介しましょう。
(1)タイトルバンド:タイトルセグメントは、レポート全体の最初のページの上部にのみ表示されます。最初のページを除き、レポートに何ページがあるとしても、タイトルバンドのコンテンツは表示されなくなります。
(2)PageHeader Band:名前が示すように、Pageheaderセグメントのコンテンツはレポート全体のすべてのページに表示され、ページの上部に表示されます。レポートの最初のページの場合、Pageheaderのコンテンツがタイトルバンドの下に表示されます。最初のページを除く他のすべてのページで、ページヘッダーのコンテンツがページの上部に表示されます。
(3)PageFooterバンド:ページの下端に表示されます。
(4)LastPageFooterバンド:最後のページの下部に表示されます。
(5)詳細バンド:レポートコンテンツセグメント、このバンドのデザインレポートで繰り返す必要があるコンテンツ、および詳細セグメントのコンテンツがすべてのページに表示されます。
(6)Columnheader Band:一般的にこのセグメントでは、詳細バンドのヘッダーセグメントの場合、レポートのヘッダーが描画されます。
(7)columnfooterバンド:詳細バンドのテーブルの端。
(8)概要バンド:テーブルの合計セグメントは、レポート全体の最後のページの詳細バンドの後に表示されます。通常、レポート内の1つまたは複数のフィールドの合計値をカウントするために使用されます。
上記はすべて視覚化ツールです。実際、使用するのは非常に簡単です。探索することで見つけることができます。それはピットの本当の記録であるため、これは当然のことながらポイントではないので、私はそれについて話しません。
コードのアプリケーション
これらは私が要約した手順です。たぶん、説明はあまり正確ではありません。やってください。
designテンプレート、JRXMLファイルの生成、↑↑上記の視覚化ツールは、必要なテンプレートスタイルを設計します
compileテンプレートをコンパイルすると、JRXMLはJavaファイルと同様にJasperファイルにコンパイルされます。
実際、このステップはiReportで直接コンパイルして.Jasperを生成することができます。もちろん、実行時にJasperプログラムを通じてコンパイルすることもできます。ただし、プログラムにコンパイルされている場合、JasperバージョンはiReportまたはJasperstudioバージョンと一致することをお勧めします。
exececuteレポート(データはレポートに記入されています)
1.テンプレートをロードして、JasperRePortオブジェクトを生成します
2。jasperfillmanagerを使用して、jasperprintオブジェクトを生成します
finalするには、jrxlsxexporterを使用してレポートをエクスポートするか、表示します
ロードテンプレート
視覚化ツールを使用して.jasperまたは.jrxmlファイルを生成したため、当然プログラムをロードする必要があります。
ロードされたコード、Jasperportオブジェクトを返します
if(urlpath.endswith( "。jrxml")){// jrxmlにjasper try {inputstream is = url.openstream(); jasperReport = jaspercompilemanager.compilereport(is); } catch(ioException e){新しいbaseexception( "load jasper error"、e); } catch(jRexception e){throw new baseexception( "jrxmlテンプレート変換transform the jasperファイルエラー"、e); } catch(throwable e){throw new baseexception( "jrxmlテンプレート変換transform the jasperファイルエラー"、e); } catch(throwable e){log.error(e);新しいbaseexception(e.getmessage()); }} else if(urlpath.endswith( "。jasper")){try {inputstream is = url.openstream(); JasperReport =(JasperReport)jrloader.loadObject(is); } catch(ioException e){新しいbaseexception( "load jasper error"、e); } catch(jRexception e){throw new baseexception( "JRXMLテンプレートファイルエラー"、e); } catch(throwable e){log.error(e);新しいbaseexception(e.getmessage()); }} else {throw new baseexception( "invalid file!"); }レポートでデータソースを取得します
ここでは、Javabeanを使用して取得します
jrdatasource dataSource = null; if(fieldValues!= null && fieldvalues.size()> 0){dataSource = new JrbeanCollectionDataSource(fieldValues); } else {dataSource = new JremptyDataSource(); } FieldValuesは、データベースで取得したPOJOのコレクションです。
レポートの詰め物を実行します
JasperPrintオブジェクトを取得します
Map <string、object> parametervalue = new hashmap <string、object>(); jasperprint = jasperfillmanager.fillreport(jasperreport、parametervalue、dataSource);
最後に、JRXLSXEXPORTERを使用してレポートをエクスポートします
これはまた、最も構成パラメーターが必要な場所でもあります
baos = new bytearrayoutputStream(); exporter = new jrxlsxexporter(); exporter.setParameter(jrexporterparameter.jasper_print、jasperprint); exporter.setParameter(jrexporterparameter.output_stream、baos);
exporter.exportreport();
完了すると、データは出力ストリームに書き込まれています。自分で出力する方法を決定します。他のコード導入方法よりもはるかに簡単ですか。
実際、JasperReportはコードライティングに比類のない利点があり、さまざまなAPIがパッケージ化されています。しかし、チャチャがあまりにも多くのことをしており、多くの問題があるかもしれません。
JasperReportの問題
1. 2列の前の空白スペース
上記のコードを使用してExcelをエクスポートすると、Excelの背景がExcelの小さなグリッドなしで白いことがわかります。これは、Jasperのデフォルトの背景が白であるため、他の形式をエクスポートするときに互換性があるのが簡単だからです。もちろん、Excelをエクスポートする必要はありません。次の2行を追加して解決してください。
// 2行前に空白のexporter.setParameterを削除します(jrxlsexporterparameter.is_remove_empty_space_between_rows、boolean.true); exporter.setParameter(jrxlsexporterparameter.is_remove_empty_space_between_columns、boolean.true); // Excelテーブルの背景色をデフォルトのWhite Exporter.setParameter(jrxlsexportarparameter.is_white_page_background、boolean.false)に設定します。
2。データのボリュームは大きく、タイトルは複数回書かれています
多くのシートデータがある場合は、テーブルヘッダーが複数回印刷される状況に遭遇する可能性があります。この場合、高さ設定を追加する必要があります。
フィールドPageHeight = jrbasereport.class.getDeclaredfield( "pageheight"); pageheight.setAccessible(true); pageheight.setint(jasperreport、integer.max_value);
3。細胞型の問題
エクスポートのExcelレポートをExcel関数を使用して計算する必要がある場合があります。それらのすべてがテキスト形式の場合、当然計算することはできません。この場合、使用する必要があります
// format exporter.setParameter(jrxlsexporterParameter.is_detect_cell_type、boolean.true)を自動的に選択します。
レポートを設計するときは、フィールドフィールドの正しいタイプを選択してください。
4.複数のシートの問題
上記の簡単な例は、シートページを含むファイルにすぎません。私たちの要件が1つのファイルに複数のシートをエクスポートすることである場合はどうなりますか?心配しないでください、このジャッサはすでに私たちのためにそれを考えています。
上のエクスポートステップを次のように変更してください
baos = new bytearrayoutputStream(); exporter = new jrxlsxexporter(); exporter.setParameter(jrexporterparameter.jasper_print_list、listjasperprint); exporter.setParameter(jrexporterparameter.output_stet_stream、baos、baos); exporter.setParameter(jrxlsexporterparameter.is_one_page_sheet、boolean.true);
jrexporterparameter.jasper_print_list、listjasperprintsのコレクションを渡すと、各jasperprintはシートページです。
5. Linuxの起動にはエラーが報告されていませんが、レポートはエクスポートできません
実際、この問題は長い間私を悩ませてきました。後で、ボスの助けを借りて、私は問題を思い出しました。一部のクラスメートがこの質問をオンラインで尋ねたのを見たので、私はそれを投稿しました。
Throwableを使用してエラーメッセージをキャプチャし、エラーメッセージを取得できます:java.lang.internalerror: ':0.0'を使用してx11ウィンドウサーバーに接続できません
解決策: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にはビッグデータの解決策があります。 Jrfilevirtualizerのエミュレータである非常に初期のバージョンで発売されました。
このことは何に使われていますか?実際、設定したパラメーターに従ってハードディスク上の一時ファイルにデータを書き込みます。これは、レポートに記入するときに過度のメモリ使用とオーバーフローの問題を解決します。
現在、JasperReportには3つのエミュレーターがあり、そのすべてがこの問題を解決するために使用されています。
彼らです:
①jrfilevirtualizer
②jrswapfilevirtualizer
③jrgzipvirtualizer
これら3つのエミュレーターの違いは何ですか?
最初に、最も早いJrfilevirtualizerを立ち上げました。私がテストしていたとき、私が約30Wのデータをエクスポートしたとき、それはメモリのオーバーフローを報告します。後でこれを追加した後、私はそれを正常にエクスポートすることができました。このエミュレータは、各オブジェクトの一時ファイルを生成し、メモリ使用量の問題を解決するためにハードディスクに保存します。ただし、多くの一時ファイルが生成されているため、ファイルの作成と削除のメモリ消費が目に見えて増加するため、あまりお勧めしません。
//複数のファイルを書き込むjrfilevirtualizer virtualizer = new jrfilevirtualizer(2、catchpath); map <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); Map <string、object> parametervalue = new hashmap <string、object>(); parametervalue.put(jrparameter.report_virtualizer、virtualizer);
virtualizer.setreadonly(true);
最後に、jrgzipvirtualizerがあります。 GZIPが表示されたとき、圧縮という単語に関係があるかどうかはわかりません。そうです、このエミュレータは、メモリフットプリントを20分の1または1つに圧縮できる特別な圧縮アルゴリズムを使用します。これは驚くべきことです。
jrabstractlruvirtualizer virtualizer = new jrgzipvirtualizer(2); map <string、object> parametervalue = new hashmap <string、object>(); parametervalue.put(jrparameter.report_virtualizer、virtualizer); jaspermanager.fillerport(jasperrerport( DataSource);
要するに、多くのことを言って、メモリオーバーフローの問題を解決するための3種類のエミュレーターがあります。また、Jrfilevirtualizerを使用してメモリビッグデータの問題を解決する多くのブログを読みました。次に、Jrfilevirtualizerエミュレーターを使用することをお勧めしないことをここで言いたいと思います。なぜなら、それは作成するために多くのファイルを消費するだけでなく、非常に深刻なバグとメモリリークも持っているからです。 ! !また、この問題を抱えているJRSWAPFileVirtualizerもあります。
さらに、エミュレータを使用しないと、メモリリークの問題が発生することに注意する必要があります。レポートをエクスポートするとき、スタック情報をダンプして、net.sf.jasperReports.engine.fill.jrtemplateprinttextクラスには多くのインスタンスがあることを見つけます。これらはリサイクルできず、リサイクルできません! ! !そして、この問題は、JapserReport 6.xの最新バージョンにまだ存在します。 Jasperコミュニティとスタックオーバーフローには多くの問題がありますが、解決策はありません。
ここでは、jrgzipvirtualizerエミュレーターをお勧めします。独自の圧縮アルゴリズムのため、まだ漏れの問題がありますが、メモリリークの問題は非常に小さな範囲に制御されています。これは、漏れたメモリ使用量を約90%軽減するための解決策と考えられています。
一般的に、私は今この計画をあきらめました、そして、私の兄弟が後で迂回を避けるようにそれを書きました。 POIツールクラスを取得した後、すべてのレポートをPOIエクスポート方法に変更する準備をします。そういえば、POIビッグデータソリューションは非常に優れています。