【问题标题】:Generate and Design Rdlc file programmatically以编程方式生成和设计 Rdlc 文件
【发布时间】:2016-11-10 08:21:24
【问题描述】:

我正在做 mvc 报告,我对它很陌生。我正在尝试创建一个报告,并且我已经使用 rdlc 完成了它。一切正常,可以导出为各种格式。我的问题是,在使用rdlc的时候,我们需要先设计和绑定。如何创建一个空的 rdlc 模板,以编程方式设计并将其与数据集绑定。

到目前为止我的工作(使用 empty rdlc 模板 - 刚刚创建了没有任何表格的文件),

控制器文件,

public ActionResult Report(string id)
    {
        DB.Open();
        LocalReport lr1 = new LocalReport();
        string path1 = Path.Combine(Server.MapPath("~/Report"), "TestEmptyReport.rdlc");
        lr1.ReportPath = path1;
        DataTable pc2a = new DataTable();
        pc2a = DB.getDataSet().Tables[0];
        pc2a.Columns.Add("Product Name");
        pc2a.Columns.Add("Price");
        pc2a.Columns.Add("Quantity");
        ReportDataSource rdc = new ReportDataSource("DataSet1", pc2a);
        lr1.DataSources.Add(rdc);

        string reportType = id;
        string mimeType;
        string encoding;
        string fileNameExtension;

        string deviceInfo =

            "<DeviceInfo>" +
            "<OutputFormat>" + id + "</OutputFormat>" +
            "<PageWidth>8.5in</PageWidth>" +
            "<PageHeight>11in</PageHeight>" +
            "<MarginTop>0.5in</MarginTop>" +
            "<MarginLeft>1in</MarginLeft>" +
            "<MarginRight>1in</MarginRight>" +
            "<MarginBottom>0.5in</MarginBottom>" +
            "</DeviceInfo>";

        Warning[] warnings;
        string[] streams;
        byte[] renderedBytes;

        renderedBytes = lr1.Render(
            reportType,
            deviceInfo,
            out mimeType,
            out encoding,
            out fileNameExtension,
            out streams,
            out warnings);

        return File(renderedBytes, mimeType);

    }

模型文件,

public DataSet getDataSet()
    {
        string query = "SELECT * FROM tblproduct";
        if (con.State.ToString() == "Open")
        {
            SqlDataAdapter ad = new SqlDataAdapter(query, con);
            DataSet ds = new DataSet("tblproduct");

            ad.Fill(ds);

            return ds;
        }
        else
        {
            return null;
        }
    }

查看文件,

<div style="padding: 10px; border: 1px solid black">
<div><a href="@Url.Action("Report", new { id = "PDF" })">Get PDF Report</a></div>
<div><a href="@Url.Action("Report", new { id = "Excel" })">Get Excel Report</a></div>
<div><a href="@Url.Action("Report", new { id = "Word" })">Get Word Report</a></div>
<div><a href="@Url.Action("Report", new { id = "Image" })">Get Image Report</a></div>

数据在那里,但我只是不知道如何将它与 rdlc 连接。表示根据数据创建列,并用从 sql server 调用的数据填充它。

高级 TQVM。解释和示例或任何其他方法都会有所帮助。

【问题讨论】:

  • 您要解决什么真正的问题?当您甚至无法查看报表时,您就无法实际设计报表,这就是报表设计师很重要的原因。不过,您可以将其绑定到不同的数据源。您是否尝试在运行时更改列?
  • 另一方面,RDLC 只是 XML。您可以使用与任何其他 XML 文件相同的方式生成其内容,例如在现有 XML 模板文件上使用 XSLT 转换,使用 Linq to XML 执行相同操作等。最好在 build-time 执行此操作不过,为了确保结果看起来不错。正确获取颜色、宽度和边距可能会很烦人
  • @PanagiotisKanavos 抱歉,如果我的问题不清楚。我想象它的工作方式是我创建一个空的 rdlc 文件,从数据库中读取数据并根据收到的数据创建列。是的,正如您所说,我试图在运行时更改列,因为如果要创建各种不同的报告,则根据收到的数据库表创建单独的 rdlc 文件效率低下。
  • 我完全忘记了 Report 组件是完全可编程的。您可以在运行时创建它,就像通过添加控件来创建表单一样。修改 XML 更容易但是您也可以使用构建脚本从模板报告生成多个报告
  • 另一方面,您可以根据表达式(可以使用报告参数)隐藏单个报告中的列。您还可以在呈现之前从现有模板报告中删除列

标签: c# sql-server asp.net-mvc ado.net rdlc


【解决方案1】:

如果我正确理解您的问题,您想从空白 RDL​​C 创建报告。您必须在设计时告诉 RDLC 文件有关数据的信息。您可以在设计时通过添加列或其他表中的列或进行连接来自定义报告。

Dynamic RDLC Generator through C# 将在那里从 RDLC 动态生成报告。由于完整的 ReportingEngine 是定制的,但非常通用。复制粘贴可能有助于生成报告。

【讨论】:

  • 您链接到一个示例,该示例显示它可以使用代码从头开始生成!
  • 也可以直接渲染成PDF。无需使用 iTextSharp,它比报表引擎复杂很多
  • 实际答案在链接的文章中。这种解释令人困惑。基本上它说“那个链接有答案,去复制”。这并不比仅链接的答案好多少
【解决方案2】:

您的问题意味着您需要在运行时模式下生成 RDLC 报告。您应该记住的事情:

  1. RDLC 报表查看器使用Microsoft.ReportViewer.WebFormsMicrosoft.Reporting.WebForms 命名空间,它们利用WebForms 逻辑代码来绑定和呈现报表。您可以使用部分视图作为 ASPX 页面的容器(使用单个页面或带有代码的页面)在 MVC 视图页面中呈现报告。

    注意:您可以在控制器操作方法中使用 ReportViewer 实例将 RDLC 呈现为 PDF 文件并返回 FileContentResult(请参阅 here)。

  2. RDLC 包含可以从各种 XML 构建器类生成的 XML 标记(有关详细信息,请参阅MSDN Report Definition)。

因此,您可以先创建 ReportViewer 实例,例如:

using Microsoft.Reporting.WebForms;

protected void Form_Load(Object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ReportViewer1.ProcessingMode = ProcessingMode.Local;
        ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Report.rdlc");

        // add your DataSet here

        var data = new DataTable(); // example data source
        var dataSource = new ReportDataSource(DataSetName, data);

        ReportViewer1.LocalReport.DataSources.Add(dataSource);

        // put rendering stuff here
    }
}

然后,使用Generating RDLC Dynamically for the Report Viewer Local Report示例中的步骤(WebForms在事件处理使用方面与WinForms类似,因此可能适用于ASPX页面)创建相应的XML标签,生成报告结构,总结如下。

  1. 创建并添加DataSet 以在DataSources 元素中使用。
  2. 创建报表正文和报表项元素。
  3. 根据DataSet内部的表结构创建TablixTablixCorner元素。
  4. 根据每列数据类型创建TablixColumnTablixRowTablixCell 元素,其中包括Textbox 控件。 Textbox 控件内的 Value 元素应包含用于数据库绑定列的表达式 =Fields!(ColumnName).Value
  5. 创建报表属性元素(数据集查询、字段等)
  6. 在正确生成所有报表元素后,将LoadReportDefinition 添加到 ASPX 页面中。

或者,如果您已经知道整个 RDLC 元素结构,使用 XmlWriter 类的 similar solution 可以生成从头开始构建报告所需的元素,然后将生成的 XML 重命名为 RDLC 扩展并将其绑定到 ReportViewer 控件(似乎需要一些时间来构建每个 RDLC 元素)。

其他参考资料:

Rendering an RDLC report in HTML in ASP.NET MVC

Dynamic Reports with Reporting Services

【讨论】:

    猜你喜欢
    • 2018-01-29
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2011-10-06
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多