报表导出设计方案

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.youkuaiyun.com/bookfiles/659/
### 报表导出中心设计方案与架构的最佳实践 报表导出中心的设计方案和架构需要综合考虑功能性、性能、安全性以及用户体验等多个方面。以下从技术架构设计、功能实现、性能优化、安全性和用户体验等方面进行详细说明。 #### 1. **技术架构设计** 报表导出中心的技术架构应以模块化和可扩展性为核心目标,确保能够适应不同业务场景的需求。常见的技术架构包括以下几个部分: - **数据源层**:支持多种数据源接入(如关系型数据库、NoSQL 数据库、大数据平台等),通过统一的接口规范获取数据[^1]。 - **服务层**:提供报表生成、格式转换、任务调度等功能,采用微服务架构将各功能模块解耦[^2]。 - **存储层**:用于缓存生成的报表文件,支持分布式存储以提高访问效率[^4]。 - **用户交互层**:提供前端界面供用户选择报表模板、设置参数并下载生成的报表[^5]。 ```python # 示例代码:报表导出服务的核心逻辑 class ReportExporter: def __init__(self, data_source, template_engine): self.data_source = data_source self.template_engine = template_engine def export(self, report_id, params): # 从数据源获取数据 data = self.data_source.fetch_data(report_id, params) # 使用模板引擎生成报表 report_content = self.template_engine.render(data) # 返回生成的报表内容 return report_content ``` #### 2. **功能实现** 在功能实现上,报表导出中心需要满足以下核心需求: - **多格式支持**:支持 Excel、PDF、CSV 等常见格式的导出,满足不同用户的使用习惯[^4]。 - **动态参数配置**:允许用户通过界面或 API 配置报表参数,例如时间范围、筛选条件等[^5]。 - **批量导出**:支持一次性导出多个报表,减少用户操作步骤[^1]。 - **任务队列管理**:对于大文件或复杂报表,采用异步任务队列处理,避免阻塞主线程。 #### 3. **性能优化** 为了提升报表导出的效率,可以从以下几个方面进行优化: - **数据预处理**:对常用报表的数据进行预计算和缓存,减少实时查询的压力。 - **并发控制**:限制同时导出的任务数量,防止资源耗尽[^4]。 - **分页导出**:对于超大数据量的报表,采用分页方式逐步导出,降低内存占用。 #### 4. **安全性** 在报表导出过程中,安全性是不可忽视的重要因素: - **权限控制**:确保用户只能导出其有权限访问的报表数据[^3]。 - **数据脱敏**:对敏感字段进行脱敏处理,防止数据泄露[^3]。 - **日志审计**:记录每次导出操作的详细信息,便于后续追踪和分析。 #### 5. **用户体验** 良好的用户体验可以显著提升用户满意度: - **加载动画**:在报表生成过程中显示加载状态,告知用户当前进度[^5]。 - **错误提示**:当导出失败时,提供清晰的错误信息和解决方案。 - **通知机制**:对于异步导出的任务,通过邮件或消息推送的方式通知用户下载链接。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值