Web application 中使用Crystal 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 中使用Crystal Report(一))