RDLC系列(一)ASP.NET RDLC 报表自定义数据源

时间:2021-06-28 08:31:28

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

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

一、新建报表

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

RDLC系列(一)ASP.NET RDLC 报表自定义数据源

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建好后可以看到刚才添加的数据源和数据集

RDLC系列(一)ASP.NET RDLC 报表自定义数据源


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

RDLC系列(一)ASP.NET RDLC 报表自定义数据源

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 = 0; i < 20; 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+1).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 报表自定义数据源

 

 

 

 

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