RDLC系列(一)ASP.NET RDLC 報表自定義數據源


最近一段時間開發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 = 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 中名字必須和報表中的一樣

最后預覽如下:

 

 

 

 

作者 :@瘋子
——當你的才華還撐不起你的野心時,你就應該靜下心來好好學習~
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM