當前位置:首頁 » 編程語言 » jasperreportsql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

jasperreportsql

發布時間: 2022-04-21 15:40:01

⑴ jasperreport怎麼調用子報表,在頁面上顯示

我用的是finereport,頁面上顯示子報表的方法如下,樓主的應該可以參照設置一下吧

1.連接資料庫frDemo2.設計報表-新建報表-表樣設計-新建一數據集
新建數據集ds1:根據需要編輯sql語句:select * from
新建資料庫ds2:根據需要編輯SQL語句:select * from
綁定數據列
將數據集的欄位拖入對應報表單元格內,並作相應的設置。
單元格設置過濾
進入單元格數據列對話框,點擊過濾,設置過濾條件
單元格的表單屬性設置
設置表單屬性
設置報表填報屬性
打開報表|報表填報屬性對話框,點擊添加按鈕,添加一個新的內置SQL。
資料庫選擇frDemo,模式為空,表選擇訂單
點擊智能添加欄位,用來將模板中的所要填入的欄位和數據表中的欄位對應
添加完後,單擊智能添加單元格,填入對應的單元格。可以選單元格不改變時不參與更新,這樣可以加快填報後數據更新速度。添加完後點擊確定,可以看到在預覽中已經自動生成了相對應的更新資料庫的SQL語句。
再添加一個內置SQL2,資料庫選擇frDemo,模式為空以同樣的方式智能添加欄位à智能添加單元格
希望可以幫到你

⑵ 使用JasperReport+iReport生成報表時,頁面參數可以傳入報表中,但是報表不執行SQL語句

檢查你傳入的類型是否正確,看你在iReport里定義的companyid的類型與你傳入參數的Map里存的類型是否匹配。

⑶ jasperreport怎麼集成到springmvc

項目原因需要在springmvc的基礎上整合jasperreports生成報表。其實springmvc已經提供了對jasperreports的支持,感覺springmvc採用的一個比較好的方式是將報表的生成作為一個view處理,但是需要對每一種報表配置他的jasperreports模板及視圖的映射,這樣的話添加報表必須變更配置,比較麻煩,所以自己想了一個方法來避免這種配置,代碼可以很容易和spring整合起來。
japserreports生成報表基本流程其實就是根據一個模板和數據源生成一個中間類型,然後可以在此基礎上可以導出幾種格式。我的想法是提供方法供springmvc的controller調用產生中間文件,然後在view裡面向客戶端導出請求的格式。
首先是ReportPrint類,很簡單,只是包含一個JasperPrint對象(既上述的中間文件),代碼很簡單,不解釋
01 public class ReportPrint {
02 JasperPrint jasperPrint = null;
03
04 public JasperPrint getJasperPrint() {
05 return jasperPrint;
06 }
07
08 public void setJasperPrint(JasperPrint jasperPrint) {
09 this.jasperPrint = jasperPrint;
10 }
11
12 }
接下來就是ReportCreater類,該類可通過spring注入到其他類中,調用它的createReport方法
01 public class ReportCreater {
02 private static final Log logger = LogFactory.getLog(ReportCreater.class);
03 private String jasperReportPath = null;//報表的模板文件存放路徑(相對classpath,通過spring注入)
04 /**
05 * jasperDesignMap作為一個緩存存儲編譯後的JasperReport模板
06 */
07 private Map<String, JasperReport> jasperDesignMap = newConcurrentHashMap<String, JasperReport>();
08
09 public void resetJasperDesignCache() {
10 jasperDesignMap.clear();
11 }
12
13 /**
14 * controller調用該方法來產生ReportPrint對象
15 */
16 public ReportPrint createReport(final String reportKey, final ResultSet rs, Map<String, ?> reportParams) throws ReportException {
17 try {
18 return _createReport(reportKey, rs, reportParams);
19 } catch (JRException e) {
20 logger.error(null, e);
21 throw new ReportException("產生報表出錯" + reportKey);
22 }
23 }
24
25 private ReportPrint _createReport(final String reportKey, final ResultSet rs, Map<String, ?> reportParams) throws ReportException, JRException {
26 JasperReport jasperReport = getJasperReport(reportKey);
27 ReportPrint reportPrint = new ReportPrint();
28 JRResultSetDataSource resultSetDataSource = newJRResultSetDataSource(rs);
29 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, reportParams, resultSetDataSource);
30 reportPrint.setJasperPrint(jasperPrint);
31
32 return reportPrint;
33 }
34
35 private JasperReport getJasperReport(final String reportKey) {
36 try {
37 return _getJasperReport(reportKey);
38 } catch (IOException e) {
39 logger.error(null, e);
40 throw new ReportException("關閉文件流異常:" + reportKey);
41 } catch (JRException e) {
42 logger.error(null, e);
43 throw new ReportException("產生報表異常:" + reportKey);
44 }
45 }
46
47 private JasperReport _getJasperReport(final String reportKey) throwsIOException, JRException {
48 JasperReport jasperReport = null;
49 if (jasperDesignMap.containsKey(reportKey)) {
50 jasperReport = jasperDesignMap.get(reportKey);
51 } else {
52 jasperReport = getJasperReportFromFile(final String reportKey);
53 jasperDesignMap.put(reportKey, jasperReport);
54 }
55
56 return jasperReport;
57 }
58
59 /**
60 * 從模板文件編譯獲得模板對象
61 */
62 private JasperReport getJasperReportFromFile(final String reportKey) throws IOException, JRException {
63 String filePath = jasperReportPath + reportKey + ".jrxml";//圖省事只支持jrxml的
64 InputStream jasperFileIS = null;
65 JasperReport jasperReport = null;
66
67 try {
68 jasperFileIS =this.getClass().getClassLoader().getResourceAsStream(filePath);
69 if (jasperFileIS == null) {
70 throw new ReportException("報表文件不存在:" + filePath);
71 }
72
73 JasperDesign jasperDesign = JRXmlLoader.load(jasperFileIS);
74 jasperReport = JasperCompileManager.compileReport(jasperDesign);
75 } finally {
76 if (jasperFileIS != null) {
77 jasperFileIS.close();
78 }
79 }
80
81 return jasperReport;
82 }
83
84 public String getJasperReportPath() {
85 return jasperReportPath;
86 }
87
88 public void setJasperReportPath(String jasperReportPath) {
89 this.jasperReportPath = jasperReportPath;
90 }
91
92 public static void main(String[] argv) {
93
94 }
95
96 }
以上就可以產生中間文件了,接下來就是按照spring的view規范寫一個導出各種格式的視圖就可以了
01 public class ReportView extends AbstractView {
02 private static final Log logger = LogFactory.getLog(ReportView.class);
03 private static final String XLS = "xls";
04 private static final String PDF = "pdf";
05 private static final String CSV = "csv";
06 private static final String REPORT_NAME = "reportName";
07 private static final String FORMAT = "format";
08 private static final String REPORT_PRINT = "reportPrint";
09 private static final String HTML = "html";
10
11 private static Map<String, IReportFileExporter> EXPORTER_MAP =
12 new HashMap<String, IReportFileExporter>(4);
13
14 static {
15 EXPORTER_MAP.put(XLS, new ReportXlsExporter());
16 EXPORTER_MAP.put(PDF, new ReportPdfExporter());
17 EXPORTER_MAP.put(CSV, new ReportCsvExporter());
18 EXPORTER_MAP.put(HTML, new ReportHtmlExporter());
19 }
20
21 @Override
22 protected void renderMergedOutputModel(Map model, HttpServletRequest request,
23 HttpServletResponse response) {
24 String reportName = (String) model.get(REPORT_NAME);//報表的文件名
25 String format = (String) model.get(FORMAT);//報表的格式pdf xls .....
26 ReportPrint reportPrint = (ReportPrint) model.get(REPORT_PRINT);//這就是之前生成的中間文件
27 response.setContentType("application/x-msdown;charset=utf-8");
28 try {
29 /* http頭里的文件名貌似不支持utf-8,gbk之類的編碼,需要轉換一下
30 * 另外發現如果用new String(reportName.getBytes("UTF-8"), "iso-8859-1")的話Chrome和FF的
31 * 下載對話框的文件名是正常的,IE卻是亂碼,只能用GBK才正常
32 */
33 response.setHeader("Content-Disposition","attachment;filename=\"" +
34 new String(reportName.getBytes("GBK"),"iso-8859-1") + "\"");
35 } catch (UnsupportedEncodingException e) {
36 logger.error(null, e);
37 }
38 exportFile(reportPrint, format, response);
39 }
40
41 private void exportFile(ReportPrint reportPrint, String format, HttpServletResponse response) {
42 try {
43 _exportFile(reportPrint, format, response);
44 } catch (JRException e) {
45 logger.error("導出報表異常", e);
46 } catch (IOException e) {
47 logger.error(null, e);
48 }
49 }
50
51 private void _exportFile(ReportPrint reportPrint, String format, HttpServletResponse response) throws IOException, JRException {
52 OutputStream buffOS = null;
53
54 try {
55 buffOS = newBufferedOutputStream(response.getOutputStream());
56 IReportFileExporter exporter = null;
57
58 if (EXPORTER_MAP.containsKey(format)) {
59 exporter = EXPORTER_MAP.get(format);//獲取需要格式的導出類
60 exporter.export(reportPrint, buffOS);
61 } else {
62 logger.error("錯誤的報表格式:" + format);
63 }
64 } finally {
65 if (buffOS != null) {
66 buffOS.close();
67 }
68 }
69 }
70
71 }
導出器是一個簡單的介面,各種格式只要實現export方法就可以了
1 public interface IReportFileExporter {
2 public void export(ReportPrint reportPrint, OutputStream os) throwsJRException;
3 }
給一個導出PDF格式的例子,很簡單
01 public class ReportPdfExporter implements IReportFileExporter {
02
03 public void export(ReportPrint reportPrint, OutputStream os) throwsJRException {
04 JRPdfExporter exporter = new JRPdfExporter();
05 exporter.setParameter(JRExporterParameter.JASPER_PRINT, reportPrint.getJasperPrint());
06 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, os);
07 exporter.exportReport();
08 }
09
10 }

⑷ 請教jasperReport生成交叉表問題

你問的是如何生成交叉表吧。交叉表也是常見的基本報表類型。分組報表知識從上到下將數據分組顯示,而交叉表則是從上到下、從左到右都將數據分組的報表,如下圖所示:

縱表頭:地區與銷售員默認縱表頭實現從上到下分組

橫表頭:將產品類型與產品設置為從左到右擴展,讓產品橫向分組,實現橫表頭

數據:根據父子格的概念,銷量會以銷售員為左父格,產品為上父格,自動匹配出銷售員與產品對應的銷量。預覽即可看到上圖交叉表。

註:在這里銷售員與產品對於的銷量是唯一的,因此,直接將銷量拖入單元格即可。

若銷售員與產品對應的銷量不唯一,則將銷量數據列的顯示方式設為匯總-求和。

3、保存並發布

⑸ 在web中,用jasperreport做報表有什麼好處

你說的這兩個各有各的好處,並不是jasperreport就一定比html+css來的好。
我在項目里使用時發現,對於一些復雜的報表,jasperreport做效率低,難看。

但是jasperreport的好處在於交叉報表,子報表,特別是圖表(餅圖,柱狀圖)是html+css所沒有的。

還有就是jasperreport的導出非常方便,支持多種格式,pdf,excel。

再者,jasperreport有多種報表數據注入方式,可以和在java代碼里將實體類放在一個集合中,然後fill進報表。這樣不僅僅是sql可以進行查詢,更靈活的操作提供我們進行選擇

如果你的報表僅僅是列表顯示了看,又有很多復雜的數量計算,那麼html+css更好。

⑹ jasperreport 在table組件展示sql中添加時間段參數,取到的結果集 跟這條sql在oracle本身執行的結果不對

大家說的沒錯,只需要一個循環就行了,因為你的數據都是一樣,只要控制循環,執行1000次就好了。比如有一個ttt_test的表,裡面有個tid欄位,我插入1000個'1'。declareln_countnumber(5);beginln_count:=1;whileln_count<=1000loopinsertintottt_testvalues('1');ln_count:=ln_count+1;commit;endloop;end;

⑺ jasperreport列印excel,html為什麼部分不顯示

產生原因:在生成HTML頁面時JRHtmlExporterParameter.IMAGES_URI參數設置不正確,主要是圖片的路徑問題。由JasperReport生成Html時,那些紅叉叉是一個名稱為px像素的圖片,是內置在jasperreports包中的,在IE顯示時以圖片的形式顯示
解決辦法:根據JasperReport的源代碼顯示,我們只需要以下兩個步驟就能解決了
1、在web.xml中添加如下配置:

<servlet> <servlet-name>ImageServlet</servlet-name> <servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ImageServlet</servlet-name> <url-pattern>/servlets/image</url-pattern> </servlet-mapping>

2、在調用程序中增加如下代碼:

exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "../servlets/image?image=");

好了,經過上面兩個步驟。重啟服務,刷新頁面立馬就正常了

完整代碼:

/** * 導出html */ private static void exportHtml(JasperPrint jasperPrint,String defaultFilename, HttpServletRequest request, HttpServletResponse response) throws IOException, JRException { response.setContentType("text/html;charset=UTF-8"); JRHtmlExporter exporter = new JRHtmlExporter(); PrintWriter out = response.getWriter(); try { request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out); exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE); exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8"); exporter.setParameter(JRHtmlExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.FALSE); exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "../servlets/image?image="); exporter.exportReport(); } catch (JRException e) { logger.debug(" 生成html文件失敗 .... ...."); } }

上面的代碼就能很完美的生成html了,頁面沒有紅叉叉,chat圖也能正常顯示了

⑻ JasperReport這個報表工具怎麼樣

數據量的大小和報表工具沒有直接關系,人類的眼球是不可能直接觀察巨大數據量的,別說一天一G了,1M的呈現數據都遠遠超過人類可觀察的范圍。事實上,在報表中顯示的數據都是經過匯總或過濾後的少量數據,涉及的源數據可能有幾十G甚至上T,但到了報表顯示的內容就只剩幾十K了。

選用報表工具要考慮主要是呈現格式等問題,JasperReport是個開源產品,經過了N年歷練,穩定性和成熟性不用擔心,而且作為開源產品,其中一個顯然的優勢就是免費,但是,國外的報表模式不是很適合國內的報表,存在對復雜格式支持不足的缺點,編輯繪制報表也不是很輕松;當然,這個要看項目中的報表樣式到底有多復雜,如果格式不是很復雜,那麼JasperReport是個不錯的選擇。如果格式復雜的話,建議採用國內的報表工具(有名的也就那些)。

至於數據量,那個是數據源的問題,原則上應當由資料庫端解決,1G不算很大的數,但要看你需要呈現多長時期的報表數據,比如要看一年的匯總數據就會有幾百G的容量,這時用資料庫遍歷匯總很難做到立等可取的,除非採用內存資料庫或並行計算,但軟硬體成本都比較高。集算器能跟JasperReport無縫集成,提供高性能外存和集群計算,比傳統的關系資料庫性能更好且容易集群擴展,不失為一種選擇。

還要考慮一種情況——有些報表的數據計算復雜,用SQL很難寫,有時就把這些計算挪到報表端來做,這會導致報表性能極差(如果從DB中取數還會有JDBC的影響,速度更慢),較大的數據量還很可能導致內存溢出而崩潰(報表工具都是內存計算的),都需要綜合考慮。

⑼ ireport5.1.0和jasperreports5.1.1怎麼集成

Parameters通常是用來在列印的時候從程序里傳值到報表裡。也就是說parameters通常的是起參數傳遞的作用。他們可以被用在一些特定的場合(比如應用中SQL 查詢的條件),如report中任何一個需要從外部傳入的變數等(如一個Image對象所包括的char或報表title的字元串)。
和使用Fields一樣,parameters也需要在創建的時候定義它的數據類型。parameters的數據類型是標準的java的Object。

2
在ireport中,Parameters的機制是允許用戶通過應用程序傳遞參數致報表當中。在jasperreort中的某個對象中的expression可以通過下面的語法來訪問一個當前ireport中存在的parameter:
$P{parameter name}。
如果應用程序沒有為報表中定義的parameter賦值,那麼parameter將會取我們在定義它的時候設置的default value的值。parameters是一個Java Object,所以如果它的類型是Object類型,我們在其default value里寫下面的表達式就是錯誤的:
0.123
你必須要創建一個Object,如:
New Double(0.123)
這種寫法就是正確的。
3
在查詢中使用Parameters
Parameters可以用來做SQL查詢的條件參數的傳遞。如果你想根據部門編號(dept_id)得到客戶的詳細信息 (設計的時候我們是不知道這個部門編號的具體值是多少的).此時我們可以這樣組織查詢語句:
select * from employee where dept_id=$P{deptId}
此時SQL查詢引擎將會採用PreparedStatement來處理傳入的deptId值以此作為查詢條件參數。
如果你想直接通過parameter 值來作為SQL語句的一部分,那麼你可以使用下面的特殊語法:$P!{parameter name}。這種寫法允許你在查詢時用parameter的值來替換parameter name。例如,如果我們有一個參數名為MyWhere其值為:where dept_id=D11 ,查詢寫法如下:
Select * from employee $P!{MyWhere}
查詢時實際提交的字元串是:
Select * from employee where dept_id=D11
4
在程序里使用Parameters
在應用程序里,如果想把某個值傳遞到我們的報表中parameters時,我們可以把相關的值放入一個擴展java.util.Map介面類里,然後傳入到ireport里。如下面的代碼:

5
fillReport是一個關鍵的方法,它允許你通過一個文件名,一個參數集來傳遞到我們要調用的報表當中。例-如通過下面的處理方法我們可以讓一個處部的傳入值作為我們報表的title。
下面的是一個例子:
a).聲明一個parameter.這個parameter是java.lang.String 類型,名字為:name_report:

b).將這個parameter拖到page中的title band.修改上面的程序代碼如下:

運行時效果如下:

一般情況下,我們不需要為報表中的每一個parameters傳遞一個值,除非某一個parameter一定要從外部程序傳入時我們才需為一個parameter設置一個值。如果一個parameter外部門程序沒有為其賦值那麼ireport將使用Default Value Expression來對一個parameter進行初始化,如果連Default Value Expression沒有設置那麼它的值就是null。
事實上,對於一個parameters我們不僅僅可以傳遞一個String,Integer,Boolean等java中小的對象,同時我們還可以利用parameters來傳遞一些足夠大足夠復雜的對象,比如一個圖像(java.awt.Image),或者通過一個parameters來為一個為子報表提供的datasource 連接等。在用Map類型傳遞參數時我們要注意傳遞的參數要與report里的parameters類型保持一致,否則會拋出ClassCastException。
ireport內嵌的Parameters:
ireport提供了一些內建的parameters,這些parameters對於用戶來說是只讀的。內嵌的parameters列表如下:

同為比較常用的java報表生成工具,FineReport對參數的解讀和使用方法與ireport有所不同,具體實現思路和步驟如下,供ireport使用者借鑒:
在大多數情況下,我們並不需要報表把資料庫中所有的數據都呈現出來,而是要根據一些條件來過濾出我們想要的數據,這就是參數查詢。
FineReport報表中就是使用參數來動態的過濾數據的,實現用戶和數據的實時交互,如下圖:
註:滑鼠移至參數界面的中間區域會出現收縮按鈕,折疊或展開參數查詢界面。

如何實現參數查詢
幾乎所有的統計報表都會有類似上圖的統計條件,傳統的做法是使用如ext、html等編程實現,工作量大且維護成本高。
Finereport報表只需要通過參數的定義,添加參數控制項綁定數據、參數過濾和參數面板樣式三個步驟便可以輕松實現參數查詢,零代碼,維護簡單。
實現步驟
FR報表提供了參數界面的概念,讓用戶快速製作出參數表單界面,製作參數查詢界面的步驟如下:
參數定義:設置參數名稱,添加參數,根據實際情況的不同添加不同種類的參數,詳細請查看參數的種類與區別。
添加控制項綁定數據:FineReport參數查詢,是在參數面板中添加控制項,使控制項名字與參數名稱一樣,通過該控制項將其控制項值傳遞給參數,實現動態修改參數值得效果,可為控制項綁定數據,直接選擇;
參數面板樣式設定:設置參數界面中控制項的位置,參數面板的位置,背景等等。

參數應用實例之URL給參數傳遞中文值
雖然我們建議模板名稱、參數變數名稱都用英文,但是對於中國式的復雜報表,參數肯定有中文情況。
使用ie瀏覽器通過url給參數賦值為中文時,會發現中文值會出現亂碼,如下圖所示

問題原因
因為瀏覽器編碼與伺服器編碼不一致,導致中文url輸入會產生亂碼,無法被正常識別。
解決方案
通過url給參數賦值一般應用在報表已經集成到項目中,希望點擊某個鏈接將某個值傳遞給報表;而在瀏覽器中直接給參數賦值呢,一般是做測試使用的,此時可以將瀏覽器換成火狐或者谷歌。
集成到項目中,可以使用FR.cjkEncode()方法,如點擊某個鏈接給col賦值為地區,此時可以使用如下方法:
1. window.location="http://localhost:8080/WebReport/ReportServer?reportlet=doc/Parameter/DynamicCol/DynamicCol.cpt&col="+FR.cjkEncode("中文名稱")