[ASP NET MVC] 使用ReportViewer执行用户端报表定义文件(.rdlc)产出报表

使用ReportViewer执行用户端报表定义文件(.rdlc)来产出报表

前言

以往使用ASP.NET WebForm进行网站开发时,笔者面对报表的产出多会使用ReportViewer来进行,并且搭配用户端报表定义文件(.rdlc)来设计报表外观,其实是相当灵活的解决方案;如今使用ASP.NET MVC进行开发,虽然View中无法加入任何WebForm Control了,但我们依旧可以建立一个共用WebForm页面,在此页面上加入熟悉的ReportViewer来协助产出报表。详细实践细节请参考以下文章。

实践说明

整体实践概念就是建立一个WebForm页面于ASP.NET MVC项目中,利用该WebForm页面来实践ReportViewer相关产出报表工作;最终当有报表产出需求时,仅需在Controller中传递ReportViewer所需相关资讯至WebForm页面中,利用该WebForm页面来呈现相对应之报表内容。以下进行实践说明。

建立 ReportViewer Web Form 作为报表页面

首先新增 ReportViewer.aspx 文件

加入 ScriptManager 与 ReportViewer 于 WebForm 表单中。



由于笔者希望共用 ReportViewer 页面,因此建立 ReportWarpper 类来封装 ReportViewer 所需之各项资讯,最终我们即可于 Controller 中操作该些资讯来产出不同报表表单。封装的资讯包含 rdlc 文件位置、数据来源(ReportDataSource、ReportParameter),以及是否直接下载报表控制旗标(IsDownloadDirectly)。


{
    // Constructors
    public ReportWrapper()
    {
        ReportDataSources = new List();
        ReportParameters = new List();
    }

    // Properties
    public string ReportPath { get; set; }

    public List ReportDataSources { get; set; }

    public List ReportParameters { get; set; }

    public bool IsDownloadDirectly { get; set; }

}

由于Request会先至Controller中,然后依产出报表内容来取得相关数据填入ReportWarpper中,再转址至 ReportViewer WebForm 页面中依据 ReportWarpper 资讯呈现报表;因为有跨页面消息传递需求,所以在此使用Session作为传递ReportWarpper媒介。接着就可依据 ReportWarpper 提供的资讯来实践 ReportViewer 产出报表共用逻辑,其实主要就是在设定户端报表定义文件(.rdlc)位置,并且给予数据来源资讯(ReportDataSource、ReportParameter),最后判断是否直接输出文件供用户下载使用。


{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GenerateReport();
        }
    }

    private void GenerateReport()
    {

        var ReportWrapperSessionKey = "ReportWrapper";
        var rw = (ReportWrapper)Session[ReportWrapperSessionKey];
        if (rw != null)
        {
            // Rdlc location
            RptViewer.LocalReport.ReportPath = rw.ReportPath;

            // Set report data source
            RptViewer.LocalReport.DataSources.Clear();
            foreach (var reportDataSource in rw.ReportDataSources)
            { RptViewer.LocalReport.DataSources.Add(reportDataSource); }

            // Set report parameters
            RptViewer.LocalReport.SetParameters(rw.ReportParameters);

            // Refresh report
            RptViewer.LocalReport.Refresh();

            // Download report directly
            if (rw.IsDownloadDirectly)
            {
                Warning[] warnings;
                string[] streamids;
                string mimeType;
                string encoding;
                string extension;

                byte[] bytes = RptViewer.LocalReport.Render(
                   "Excel", null, out mimeType, out encoding, out extension,
                   out streamids, out warnings);

                Response.Clear();
                Response.AddHeader("Content-Disposition", "attachment; filename=sample.xls");
                Response.AddHeader("Content-Length", bytes.Length.ToString());
                Response.ContentType = "application/octet-stream";
                Response.OutputStream.Write(bytes, 0, bytes.Length);
            }

            // Remove session
           Session[ReportWrapperSessionKey] = null;
        }

    }
}

建立户端报表定义文件(.rdlc)

rdlc为报表设计的核心,可依需求来进行报表外观及数据呈现设计。举一个简单的范例,需求是列出今年度新进员工清单于报表中,最终报表产出画面如下,黄色部分为异动值,也就是要填入报表的数据。

首先加入名为 UserRpt 的 rdlc文件

设计划面如下,简单使用文字方块及数据表来呈现报表外观。

设定表单数据来源

在此步骤中可以把它想成是在设计报表的ViewModel,而常使用的数据型态分别为DataSet及Parameter,因此我们可以依照报表数据型态的不同来使用不同报表数据来源型态,以下分别进行实践。

ReportDataSource - DataSet

以下黄色区块很明显的就是Table部分,因此可以使用DataSet做为报表数据来源。

首先建立数据集文件(.xsd)并建立对应报表User Table之字段如下。

??

接着就可以在 rdlc 中加入刚定义之数据集

在此笔者加入UserRptDataSet中User表单作为报表数据集。记得要为此数据集取比较好识别的名称,因为后续在设定 Report Viewer 时会使用到,因此笔者都会使用 DataSetName_TableName 作为名称以便识别。

最后就绑定数据集中各字段至报表中即可。

Report Parameter

以下黄色区块由于是单笔资讯,因此偏好使用参数(Parameter)做为报表数据来源。

直接在 rdlc 中加入参数数据

建立一个名称为RptMakerParam报表参数。因为后续在设定 Report Viewer 时会使用到,记得要为此参数数据取个比较好识别的名称,否则参数一多的话可能会很混乱。

接着绑定参数数据至报表中

产出报表

最后写个测试网页,点选浏览报表时会透过ReportViewer来显示报表,而点选下载报表时就不会显示报表于画面上,而是直接下载报表为Excel文件。

浏览报表的controller代码如下


{
    public ActionResult BrowseReport()
    {
        // Prepare data in report
        UserRptDataSet ds = new UserRptDataSet();
        ds.User.AddUserRow("chris",  "chris chen", "Taipei");
        ds.User.AddUserRow("eunice", "eunice chen", "New Taipei");

        // Set report info
        ReportWrapper rw = new ReportWrapper();
        rw.ReportPath = Server.MapPath("/Report/Rdlc/UserRpt.rdlc");
        rw.ReportDataSources.Add(new ReportDataSource("UserRptDataSet_User", ds.User.Copy()));
        rw.ReportParameters.Add(new ReportParameter("RptMakerParam", "CHRIS"));
        rw.IsDownloadDirectly = false;

        // Pass report info via session
        Session["ReportWrapper"] = rw;

        // Go report viewer page
        return Redirect("/Report/ReportViewer.aspx");
    }
}

点选后直接显示报表于页面上。

下载报表的controller代码如下,与上差别在设定IsDownloadDirectly旗标为true

点选下载报表连结后,直接下载保存为Excel文件

参考资讯

http://www.c-sharpcorner.com/UploadFile/ff2f08/incorporating-Asp-Net-mvc-and-sql-server-reporting-services/

http://pinnynet.blogspot.tw/2009/11/cliend-side-report.html



希望此篇文章可以帮助到需要的人

若内容有误或有其他建议请不吝留言给笔者喔 !

原文:大专栏  [ASP NET MVC] 使用ReportViewer执行用户端报表定义文件(.rdlc)产出报表

原文地址:https://www.cnblogs.com/petewell/p/11516473.html

时间: 2024-10-11 13:36:07

[ASP NET MVC] 使用ReportViewer执行用户端报表定义文件(.rdlc)产出报表的相关文章

ASP.NET MVC传送参数至服务端

ASP.NET MVC传送参数至服务端,前端与服务端的写法,你可以参考与采用适合你的需求的.当你只传递一两个参数也许觉得没有什么,如果一个方法中带的参数多的话,可以考虑model,前端可以考虑对象进行,这样与model的属性名称比对,好维护与少错误. 下面所有演示均是在ASP.NET MVC环境中进行. 在控制器中,创建两个Action,第二个Action是带四个参数的方法,正常开发环境中,你有几个参数,就得写上几个参数. 在视图中,需要把用户填写或是选择的值传给Action的Post1()方法

ASP.NET MVC应用程序执行过程分析

ASP.NET MVC应用程序执行过程分析 2009-08-14 17:57 朱先忠 朱先忠的博客 字号:T | T ASP.NET MVC框架提供了支持Visual Studio的工程模板.本文介绍ASP.NET MVC应用程序的执行过程分析. AD:WOT2015 互联网运维与开发者大会 热销抢票 创建一个简单的ASP.NET MVC应用程序 ASP.NET MVC框架提供了支持Visual Studio的工程模板,从而让你创建支持MVC模式的Web应用程序. 这些MVC工程模板包括: “A

Asp.net Mvc (Filter及其执行顺序)

应用于Action的Filter 在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能判断登录与否或用户权限,决策输出缓存,防盗链,防蜘蛛,本地化设置,实现动态Actionfilter是一种声明式编程方式,在Asp.net MVC中它只能应用在Action上Filter要继承于ActionFilterAttribute抽象类,并可以覆写void OnActionExecuting(FilterExecutingContext)和void OnActionExecuted(

ASP.NET MVC ActionFilterAttribute的执行顺序

http://diaosbook.com/Post/2014/6/3/execution-order-of-actionfilter-aspnet-mvc ASP.NET MVC里面我们要自定义ActionFilter的时候会发现有4个方法可以override:OnActionExecuting,OnActionExecuted,OnResultExecuting,OnResultExecuted.他们分别在什么时候执行一直是困扰人类的一个问题.我代表人类做了一个简单的实验: 首先自定义一个Ac

关于 ASP.NET MVC 4 如果管理用户

很久没上来写博客,因为自己没写博客的日子里去学了一下OBJECTIVE-C 和 ASP.NET MVC.最近在学ASP.NET MVC 4,有个问题一直在困扰着我,就是怎样管理用SIMPLE MEMBERSHIP的网站用户,现在到到办法 用 WebSecurity 和 OAuthWebSecurity API 去管理用户和角色 用 WebSecurity 和 OAuthWebSecurity API 写个管理网站的用户的页面 因为 SimpleMembership是基于数据库的, 你可以用其它方

Asp.net MVC 如何对所有用户输入的字符串字段做Trim处理

经常需要对用户输入的数据在插入数据库或者判断之前做Trim处理,针对每个ViewModel的字段各自做处理是我们一般的想法.最近调查发现其实也可以一次性实现的. MVC4.6中实现方式 1,实现IModelBinder接口,创建自定义ModelBinder. public class TrimModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingC

asp.net MVC C# LIgerUI实现用户登录功能login

1.创建一个项目,命名为MyLogin,选择空模板 2.创建一个控制器,命名为Home. 3.为控制器里的方法Index创建一个(主页)视图,命名为Index. 4.在视图Index里修改内容 5.添加一个方法命名为Login. 6.为方法Login添加一个视图命名为Login. 7.更改路由 8.为控制器添加一个有两个参数的方法Login1,并修改内容. 9.找到content文件夹及其下面的jquery和ligerui文件夹,如果没有,则需要从其他地方先添加content文件夹及其内容 10

ASP.NET MVC中加载WebForms用户控件(.ascx)

原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControls.Calendar),它会为“上一月”.“下一月”的链接生成"__doPostBack()"的js调用,如下图: 目前发现它会带来两个问题: 1. 不支持IE10: 2. 某些电脑不允许执行__doPostBack. 问题提炼 前提: 我们想以最低的成本解决这个问题,也就是对当前代码尽可

基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度

在之前的文章<推荐一个简单.轻量.功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler>和<简单.轻量.功能非常强大的C#/ASP.NET定时调度任务执行管理组件–FluentScheduler之实例篇>中,我们认识和了解了FluentScheduler这款轻量的定时任务调度执行组件.今天再给大家介绍一款关于定时任务调度执行的组件–Quartz.NET,Quartz.Net是Java版Quartz的.NET实现. 相对FluentSchedule