Web application 中使用Crystal Report(一)
Posted on 2007-04-11 23:26 馬達+斯加 閱讀(1759) 評論(8) 編輯 收藏 所屬分類: Java Report最近的項目中使用了Crystal Report作為報表工具,與Jasper Report不同,在報表的靈活性和開發速度上要勝出很多,一旦用上就不愿意換其他了。
在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供表現層使用:

/** *//**
* 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報表

<%
@ 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);
%>
另外一種是集成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;
}
}
但是,這里特別需要注意的是,CMS的值必須是Enterprise server的名稱,而不能使用IP地址。
在此方案中,可以使用一個iFrame直接將Server中生成的報表包含進來(CR enterprise portlet就是這樣干的)。
在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就是這樣干的)。