最近一段时间开发ERP系统中要用到不少报表打印,在网上找了一圈发现想些好用的报表控件大部分要收费,一些面免费要么不好用要么IE8不兼容,最后还是用了微软自带的RDLC报表,把自己遇到的坑和技巧整理分享出来。
一般Visaul Studio上新建的的EDLC报表文件之后数据源都是按照向导直接连接数据库,自动生成数据源和数据集的,但是遇到一些复杂的就不够灵活。
一、新建报表
1.新建一个空白的报表如下
2.打开新建好的空报表文件,选择报表文件右键选择【打开方式】→【XML(文本)编辑】打开 在Page节点下面添加DataSources 和DataSets 节点
1)空报表文件
2)添加节点后
DataSources:数据源名称标签,每次加一个新的数据源需要在 DataSources 标签下新标签DataSource
DataSets:数据实体集合,每次新添加一个数据源后在DataSets 对应添加新的DataSet节点,DataSourceName和DataSetName 要和DataSource 的Name 名称一致。Fields 下面是添加每个实体对应的字段
3.报表DataSource和DataSet建好后可以看到刚才添加的数据源和数据集
4.设计好需要额报表,填充刚才数据集里对应的字段
5.后台数据源赋值代码
publicActionResult PrintProduct()
{stringreportPath = Server.MapPath("~/Reports/订单信息.rdlc");varlocalReport =newLocalReport { ReportPath =reportPath };
List productOrders =newList();for(inti =0; i <20; i++)
{
ProductOrder productOrder=newProductOrder
{
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);
}vardataSource =newReportDataSource("ProductOrderDs", productOrders);
localReport.DataSources.Add(dataSource);vartype ="PDF";stringreportType =type;stringmimeType;stringencoding;stringfileNameExtension;vardeviceInfo = $"{type}";
Warning[] warnings;string[] streams;varrenderedBytes =localReport.Render(
reportType,
deviceInfo,outmimeType,outencoding,outfileNameExtension,outstreams,outwarnings);returnFile(renderedBytes, mimeType);
}
实体代码:
publicclassProductOrder
{publicGuid ProductOrderId {get;set; }publicstringSKUDetail {get;set; }publicintQuantity {get;set; }publicstringDeliveryDate {get;set; }publicstringDeliveryDateActual {get;set; }publicstringBak {get;set; }
}
注意:报表文件DataSet中的用到的字段必须和实体字段对应,代码中DataSource 中名字必须和报表中的一样
最后预览如下:
出处:乐学网