2012-07-12 21 views
1
使用子報表

我創建Jasper報表的Java代碼無法在JasperReports的

JasperReport report = JasperCompileManager.compileReport(jrxml); 
JasperPrint print = JasperFillManager.fillReport(report,parameters, conn); 
JasperExportManager.exportReportToPdfFile(print,filename); 

它的成功運行,當我米創建不使用子報表報告。當我插入任何報表我的代碼失敗和異常說

原因:空

MESSAGEnull

LOCAL MESSAGEnull

請告訴我,如果我需要改變我的Java代碼?

我看了這條線的地方使用子報表。

JasperReport subreport = (JasperReport)JRLoader.loadObjectFromLocation("ProductReport.jasper"); 

我是否還需要使用此代碼?我是一名PHP開發人員。對Java不太瞭解。我使用Jasper報告是因爲我們需要創建大型PDF。這個工具幫了我們很多。但現在我堅持一個新的報告,我需要使用子報表事物。

+0

你可以看看[這篇文章](http://stackoverflow.com/a/9786261/876298) – 2012-07-12 12:54:30

回答

1

我用iReport的4.1.3,並在Java代碼中我的jar文件是JasperReports的-3.7.6.jar我讀了很多次,這兩個版本應該是相同的。所以我嘗試了下載jasperreports-4.1.3.jar並使用它。這工作。現在子報表沒有問題。

1

這成爲了很多confunsing我,但在這裏我們去。

首先,你應該選擇你是否會從的.jrxml得到您的報告或開發文件

如果選擇JRXML你必須編譯它,這是代碼JRXML:

JasperReport report = JasperCompileManager.compileReport(jrxml); 

你可以發現你已經這樣做了,所以如果你想加載你以同樣的方式子報表,你可以通過你的報表的JRXML文件以同樣的方式,把這個到另一個變量:

JasperReport subReport = JasperCompileManager.compileReport(subReportjrxml); 

當我需要把一個子報表我的主報告裏面我剛剛通過了碧玉文件作爲我的HashMap裏面的參數,如:

Map<String, Object> params = new HashMap<String, Object>; 

params.put("SUB_REPORT", subReport); 

(你把「PARAMS」在fillReport方法,但是你只需要填寫mainReport,因爲當你傳遞你的子報表作爲參數時,它也應該被填充)

在iReport編輯器中,在你的主報表中,你創建了一個具有相同名字的參數「SUB_REPORT」,你可以這樣做reportInspector(或類似的東西)將類型作爲對象。

選擇subReportElement並進入屬性,那裏你可以看到一個屬性調用子報表表達,有你把你所創建的參數。

+0

它不工作! – 2013-05-10 09:08:17

1

我相信D.羅德里格斯實際上給了你正確的解決方案,過去三天我一直在研究一個類似的問題,但沒有運氣,最後讓它與D.羅德里格斯的建議一致。我意識到這是一年前的一篇文章,因爲我希望對將來遇到類似問題的人有所幫助,所以我發佈了這篇文章。

我的情況是:我有一個包含多層子報表的JasperReport,我想在建立在Netbeans中的Java應用程序中運行它。最初,我使用getResources()作爲我的主要報告,當我運行它時,它在IDE中正常工作,但是當我構建它並從jar中運行時,它會給出「文件未找到異常」,我嘗試了替代方法使用「輸入流」,並使用子報表作爲輸入組,它總是會給出「錯誤加載輸入流」,經過幾天的研究後,我感到沮喪,並且與此一起工作。

這樣的想法是,你需要讓主報告

JasperReport main = (JasperReport)JRLoader.loadObject(this.getClass().getResource("main.jasper")); 

和所有子報表中的資源

JasperReport sub1 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub1.jasper")); 
JasperReport sub2 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub2.jasper")); 
JasperReport sub3 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub3.jasper")); 
JasperReport sub4 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub4.jasper")); 

(也有在上面的例子4子報告)

既然你正在將子報告作爲「參數」傳遞,因此您需要在報告中包含這些參數,並且您需要確保這些參數到達使用它們的圖層, Ë層 主要 Sub1的 分公司2 Sub3中,Sub4中

所以在我的主,我有參數:SUB1,SUB2,SUB3,SUB4,將它們都作爲參數類 「對象」,設置subrepot表達「 $ P {sub1}「,它會在運行時調用子報表」Sub1「,並在子報表參數中添加$ P {sub2},$ P {sub3},$ P {sub3},因爲您在子報表中使用此參數, Java代碼,你只可能值主報告

等等等等的後層,我用Java代碼finaly是:

JasperReport jr = (JasperReport)JRLoader.loadObject(this.getClass().getResource("main.jasper")); 
JasperReport sub1 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub1.jasper")); 
JasperReport sub2 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub2.jasper")); 
JasperReport sub3 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub3.jasper")); 
JasperReport sub4 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub4.jasper")); 
Map para = new HashMap(); 
para.put("Sub1", sub1); 
para.put("Sub2", sub2); 
para.put("Sub3", sub3); 
para.put("Sub4", sub4); 
JasperPrint jp = JasperFillManager.fillReport(jr, para, conn); 
JasperViewer.viewReport(jp, false);  

它的作品很神奇!

如果仍然沒有工作,請發表評論或給我發email在:[email protected]

我很想看看我能做些什麼!