最近一段时间开发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 中名字必须和报表中的一样
最后预览如下:
作者
:@疯子
——当你的才华还撑不起你的野心时,你就应该静下心来好好学习~
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.