水晶报表Crystal Reports实例
一.安裝
官網下載試用安裝工具Crystal Reports,注冊獲得試用期30天。
二.配置數據源
Crystal Reports 2008(水晶報表) JDBC連接mysql數據庫 - Hongten - 博客園
三.優缺點
使用Crystal Reports嘗試配置模板的體驗,主要與Jasper Studio對比。
3.1 優點
1.流式布局,交互類似office
2.官方demo豐富
3.2 缺點
1.通過URL加載的圖片不支持https,只接受http
Does Crystal Reports support secure (HTTPS) images - Stack Overflow
2.相關教程博客很少
3.集成至開發環境對C#友好,JAVA對eclipse友好,無idea開發控件,官方demo通過jsp的形式查看報表
四.集成到項目
4.1 SDK
由于官方沒有提供idea插件,需要額外引入依賴項文件,下載地址如下,在該頁面中下載 Runtime Libraries:
SAP Crystal Reports, version for Eclipse - Downloads
值得注意的是,直接從Crystal Reports工具的lib中也可以找到看上去相似的sdk文件,接口完全相同但是實現完全不同,不可引入項目使用。
maven資源庫無所需依賴項,需要在項目配置中單獨添加lib文件。
官方API文檔:
Overview (Report Application Server Java SDK)
4.2 實戰
官方提供了大量demo程序:
Crystal Reports Java SDK Samples - Business Intelligence (BusinessObjects) - Community Wiki
下面總結一些常用API范例:
4.2.1導出PDF到瀏覽器
配置模板如下:
?輸出PDF樣例代碼如下:
// 讀取模板文件 ReportClientDocument reportClientDoc = new ReportClientDocument(); reportClientDoc.open("./reports/jrc_export_report.rpt", 0); ByteArrayInputStream byteArrayInputStream = (ByteArrayInputStream) reportClientDoc.getPrintOutputController().export(ReportExportFormat.PDF); reportClientDoc.close(); // 輸出PDF byte[] buffer = new byte[byteArrayInputStream.available()]; int bytesRead = 0; response.reset(); response.setHeader("Content-disposition", "inline;filename=report.pdf"); response.setContentType("application/pdf"); while ((bytesRead = byteArrayInputStream.read(buffer)) != -1) {response.getOutputStream().write(buffer, 0, bytesRead); } response.getOutputStream().flush(); response.getOutputStream().close();PDF效果圖如下所示:
?4.2.2數據庫連接
在第一個樣例中,數據庫連接配置在模板中,不需要由代碼配置,這也是默認的連接方式。
如需要更改數據庫連接,參考官方實例change_db_location(CRJ12_Sample_Codes\RCAPI),大致如下:
String REPORT_NAME = "change_db_location/simplereport.rpt"; String DBUSERNAME = "vantech"; String DBPASSWORD = "vantech"; ? String CONNECTION_STRING = "!com.microsoft.jdbc.sqlserver.SQLServerDriver!jdbc:microsoft:sqlserver://10.50.212.103:1433;DatabaseName={database};user={userid};password={password}"; String TRUSTEDCON = "false"; String PREQESERVERNAME = "jdbc:microsoft:sqlserver://10.50.212.103:1433"; String SERVERTYPE = "JDBC (JNDI)"; String DATABASE_DLL = "crdb_jdbc.dll"; String DATABASE = "Xtreme"; String DBCLASSNAME = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; String USEJDBC = "true"; String DATABASE_NAME = "Xtreme"; String SERVERNAME = "jdbc:microsoft:sqlserver://10.50.212.103:1433"; String CONNECTIONURL = "jdbc:microsoft:sqlserver://10.50.212.103:1433"; String SERVER = "10.50.212.103"; ? //Open report. ReportClientDocument boReportClientDocument = new ReportClientDocument(); boReportClientDocument.open(REPORT_NAME, 0); ? // Set DB Username and Password boReportClientDocument.getDatabaseController().logon(DBUSERNAME, DBPASSWORD); ? // Create the two connectioninfo objects to use IConnectionInfo oldConnectionInfo = new ConnectionInfo(); IConnectionInfo newConnectionInfo = new ConnectionInfo(); ? // Assign the old Connection info to the reports current info DatabaseController dbController = boReportClientDocument.getDatabaseController(); oldConnectionInfo = dbController.getConnectionInfos(null).getConnectionInfo(0); ? // If this connection needed parameters, we would use this field. Fields pFields = null; ? // Create a new propertybag for the new location PropertyBag boPropertyBag1 = new PropertyBag(); ? // Set new table logon properties boPropertyBag1.put("JDBC Connection String", CONNECTION_STRING); boPropertyBag1.put("Trusted_Connection", TRUSTEDCON); boPropertyBag1.put("PreQEServerName", PREQESERVERNAME); boPropertyBag1.put("Server Type", SERVERTYPE); boPropertyBag1.put("Database DLL", DATABASE_DLL); boPropertyBag1.put("Database", DATABASE); boPropertyBag1.put("Database Class Name", DBCLASSNAME); boPropertyBag1.put("Use JDBC", USEJDBC); boPropertyBag1.put("Database Name", DATABASE_NAME); boPropertyBag1.put("Server Name", SERVERNAME); boPropertyBag1.put("Connection URL", CONNECTIONURL); boPropertyBag1.put("Server", SERVER); ? // Assign the properties to the connection info newConnectionInfo.setAttributes(boPropertyBag1); ? // Set the DB Username and Pwd newConnectionInfo.setUserName(DBUSERNAME); newConnectionInfo.setPassword(DBPASSWORD); ? // The Kind of connectionInfos is SQL newConnectionInfo.setKind(ConnectionInfoKind.SQL); ? // set the parameters to replace. // The 4 options are: // _doNotVerifyDB // _ignoreCurrentTableQualifiers // _mapFieldByRowsetPosition // _useDefault int replaceParams = DBOptions._ignoreCurrentTableQualifiers + DBOptions._doNotVerifyDB; ? // Now replace the connections dbController.replaceConnection(oldConnectionInfo, newConnectionInfo, pFields, replaceParams);4.2.3動態注入參數
參考樣例:Java_CRJ12_Web_Set_Parameters(CRJ12_Sample_Codes\ViewingExport)
模板配置如下:
?數據填充示例如下:
ReportClientDocument document = new ReportClientDocument(); document.setReportAppServer(ReportClientDocument.inprocConnectionString); document.open("./reports/Java_CRJ12_Web_Set_Parameters.rpt", OpenReportOptions._openAsReadOnly); ParameterFieldController parameterFieldController = document.getDataDefController().getParameterFieldController(); parameterFieldController.setCurrentValue("", "StringParam", "Hello"); parameterFieldController.setCurrentValue("sub", "StringParam", "Subreport string value"); parameterFieldController.setCurrentValue("", "BooleanParam", true); parameterFieldController.setCurrentValue("", "CurrencyParam", 123.45); parameterFieldController.setCurrentValue("", "NumberParam", 123); Calendar calendar = Calendar.getInstance(); calendar.clear(); // Ensure h:m:s and milliseconds cleared calendar.set(2004, Calendar.FEBRUARY, 17); // February 17, 2004 - Month is 0-based. parameterFieldController.setCurrentValue("", "DateParam", calendar.getTime()); calendar.clear(); calendar.set(2002, Calendar.JUNE, 12, 8, 23, 15); parameterFieldController.setCurrentValue("", "DateTimeParam", calendar.getTime()); calendar.clear(); calendar.set(2002, Calendar.JUNE, 12, 13, 44, 59); parameterFieldController.setCurrentValue("", "TimeParam", calendar.getTime()); // Multi-valued string parameterFieldController.setCurrentValues("", "StringMultiParam",new Object[]{"One String", "Two String", "Three String"}); // Range value ParameterFieldRangeValue parameterFieldRangeValue = new ParameterFieldRangeValue(); parameterFieldRangeValue.setBeginValue(1); parameterFieldRangeValue.setEndValue(100); parameterFieldRangeValue.setLowerBoundType(RangeValueBoundType.inclusive); parameterFieldRangeValue.setUpperBoundType(RangeValueBoundType.inclusive); parameterFieldController.setCurrentValue("", "NumberRangeParam", parameterFieldRangeValue); // Multi Range values ParameterFieldRangeValue[] parameterFieldRangeValues = new ParameterFieldRangeValue[2]; parameterFieldRangeValues[0] = new ParameterFieldRangeValue(); parameterFieldRangeValues[0].setBeginValue(12); parameterFieldRangeValues[0].setEndValue(15); parameterFieldRangeValues[0].setLowerBoundType(RangeValueBoundType.inclusive); parameterFieldRangeValues[0].setUpperBoundType(RangeValueBoundType.exclusive); parameterFieldRangeValues[1] = new ParameterFieldRangeValue(); parameterFieldRangeValues[1].setBeginValue(100); parameterFieldRangeValues[1].setEndValue(200); parameterFieldRangeValues[1].setLowerBoundType(RangeValueBoundType.exclusive); parameterFieldRangeValues[1].setUpperBoundType(RangeValueBoundType.exclusive); parameterFieldController.setCurrentValues("", "NumberMultiRangeParam", parameterFieldRangeValues);最終輸出PDF效果:
?4.2.4子報表
與4.2.3采用相同示例,配置模板如下:
?實際展示效果如4.2.3
五.收費模式
1.配置工具
工具名稱:SAP Crystal Reports2016
軟件單價8600元,在線備份服務76.25元,數據來源為官網,查閱時間為2019年8月8日。
2.開發工具包
免費。
總結
以上是生活随笔為你收集整理的水晶报表Crystal Reports实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电子元器件篇—三极管
- 下一篇: 小白学习Excel VBA (一)