2011-03-21 148 views
12

我有一個web應用程序,客戶端請求查看一些報告。該方法一直使用iReport並在屏幕上向他們顯示報告。使用JasperReports和相對路徑

I have already asked something like this。但是今天我發現報告文件(jrxml)的路徑是絕對的。所以我必須改變程序,以便它接受相對路徑。我一直在嘗試這樣做,但似乎jrxml或編譯的(.jasper)文件都不接受相對路徑來編譯或填充報告。

這是我這麼遠了:

//path is generated as request.getContextPath() + "/jrxmlFiles/" 
public void generateReport(HttpServletResponse res, ConexionAdmin con, String path) throws Exception{ 

    ServletOutputStream out = null; 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    JasperDesign jasperDesign = JRXmlLoader.load(path); 
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 

    byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, pars, con.initConexion()); 
     res.setContentType("application/pdf"); 
    res.setContentLength(bytes.length); 
    out = res.getOutputStream(); 
    out.write(bytes, 0, bytes.length); 

    res.setHeader("Cache-Control", "cache"); 
    res.setHeader("Content-Disposition", "attachment; filename=report.pdf"); 
    res.setHeader("Pragma", "cache"); 
    res.setContentLength(bos.size()); 

    out.write(bos.toByteArray()); 
    out.flush(); 
    bos.close(); 
    out.close(); 
    res.flushBuffer(); 
} 

這似乎與絕對路徑的工作,但我拋出:

Exception Message 
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException 

時更改爲相對路徑。我已經在網絡上搜索瞭如何改變我的身材並沒有取得成功。

我有javaDoc的jasper API,但我寧願不讀它通過,如果我可以幫助它。

+0

似乎我忘了添加pars的聲明,它只是一個新的HasMap()(因爲我想要的報告沒有變量)。對不起,錯了! – Random 2011-03-21 11:10:26

回答

16
  • 路徑必須是絕對路徑。
  • 如果正在修改.jrxml,則只能將.jrxml文件編譯爲.jasper文件。通常你可以加載.jasper文件並完全跳過編譯。它快得多。
  • 在您的Web根目錄之外存儲.jasper.jrxml文件。
  • 在所有報告中創建下列參數:相對於$P{ROOT_DIR}
     
        ROOT_DIR = "/full/path/to/reports/" 
        IMAGE_DIR = $P{ROOT_DIR} + "images/" 
        STYLES_DIR = $P{ROOT_DIR} + "styles/" 
        SUBREPORT_DIR = $P{ROOT_DIR} + "subreports/" 
        COMMON_DIR = $P{ROOT_DIR} + "common/"
  • 參考項目(例如,$P{IMAGE_DIR}中的$P{ROOT_DIR}來定義)。
  • 從您的環境中傳入值$P{ROOT_DIR}
  • 將您的應用程序鬆散地耦合到您使用的任何報告框架。

然後在必要時使用表達式。例如,參考子報告如下:

<subreportExpression> 
    <![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]> 
</subreportExpression> 

這將允許子報告目錄在不同環境之間有所不同。

+1

@Random:我不是建議你不要使用JasperReports。離得很遠。我建議你使用一個使用JasperReports而不緊密耦合的實現。 (有效隔離建築組件。) – 2011-04-04 19:09:08

2

我有同樣的問題,我得到了解決方案。首先,將報告中使用的每個對象(子報表,圖像等)和所有擴展名(.jasper,.jrxml)放在一個文件夾中,並將該文件夾放在C://磁盤中。它現在可能被放置在我的文檔中,或任何在單詞之間有空格的路徑,然後iReport將其視爲「我的%20文檔」,並使其感到困惑。

因此,把文件夾放在C://中,把與報告相關的所有東西放在同一個文件夾中,並把相對路徑放到一切。這應該工作。希望我幫助任何人。

+0

這個項目相當長一段時間,我沒有代碼來測試它。但想法是Jasper能夠使用一些相對路徑,如/JRXML_files/account/account_report.jrxml(在WebContent內部)。雖然在發佈之前,Jasper已經有了一個新的版本,希望他們接受這條路。謝謝,我希望我能儘快嘗試。 – Random 2014-03-17 14:20:20

+1

是的,我明白你的問題是什麼。幾天前我和iReport 3.7.2發生了同樣的問題,終於搞混了他。無論如何,只是想在某個地方回答問題,因爲我看到很多問題都是同一個問題。 – Merjem 2014-03-18 14:59:13