2

SUBREPORT_DIRサブレポートへのパスを渡すのに問題があります。レポートは実際には同じフォルダーにありますが、JAR ファイル内にあります。私はこのようなことを試しました(不正確かもしれません):

parameterList = new HashMap<String, Object>();

URL mainReport = this.getClass().getResource("mainReport.jasper");
String mainReportPath = mainReport.getPath();
String subreportDir = mainReportPath.substring(0, mainReportPath.lastIndexOf("/")+1);

parameterList.put("SUBREPORT_DIR", subreportDir);

このパスは JAR ファイル内を指していますが、net.sf.jasperreports.engine.JRException: Resource not found at : ...レポート生成時に取得します。どうすればこれを機能させることができますか?

編集

なしでサブレポートを定義しようとしましたSUBREPORT_DIRが、うまくいきませんでした:

<subreport>
      <reportElement x="0" y="32" width="475" height="17"/>
      <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{current})]]></dataSourceExpression>
      <subreportExpression><![CDATA["mysubreport.jrxml"]]></subreportExpression>
</subreport>
4

4 に答える 4

3

私の主な問題は、ジャスパーが知らなかったカスタム JAR ローダーを使用していたことです。java.net.URLサブレポートをorとして渡すことも可能ですjava.io.InputStream:

Java コード:

InputStream subInputStream = this.getClass().getResourceAsStream("sub.jasper");
parameterList.put("SUBREPORT_INPUT_STREAM", subInputStream);

JRXML:

<subreportExpression class="java.io.InputStream"><![CDATA[$P{SUBREPORT_INPUT_STREAM}]]></subreportExpression>
于 2012-05-30T07:10:36.337 に答える
2

SUBREPORT_DIR完全に削除するのがおそらく最も簡単です。iReport は、サブレポートを追跡するのに便利なように、デフォルトでそれを追加します。しかし、それを保持する必要はありません。

あなたの場合、レポートは同じディレクトリと .jar にあるため、クラスパス上にあります。.jrxml の参照を$P{SUBREPORT_DIR} + "mysubreport.jasper"から単にに変更します"mysubreport.jasper"。次に、レポートからパラメーターを削除し、使用するディレクトリを特定しようとするコードを取り除きます。

于 2012-05-25T00:11:03.940 に答える
1

私が間違っていなければ、jar 内のコンパイルされた jasper ファイルの場所に基づいてサブレポートを参照できるはずです。たとえば、サブレポートが値の名前が付けられたパッケージにある場合、渡すtest.reportsことSUBREPORT_DIRができるはずです/test/reports/

それでもうまくいかない場合は、コンパイルされたレポートをデフォルトのパッケージに移動して、代わりに設定SUBREPORT_DIRしてみてください。/

于 2012-05-24T21:33:02.583 に答える