最近一段時間開發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 中名字必須和報表中的一樣
最后預覽如下:

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