最近的项目中使用了Crystal Report作为报表工具,与Jasper Report不同,在报表的灵活性和开发速度上要胜出很多,一旦用上就不愿意换其他了。
在Web application中使用CR,主要可以通过两种方案实施:
一种是将rpt文件嵌入application中,该方案实施简单、快速,最重要的不受license限制,是普通项目开发的绝佳选择。我们可以直接去Business Objects上面下载一个已经集成了CR开发插件的Eclipse,或者只下载插件也可以。利用该插件中的开发向导,可以非常容易的进行开发了。
生成HTML报表也是相当的简单,我们可以通过CR提供的标签库生成:
另外一种是集成Crystal Enterprise Server进行报表开发。所有的rpt都在server上,application 可以通过包括Enterprise account,LDAP,Windows NT(如果是Window服务器)等多种方式登陆Server读取报表。该方案中rpt可以提供多个应用使用,并且方便管理及二次开发,但是license非常贵,因此,主要是应用在大型项目中。
其中最简单的便是使用Enterprise Account方式登录了:
但是,这里特别需要注意的是,CMS的值必须是Enterprise server的名称,而不能使用IP地址。
在此方案中,可以使用一个iFrame直接将Server中生成的报表包含进来(CR enterprise portlet就是这样干的)。
在Web application中使用CR,主要可以通过两种方案实施:
一种是将rpt文件嵌入application中,该方案实施简单、快速,最重要的不受license限制,是普通项目开发的绝佳选择。我们可以直接去Business Objects上面下载一个已经集成了CR开发插件的Eclipse,或者只下载插件也可以。利用该插件中的开发向导,可以非常容易的进行开发了。
生成HTML报表也是相当的简单,我们可以通过CR提供的标签库生成:
<%
@ taglib uri="/WEB-INF/tld/crystal-tags-reportviewer.tld" prefix="crviewer"
%>
< crviewer:viewer
isOwnPage ="true"
displayGroupTree ="false"
printMode ="ActiveX"
allowDrillDown ="false"
hyperlinkTarget ="false"
displayToolbarViewList ="false"
displayToolbarFindButton ="false"
displayToolbarToggleTreeButton ="false"
displayToolbarCrystalLogo ="false"
reportSourceType ="reportingComponent"
viewerName ="CrystalReport1-viewer"
reportSourceVar ="CrystalReport1" >
< crviewer:report reportName ="Test.rpt" />
</ crviewer:viewer >
也可以通过自己写代码读取report source,然后作为一个javabean供表现层使用:
< crviewer:viewer
isOwnPage ="true"
displayGroupTree ="false"
printMode ="ActiveX"
allowDrillDown ="false"
hyperlinkTarget ="false"
displayToolbarViewList ="false"
displayToolbarFindButton ="false"
displayToolbarToggleTreeButton ="false"
displayToolbarCrystalLogo ="false"
reportSourceType ="reportingComponent"
viewerName ="CrystalReport1-viewer"
reportSourceVar ="CrystalReport1" >
< crviewer:report reportName ="Test.rpt" />
</ crviewer:viewer >
/** */
/**
* Retrieve embedded report source by the specified report name.
*
* @param reportName
* @return
*/
private static IReportSource getEmbeddedReport(String reportName) {
IReportSource reportSource = null;
String report = CRConstant.EMBEDDED_RPT_FOLDER + reportName + ".rpt";
ReportClientDocument reportClientDoc = new ReportClientDocument();
try {
reportClientDoc.open(report, 0);
} catch (ReportSDKException e) {
log.warn("Cant get embedded report source");
log.error(e.getMessage());
}
reportSource = reportClientDoc.getReportSource();
return reportSource;
}
非标签方式生成HTML报表
* Retrieve embedded report source by the specified report name.
*
* @param reportName
* @return
*/
private static IReportSource getEmbeddedReport(String reportName) {
IReportSource reportSource = null;
String report = CRConstant.EMBEDDED_RPT_FOLDER + reportName + ".rpt";
ReportClientDocument reportClientDoc = new ReportClientDocument();
try {
reportClientDoc.open(report, 0);
} catch (ReportSDKException e) {
log.warn("Cant get embedded report source");
log.error(e.getMessage());
}
reportSource = reportClientDoc.getReportSource();
return reportSource;
}
<%
@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<% @ page import="com.crystaldecisions.reports.reportengineinterface.*" %>
<% @ page import="com.crystaldecisions.report.web.viewer.*" %>
<%
CrystalReportViewer viewer = (CrystalReportViewer)session.getAttribute("crViewer");
viewer.processHttpRequest(request, response, getServletConfig().getServletContext(), null);
%>
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<% @ page import="com.crystaldecisions.reports.reportengineinterface.*" %>
<% @ page import="com.crystaldecisions.report.web.viewer.*" %>
<%
CrystalReportViewer viewer = (CrystalReportViewer)session.getAttribute("crViewer");
viewer.processHttpRequest(request, response, getServletConfig().getServletContext(), null);
%>
另外一种是集成Crystal Enterprise Server进行报表开发。所有的rpt都在server上,application 可以通过包括Enterprise account,LDAP,Windows NT(如果是Window服务器)等多种方式登陆Server读取报表。该方案中rpt可以提供多个应用使用,并且方便管理及二次开发,但是license非常贵,因此,主要是应用在大型项目中。
其中最简单的便是使用Enterprise Account方式登录了:
/** */
/**
* Loging Crystal Enterprise server
*
*/
private void createEnterpriseSession() throws SDKException {
String cms = CRConstant.CMS;
String userName = CRConstant.AUTH_USERNAME;
String password = CRConstant.AUTH_PASSWORD;
String authMode = CRConstant.AUTH_MODE;
try {
ISessionMgr sessionMgr = CrystalEnterprise.getSessionMgr();
iEnterpriseSession = sessionMgr.logon(userName, password, cms, authMode);
log.info("Got Enterprise session successfully");
} catch (SDKException e) {
log.warn("Cant log on CMS:\nCMS:" + cms + "\nUserID:"
+ userName + "\nPassword:" + password + "\nAuthMode:"
+ authMode);
throw e;
}
}
* Loging Crystal Enterprise server
*
*/
private void createEnterpriseSession() throws SDKException {
String cms = CRConstant.CMS;
String userName = CRConstant.AUTH_USERNAME;
String password = CRConstant.AUTH_PASSWORD;
String authMode = CRConstant.AUTH_MODE;
try {
ISessionMgr sessionMgr = CrystalEnterprise.getSessionMgr();
iEnterpriseSession = sessionMgr.logon(userName, password, cms, authMode);
log.info("Got Enterprise session successfully");
} catch (SDKException e) {
log.warn("Cant log on CMS:\nCMS:" + cms + "\nUserID:"
+ userName + "\nPassword:" + password + "\nAuthMode:"
+ authMode);
throw e;
}
}
但是,这里特别需要注意的是,CMS的值必须是Enterprise server的名称,而不能使用IP地址。
在此方案中,可以使用一个iFrame直接将Server中生成的报表包含进来(CR enterprise portlet就是这样干的)。