RDLC报表开发
背景
最近接触到报表的开发,由于要求的报表需要固定的模板并且需要添加图片及其他一些功能,使用简单的excel导出功能已经无法满足需求,于是选择使用rdlc来做定制化的开发,rdlc可以满足图片,表格,图形等控件支持导出excel,pdf,word现在打印功能
下面带大家一步一步了解如何使用rdlc开发报表
1.创建包含rdlc报表的项目
新建项目添加报表
这里大家可能会发现你的VS里面并没有这个报表的选项(如果有请跳过),选择-工具-扩展和更搜索rdlc(我这里是已经安装过的,没安装的选择安装即可),安装之后重新VS再新建项目就可以看到报表
添加好之后可以看到我们项目里增加了一个rdlc后缀的文件,同时可以看到旁边的工具箱中有很多控件
<
先不介绍控件的使用后面会详细介绍,
报表创建好之后如何展示出来,这里需要用到Reportview控件,需要先引用相关的dll,直接使用nuget引用Microsoft.ReportingServices.ReportViewerControl.Winforms
引用好之后就可以再工具箱中找到Reportview控件,拖到窗体上选择刚刚做好的报表运行成功,整个项目的创建就完成了
2.控件介绍
RDLC设计工具箱上总共有9种控件:文本框(TextBox)、折线(Line)、表(Table)、矩阵(Matrix)、矩形(Rectangle)、列表(List)、子报表(SubReport)、图表控件(Chart)、图像控件(Image)
文本框(TextBox)、折线(Line)比较简单这里不详细说明
值得注意的是:如果输入中文的时候出现下面这种奇怪的东西不用担心,其实只是字体不识别,导出的时候是不影响的,或者直接改下字体就可以了
下面详细说一下表(Table)
把Table拖到报表页中可以看到有表头和数据,主要说下其中的数据
这里的数据有三种方式填充(数据库,服务,对象),以对象为例来看一下怎么把数据源添加到Table中
首先新建一个类,新建之后需要重新生成一下,不然再数据源里是看不到的
class DataSourceModel
{
public string Type { get; set; }
public string Name { get; set; }
public string Model { get; set; }
public int Num { get; set; }
public double Amount { get; set; }
}
这里的名称需要注意下后面会用到
数据源选择好之后把报表完善一下,这里可以直接选择维护好的数据源
绑定数据的代码
// 清空reportviewer先前的数据源
this.reportViewer1.LocalReport.DataSources.Clear();
List<DataSourceModel> dataSourceModels = new List<DataSourceModel>();
for (var i = 0; i < 20; i++)
{
DataSourceModel dataSource = new DataSourceModel();
dataSource.Amount = i;
dataSource.Model = "型号" + i;
dataSource.Name = "名称" + i;
dataSource.Num = i;
dataSource.Type = "种类" + i;
dataSourceModels.Add(dataSource);
}
// DataSource这里就是刚刚创建数据源时的名称
var DataSourceModels = new ReportDataSource("DataSource", dataSourceModels);
this.reportViewer1.LocalReport.DataSources.Add(DataSourceModels);
this.reportViewer1.RefreshReport();
下面是效果
在介绍另一个分组功能(比如需要根据某些字段分组汇总之类的) 可以根据条件进行分组也可以使用表达式(表的是后面会详细说)
这里说一个比较特殊的比如不需要分组只要用到所有数据的一个合计或者每多少行合计一次
如果只做一次合计 只需要选择表达式
合计效果图:
如果需要根据若干行处理则表达式为=int((RowNumber(Nothing)-1)/100) 这里是根据100行进行一次合计
3.表达式
文本框,表,矩阵,列都支持使用表达式来定义值
表达式中可以使用报表中的所有属性值,同时rdlc本身也内置了一些字段
ExecutionTime | 生成报表的时间 |
---|---|
PageNumber | 当前的页号 |
ReportFolder | 包含报表的文件路径 |
ReportName | 报表的名称 |
ReportServerUrl | 执行报表Server的路径(这里没有用Server,所以没有,如果用ReportService那就就存在了) |
TotalPages | 总行数 |
UserID | 当前执行报表的人 |
Language | 执行报表Server的系统语言 |
包括Excel中常用到的函数,和一些日期转换
下面列一下常用的
- 连接字符
=Fields!Name.Value + Fields!Model.Value 连接两个字段在一个单元格中,并一行显示
=Fields!Name.Value & vbCrLf & Fields!Model.Value 连接两个字段在一个单元格中显示,但是换行显示
- If表达式使用
=IIF(Fields!Amount.Value > 100, True, False) 如果成立执行True的表达式,否则执行False表达式,也可以写其它的表达式代替代码里的东西
- Count表达式使用
=Count(Fields!Amount.Value,“DataSource”) 计算DataSource数据集中Amount有多少行
4.Sum表达式使用
=Sum(Fields!Amount.Value,“DataSource”) 计算DataSource数据集中Amount的总和
5. Format表达式使用
=CDate(Fields!Name.Value).ToString(“yyyy-MM-dd”) 对date的格式进行应用