最近一段时间开发ERP系统中要用到不少报表打印,在网上找了一圈发现想些好用的报表控件大部分要收费,一些面免费要么不好用要么IE8不兼容,最后还是用了微软自带的RDLC报表,把自己遇到的坑和技巧整理分享出来。

一般Visaul Studio上新建的的EDLC报表文件之后数据源都是按照向导直接连接数据库,自动生成数据源和数据集的,但是遇到一些复杂的就不够灵活。

一、新建报表

1.新建一个空白的报表如下

2.打开新建好的空报表文件,选择报表文件右键选择【打开方式】→【XML(文本)编辑】打开 在Page节点下面添加DataSources 和DataSets 节点

1)空报表文件

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
<Width>6.5in</Width>
<Body>
<Height>2in</Height>
</Body>
<rd:ReportTemplate>true</rd:ReportTemplate>
<Page>
</Page>
</Report>

2)添加节点后

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
<Width>6.5in</Width>
<Body>
<Height>2in</Height>
</Body>
<rd:ReportTemplate>true</rd:ReportTemplate>
<Page>
</Page>
<DataSources>
<DataSource Name="ProductOrderSource">
<ConnectionProperties>
<DataProvider>System.Data.DataSet</DataProvider>
<ConnectString>/* Local Connection */</ConnectString>
</ConnectionProperties>
<rd:DataSourceID>50f42c3f-789d-4967-8d8b-5dbe50b3a677</rd:DataSourceID>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name="ProductOrderDs">
<Query>
<DataSourceName>ProductOrderSource</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
<Field Name="ProductOrderId">
<DataField>ProductOrderId</DataField>
<rd:TypeName>System.Guid</rd:TypeName>
</Field>
<Field Name="SKUDetail">
<DataField>SKUDetail</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
<Field Name="Quantity">
<DataField>Quantity</DataField>
<rd:TypeName>System.Int32</rd:TypeName>
</Field>
<Field Name="DeliveryDate">
<DataField>DeliveryDate</DataField>
<rd:TypeName>System.DateTime</rd:TypeName>
</Field>
<Field Name="DeliveryDateActual">
<DataField>DeliveryDateActual</DataField>
<rd:TypeName>System.DateTime</rd:TypeName>
</Field>
<Field Name="Bak">
<DataField>Bak</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>ProductOrderSource</rd:DataSetName>
<rd:TableName>ProductOrderDetail</rd:TableName>
<rd:TableAdapterGetDataMethod>GetData</rd:TableAdapterGetDataMethod>
</rd:DataSetInfo>
</DataSet>
</DataSets>
</Report>
DataSources:数据源名称标签,每次加一个新的数据源需要在 DataSources 标签下新标签DataSource
DataSets:数据实体集合,每次新添加一个数据源后在DataSets 对应添加新的DataSet节点,DataSourceName和DataSetName 要和DataSource 的Name 名称一致。Fields 下面是添加每个实体对应的字段

3.报表DataSource和DataSet建好后可以看到刚才添加的数据源和数据集

4.设计好需要额报表,填充刚才数据集里对应的字段

5.后台数据源赋值代码
   public ActionResult PrintProduct()
{
string reportPath = Server.MapPath("~/Reports/订单信息.rdlc"); var localReport = new LocalReport { ReportPath = reportPath }; List<ProductOrder> productOrders = new List<ProductOrder>(); for (int i = ; i < ; i++)
{
ProductOrder productOrder=new ProductOrder
{
SKUDetail = $"A00300000{i}",
Quantity = i,
DeliveryDate = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd HH:mm:ss"),
DeliveryDateActual = DateTime.Now.AddDays(i+).ToString("yyyy-MM-dd HH:mm:ss")
};
productOrders.Add(productOrder); }
var dataSource = new ReportDataSource("ProductOrderDs", productOrders);
localReport.DataSources.Add(dataSource); var type = "PDF";
string reportType = type;
string mimeType;
string encoding;
string fileNameExtension; var deviceInfo = $"<DeviceInfo><OutPutFormat>{type}</OutPutFormat></DeviceInfo>"; Warning[] warnings;
string[] streams; var renderedBytes = localReport.Render(
reportType,
deviceInfo,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings); return File(renderedBytes, mimeType);
}

实体代码:

 public class ProductOrder
{
public Guid ProductOrderId { get; set; }
public string SKUDetail { get; set; } public int Quantity { get; set; } public string DeliveryDate { get; set; } public string DeliveryDateActual { get; set; } public string Bak { get; set; }
}

注意:报表文件DataSet中的用到的字段必须和实体字段对应,代码中DataSource 中名字必须和报表中的一样

最后预览如下:

——当你的才华还撑不起你的野心时,你就应该静下心来好好学习~
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

RDLC系列(一)ASP.NET RDLC 报表自定义数据源的更多相关文章

  1. RDLC系列之二 子报表

    本文实现简单的子报表 一.效果图

  2. ASP.NET之报表--RDLC(一)---附源码

    听同事介绍到RDLC,之前有了解过报表,但是确实没什么放在心上.最近有空,就研究下了. 一.RDLC实现 1.步骤 (1)首先新建一个项目RDLCDemo (2)新建一个DataSet数据集,并且绑定 ...

  3. asp.net RDLC报表入门

    Asp.net RDLC 报表入门 这几天帮给同事讲解Asp.net RDLC 报表方面的知识,顺便做个简单教程,在这里分享给大家. 由于图片多又大,写了一半,光上传图片就把我累个半死,所以我教把程放 ...

  4. RDLC系列之一 简单示例

    参照文章:http://www.cnblogs.com/waxdoll/archive/2006/07/24/458409.html#!comments 一.效果图

  5. RDLC系列之一 简介和入门

    一.简介 RDLC报表,通过Report Viewer Control来实现,制作微软RDLC报表由以下三部分构成:1.制作自己的DateSet集合(就是报表的数据集):2.制作自己的报表文件.rdl ...

  6. ASP.NET Core MVC – 自定义 Tag Helpers

    ASP.NET Core Tag Helpers系列目录,共四篇: ASP.NET Core MVC Tag Helpers 介绍 ASP.NET Core MVC – Caching Tag Hel ...

  7. 【深入ASP.NET原理系列】--ASP.NET页面生命周期

    前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...

  8. 【深入ASP.NET原理系列】--ASP.NET请求管道、应用程序生命周期、整体运行机制

    微软的程序设计和相应的IDE做的很棒,让人很快就能有生产力..NET上手容易,生产力很高,但对于一个不是那么勤奋的人,他很可能就不再进步了,没有想深入下去的动力,他不用去理解整个框架和环境是怎么执行的 ...

  9. 【Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器

    首先是用于显示分词信息的HelloCustomAnalyzer.java package com.jadyer.lucene; import java.io.IOException; import j ...

随机推荐

  1. bzoj2120: 数颜色 &&bzoj2453: 维护队列

    题目大意: 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好 ...

  2. 基于Python,scrapy,redis的分布式爬虫实现框架

    原文  http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...

  3. TF-IDF算法 笔记

    TF-IDF:Term Frequency-Inverse Document Frequency(词频-逆文档频度):主要用来估计一个词在一个文档中的重要程度. 符号说明: 文档集:D={d1,d2, ...

  4. PHP 中 static 和 self 的区别

    使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类: 使用 static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的.也可以称之为" ...

  5. imageX及其安装windows

    /capture    将卷映像捕获到新 WIM 文件中(备份成wim) imagex /capture g:  e:\7setted.wim "Drive G" /apply   ...

  6. Spark编程进阶

    1.累加器             通常在向Spark传递函数时,比如使用map()函数或者用filter()传条件是,可以使用驱动器程序中定义的变量,但是集群中运行的每个人物都会得到这些变量的一份新 ...

  7. iOS 倒出spa文件 打包

    1. 修改Build Settings 修改 Code Signing: codesign failded 意思是签名错误,看看是否xcode -perferences是否没有登录,还有就是钥匙串密码 ...

  8. centos服务器设置代理上网的方法

    这里以centos7.0为例,记录代理服务器设置过程: 1.全局的代理设置: vi /etc/profile 添加下面内容 http_proxy = http://username:password@ ...

  9. Servlet 异步处理

    web容器会为每个请求分配一个线程,Servlet3.0新增了异步处理,解决多个线程不释放占据内存的问题.可以先释放容器分配给请求的线程与相关资源,减轻系统负担,原先释放了容器所分配线程的请求,其响应 ...

  10. 基于Ubuntu 14.04构建mysql5.6 Docker镜像

    我们的目的是创建一个基于Ubuntu 14.04 的MySQL的 Docker Image,并且在新创建出来的容器里自动启动MySQL服务接受外部连接 步骤: 1. 首先创建一个目录并在目录下创建一个 ...