6.7 报表导出设计方案
报表作为一种分析数据的工具,主要用来让用户查看分析结果,但如果用户的机器上没有安装报表工具,该如何查看呢?这是可以将其导出为各种文件格式,以供用户查看。本节将对报表导出设计方案进行详细介绍。
6.7.1 CrystalReportviewer控件方案
Crystal Reports for Visual Studio 2005的所有版本中提供的报表查看器控件都是CrystalReportViewer控件。CrystalReportViewer控件封装了在窗体上正确显示报表所需的全部显示信息。它还具有用于配置该控件的外观的属性。使用CrystalReportViewer控件工具栏中的导出按钮可以快速将报表数据导出不同文件的类型。
1.方案分析
在保存报表文件的时候,报表文件只能以扩展名.RPT保存在磁盘上。这种Crystal Report独有的.RPT文件格式只能在某些特定环境下使用查看效果。由于需查看报表的人不可能都装有Crystal Report系列产品工具,所以就产生了多种方法将报表文件.RPT转换成不同文件格式,以方便用户查看。
CrystalReportViewer控件工具栏中的【导出】按钮,不需要编写任何代码就能方便快捷的将报表文件格式转换为,RPT、PDF、DOC、XLS或RTF等文件格式。
2.实施过程
实例位置:光盘/ mr/06/6.7/6.7.1/01
本实例,使用CrystalReportViewer控件工具栏中的【导出】按钮,将报表数据导成.PDF格式的文件,如图6.144所示。
图6.144 导出.PDF文件效果
CrystalReportViewer控件导出报表方案的实施步骤如下:
(1)使用CrystalReportViewer加载和显示报表,单击控件工具栏中的【导出】按钮,如图6.145所示。
图6.145 单击【导出】按钮
(2)弹出“导出报表”对话框”,在“请从列表中选择导出格式”下拉列表框中选择“Acrobat格式(PDF)”选项,选择“所有”单选按钮。如图6.146所示。
图6.146 “导出报表”对话框
(3)单击【确定】按钮,弹出“文件下载”对话框,如图6.17所示。
图6.147 “文件下载”对话框
(4)单击【保存】按钮,弹出“另存为”对话框,选择保存文件的路径,如图6.148所示。
图6.148 “另存为”对话框
(5)单击【保存】按钮,保存文件,弹出“下载完毕”对话框,可以单击【打开】按钮查看保存的文件,如图6.149所示。
图6.149 “下载完毕”对话框
3.补充说明
使用CrystalReportViewer控件的最佳做法,高效的Web应用程序会将其表示层与其基础业务逻辑明确分开。
ASP.NET控件的设计在本质上就提倡这种方式。它将表示信息封装到控件中,然后将该控件绑定到执行业务逻辑的基础对象或对象模型。
CrystalReportViewer是一个遵循此结构的.NET控件。它在Web或Windows窗体(表示层)上起一个显示对象的作用,并且可以绑定到以下报表对象模型中的任何一个。
l ReportDocument对象模型。
l 可通过升级获得的对象模型。
² ReportClientDocument对象模型(Report Application Server)
² InfoObject对象模型(Crystal Reports Server或BusinessObjects Enterprise)
在最佳方案中,CrystalReportViewer控件绑定到其中一个执行业务逻辑(通常是对报表进行操作)的对象模型。
在该方案中,CrystalReportViewer控件将其编程交互限制为只修改显示设置,例如,隐藏或显示查看器的工具栏或该工具栏中的一个按钮。
6.7.2 ReportDocument对象方案
ReportDocument对象模型最常见的应用方法之一就是运行报表并导出到另一种文件格式。ReportDocument类属于CrystalDecisions.CrystalReports.Engine命名空间。它起到一条通道的作用,通向Engine命名空间中的一组类,这些类为通过编程方式对报表进行操作提供了更多工具。
1.方案分析
虽然CrystalReportViewer控件已提供导出按钮来让开发者导出报表格式。但是只能将报表导出RPT、PDF、DOC、XLS或RTF等文件格式。借助于ReportDocument对象的Export()方法,不仅能自行掌握如何导出报表,还可以将报表导出成以下文件格式:
l Crystal Report文件
l Microsoft Excel文件
l Excel记录文件
l HTML3.2文件
l HTML4.0文件
l 未指定导出格式
l PDF文件
l Rich Text文件
l Microsoft Word文件
2.实施过程
实例位置:光盘/ mr/06/6.7/6.7.2/01
本实例,使用ReportDocument对象的Export()方法动态的将报表导出多种文件格式,运行报表,在“选择导出文件格式”下拉列表中选择“WordForWindows”选项,单击【确定】按钮,将报表导出(.DOC)文件,效果如图6.150和图6.151所示。
图6.150 报表设计界面
图6.151 报表导出效果
ReportDocument对象方案的实施步骤如下:
(1)在页面中引入如下命名空间,用于使用ReportDocument对象和对数据库操作:
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Data.SqlClient;
(2)在页面基类的顶部,添加3个类声明、两个字符串变量和一个bool型变量,代码如下:
public string exportPath;//存储导出报表的文件路径
public string exportInfo;//存储、提示信息
public DiskFileDestinationOptions diskFileDestinationOptions;
public ExportOptions exportOptions;
public ReportDocument hierarchicalGroupingReport = new ReportDocument();
public bool selectedNoFormat = false;//判断是否选择导出格式
(3)自定义一个加载报表数据的方法,在页面的加裁事件中设用该方法,代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
FileDReportDocument();//调用方法加载报表
}
}
public void FileDReportDocument()
{
exportTypesList.DataSource = System.Enum.GetValues(typeof(ExportFormatType));
exportTypesList.DataBind();
SqlConnection con = new SqlConnection("server=(local);uid=sa;pwd=;database=db_06");
con.Open();
SqlDataAdapter da = new SqlDataAdapter("select * from tb_employ", con);
DataSet ds = new DataSet();
da.Fill(ds, "tb_worke");
con.Close();
hierarchicalGroupingReport.Load(Server.MapPath("CrystalReport2.rpt"));//加载报表路径
hierarchicalGroupingReport.SetDataSource(ds);加载报表数据源
this.CrystalReportViewer1.ReportSource = hierarchicalGroupingReport;//为CrystalReportViewer控件指定报表
}
(4)自定义一个初始化方法ExportSetup(),主要初始化报表导出路径和初始化基类,主要代码如下:
private void ExportSetup()
{
try
{
exportPath = "C://Exported//";
if (!System.IO.Directory.Exists(exportPath))
{
System.IO.Directory.CreateDirectory(exportPath);
}
hierarchicalGroupingReport.Load(Server.MapPath("CrystalReport2.rpt"));//加载报表路径
diskFileDestinationOptions = new DiskFileDestinationOptions();
exportOptions = hierarchicalGroupingReport.ExportOptions;
exportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
exportOptions.FormatOptions = null;
}
catch (Exception ee)
{
Response.Write(ee.Message.ToString());
}
}
(5)自定义导出各种文件类型的方法,主要代码如下。
自定义ConfigureExportToRpt方法,导出.rpt文件(.rpt),主要代码如下:
private void ConfigureExportToRpt()
{
exportOptions.ExportFormatType = ExportFormatType.CrystalReport;
exportInfo = exportPath + "Report.rpt";
diskFileDestinationOptions.DiskFileName = exportPath + "Report.rpt";
exportOptions.DestinationOptions = diskFileDestinationOptions;
}
自定义ConfigureExportToRtf方法,导出.rtf文件(.rtf),主要代码如下:
private void ConfigureExportToRtf()
{
exportOptions.ExportFormatType = ExportFormatType.RichText;
diskFileDestinationOptions.DiskFileName = exportPath + "RichTextFormat.rtf";
exportOptions.DestinationOptions = diskFileDestinationOptions;
exportInfo = exportPath + "RichTextFormat.rtf";
}
自定义ConfigureExportToDoc方法,导出.doc文件(.doc),主要代码如下:
private void ConfigureExportToDoc()
{
exportOptions.ExportFormatType = ExportFormatType.WordForWindows;
diskFileDestinationOptions.DiskFileName = exportPath + "Word.doc";
exportOptions.DestinationOptions = diskFileDestinationOptions;
exportInfo = exportPath + "Word.doc";
}
自定义ConfigureExportToXls方法,导出.xls文件(.xls),主要代码如下:
private void ConfigureExportToXls()
{
exportOptions.ExportFormatType = ExportFormatType.Excel;
diskFileDestinationOptions.DiskFileName = exportPath + "Excel.xls";
exportOptions.DestinationOptions = diskFileDestinationOptions;
exportInfo = exportPath + "Excel.xls";
}
自定义ConfigureExportToPdf方法,导出.pdf文件(.pdf)),主要代码如下:
private void ConfigureExportToPdf()
{
exportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
diskFileDestinationOptions.DiskFileName = exportPath + "PortableDoc.pdf";
exportOptions.DestinationOptions = diskFileDestinationOptions;
exportInfo = exportPath + "PortableDoc.pdf";
}
自定义ConfigureExportToPdf方法,导出.html文件(.html),主要代码如下:
private void ConfigureExportToHtml32()
{
exportOptions.ExportFormatType = ExportFormatType.HTML32;
HTMLFormatOptions html32FormatOptions = new HTMLFormatOptions();
html32FormatOptions.HTMLBaseFolderName = exportPath + "Html32Folder";
html32FormatOptions.HTMLFileName = "html32.html";
html32FormatOptions.HTMLEnableSeparatedPages = false;
html32FormatOptions.HTMLHasPageNavigator = false;
exportOptions.FormatOptions = html32FormatOptions;
exportInfo = exportPath + "Html32Folder";
}
自定义ConfigureExportToPdf方法,导出html40.html文件(.html),主要代码如下:
private void ConfigureExportToHtml40()
{
exportOptions.ExportFormatType = ExportFormatType.HTML40;
HTMLFormatOptions html40FormatOptions = new HTMLFormatOptions();
html40FormatOptions.HTMLBaseFolderName = exportPath + "Html40Folder";
html40FormatOptions.HTMLFileName = "html40.html";
html40FormatOptions.HTMLEnableSeparatedPages = true;
html40FormatOptions.HTMLHasPageNavigator = true;
html40FormatOptions.FirstPageNumber = 1;
html40FormatOptions.LastPageNumber = 3;
exportOptions.FormatOptions = html40FormatOptions;
exportInfo = exportPath + "Html40Folder";
}
自定义ConfigureExportToXlsRec方法,导出ExcelRecord类型文件,主要代码如下:
private void ConfigureExportToXlsRec()
{
exportOptions.ExportFormatType = ExportFormatType.ExcelRecord;
diskFileDestinationOptions.DiskFileName = exportPath + "ExcelRecord.xls";
exportOptions.DestinationOptions = diskFileDestinationOptions;
exportInfo = exportPath + "ExcelRecord.xls";
}
(6)在【确定】按钮下的单击事件中,根据选择导出文件的格式,调用相应的方法,主要代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
try
{
ExportSetup();//调用方法实例对象
switch ((ExportFormatType)exportTypesList.SelectedIndex)//判断
{
case ExportFormatType.NoFormat:
selectedNoFormat = true;
break;
case ExportFormatType.CrystalReport:
ConfigureExportToRpt();
break;
case ExportFormatType.RichText:
ConfigureExportToRtf();
break;
case ExportFormatType.WordForWindows:
ConfigureExportToDoc();
break;
case ExportFormatType.Excel:
ConfigureExportToXls();
break;
case ExportFormatType.PortableDocFormat:
ConfigureExportToPdf();
break;
case ExportFormatType.HTML32:
ConfigureExportToHtml32();
break;
case ExportFormatType.HTML40:
ConfigureExportToHtml40();
break;
case ExportFormatType.ExcelRecord:///新语句两种新的导出格式添加到项目。
ConfigureExportToXlsRec();
break;
}
if (!selectedNoFormat)
{
hierarchicalGroupingReport.Export();
Response.Write("<script>alert('报表已导出至'+'" + exportInfo + "');</script>");
FileDReportDocument();//调用方法加载报表
}
else
{
Response.Write("<script>alert('你选择了未指定导出格式选项');</script>");
FileDReportDocument();//调用方法加载报表
}
}
catch (Exception eee)
{
Response.Write(eee.Message.ToString());
}
}
3.补充说明
如果想将Crystal报表导出到浏览器窗口,或将报表作为附件导出,可以使用ExportToHttpResponse()方法,此方法仅用于网站。
实例位置:光盘/ mr/06/6.7/6.7.2/02
本实例,实现导出的报表会在浏览器窗口中打开。如图6.152所示。
图6.152 导出的报表在浏览器窗口中打开效果
将Crystal报表导出到浏览器窗口步骤如下:
(1)在页面中引入如下命名空间。用于使用ReportDocument对象和对数据库操作:
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Data.SqlClient;
(2)自定义一个加载报表数据的方法,在页面的加载事件中使用该方法,代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
FileDReportDocument();//调用方法加载报表
}
}
public void FileDReportDocument()
{
exportTypesList.DataSource = System.Enum.GetValues(typeof(ExportFormatType));
exportTypesList.DataBind();
SqlConnection con = new SqlConnection("server=(local);uid=sa;pwd=;database=db_06");
con.Open();
SqlDataAdapter da = new SqlDataAdapter("select * from tb_employ", con);
DataSet ds = new DataSet();
da.Fill(ds, "tb_worke");
con.Close();
ReportDocument hierarchicalGroupingReport = new ReportDocument();
hierarchicalGroupingReport.Load(Server.MapPath("CrystalReport2.rpt"));//加载报表路径
hierarchicalGroupingReport.SetDataSource(ds);加载报表数据源 this.CrystalReportViewer1.ReportSource = hierarchicalGroupingReport;
}
(6)在【确定】按钮的单击事件中,根据选择导出文件的格式,将报表导出到浏览器窗口,主要代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
if ((ExportFormatType)exportTypesList.SelectedIndex == ExportFormatType.NoFormat)
{
Response.Write("<script>alert('你选择了未指定导出格式选项');</script>");
FileDReportDocument();//调用方法加载报表
}
else
{
if ((ExportFormatType)exportTypesList.SelectedIndex == ExportFormatType.HTML32 || (ExportFormatType)exportTypesList.SelectedIndex == ExportFormatType.HTML40)
{
Response.Write("<script>alert('ExportToHttpResponse方法不支持定HTML32和HTML40 格式');</script>");
FileDReportDocument();//调用方法加载报表
}
else
{
ReportDocument hierarchicalGroupingReport = new ReportDocument();
hierarchicalGroupingReport.Load(Server.MapPath("CrystalReport2.rpt"));//加载报表路径
ExportOptions exportOptions = hierarchicalGroupingReport.ExportOptions;
exportOptions.ExportFormatType = (ExportFormatType)exportTypesList.SelectedIndex;
hierarchicalGroupingReport.ExportToHttpResponse(exportOptions, Response, false, "ExportedReport");
}
}
}
http://book.csdn.net/bookfiles/659/