心得整理之一--RDLC多数据源多表
我将项目中的一部分提炼出来,写了这个Demo. 先说一下需求, 从 API接口, 获取数据源, 调用RDLC 生成PDF文件. (后面还有涉及到使用福昕PDf阅读器进行设置文件自定义内容,以供外部程序使用,这里就不列举.)
现在要生成以下格式的PDF文件, 其中 "职称信息" 会有多个, "项目负责人登记信息(本市在建项目)" 也会有多个. 如下如

很明显, 这里涉及到的数据源,会有多个. 我将这个 拆成3个数据源.
第一个: 人员基本信息+pdf信息
第二个: 职称信息List
第三个: 项目负责人登记信息(本市在建项目)
特别说明: 项目负责人登记信息(本市在建项目) 下面的那一行字, 截止至xxxx详细信息是动态的,这里也是一个字段, 我将 列表以外的 字段, 都归为 第一个数据源里面.
第一步: 构建 实体类
/// <summary>
/// 人员基本信息
/// </summary>
public class Ryjbxx
{
/// <summary>
/// pdf文件编号
/// </summary>
public string pdfbh { get; set; } /// <summary>
/// 生成时间
/// </summary>
public string scsj { get; set; } /// <summary>
/// 姓名
/// </summary>
public string xm { get; set; }
/// <summary>
/// 证件号
/// </summary>
public string zjh { get; set; }
/// <summary>
/// 证件类型
/// </summary>
public string zjlx { get; set; } /// <summary>
/// 在建项目截止日期
/// </summary>
public string zjxm_jzrq { get; set; }
Ryjbxx
/// <summary>
/// 人员职称信息
/// </summary>
public class Ryzcxx
{
/// <summary>
/// 人员职称
/// </summary>
public string ryzc { get; set; }
/// <summary>
/// 证书编号
/// </summary>
public string zsbh { get; set; }
/// <summary>
/// 批准日期
/// </summary>
public string pzrq { get; set; }
/// <summary>
/// 发证机构
/// </summary>
public string fzjg { get; set; }
}
Ryzcxx
/// <summary>
/// 在建项目信息
/// </summary>
public class Ryzjxmxx
{
/// <summary>
/// 项目名称
/// </summary>
public string xmmc { get; set; }
/// <summary>
/// 合同信息报送编号
/// </summary>
public string htxxbsbh { get; set; }
/// <summary>
/// 合同类别
/// </summary>
public string htlb { get; set; }
}
Ryzjxmxx
第二步: 业务类,获取数据源
我这里做了一下数据模拟.
public class DataSourceBLL
{
/// <summary>
/// 获取人员基本信息
/// </summary>
/// <returns></returns>
public List<Ryjbxx> GetRyjbxxList()
{
List<Ryjbxx> list = new List<Ryjbxx>();
Ryjbxx item = new Ryjbxx()
{
pdfbh = "GR201809000001",
scsj = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
xm = "张三",
zjh = "",
zjlx = "身份证",
zjxm_jzrq = "截止至"+DateTime.Now.ToString("yyyy年MM月dd日")
};
list.Add(item);
return list;
} /// <summary>
/// 获取在建项目信息
/// </summary>
/// <returns></returns>
public List<Ryzjxmxx> GetRyzjxmxxList()
{
List<Ryzjxmxx> list = new List<Ryzjxmxx>();
Ryzjxmxx itme1 = new Ryzjxmxx() { htlb = "施工", htxxbsbh = "W2015080136330", xmmc = "延吉中路(双阳路-营口路)道路整治工程" };
Ryzjxmxx itme2 = new Ryzjxmxx() { htlb = "施工", htxxbsbh = "W2015080136316", xmmc = "阿里巴巴(上海)物联网技术应用中心" };
list.Add(itme1);
list.Add(itme2);
return list;
} /// <summary>
/// 获取人员职称信息
/// </summary>
/// <returns></returns>
public List<Ryzcxx> GetRyzcxxList()
{
List<Ryzcxx> list = new List<Ryzcxx>();
Ryzcxx item = new Ryzcxx() { zsbh = "沪xxxxx号", ryzc = "初级会计师", fzjg = "上海XXX机构", pzrq = "2017年2月3日" };
list.Add(item);
return list;
} }
获取数据源
第三步:画RDLC
1. 新建类库 RdlcDemoBLL, 目标框架 .NET Framework 4
2.添加程序集引用 Microsoft.ReportViewer.WebForms.dll ,System.Web.dll, System.Web.Extensions.dll
3.新建文件夹 RDLC,新建 报表 GRPdfTemp.rdlc
4.编辑RDLC报表, 大概是下面这个样子.

然后就遇到一个问题, 现在 现在只有一个数据集, 其他的怎么添加进来呢?

这篇文章 主要点,就在这里.
5.新建一个rdlc, 拉一个 表, 可用数据集 选择 Ryjbxx,
再新建一个rdlc, 拖一张表, 可用数据集 选择 Ryzjxmxx
6. 后面2个 里面的 数据字典,拷贝到第一个 rdlc里面.并且更改 DataSource 和DataSet 名称
右键GRPdfTemp.rdlc ==> 打开方式 ==>选择 XML(文本)编辑器
拉到最下面, 可以看到 <DataSources> 节点和 <DataSets>节点


7.将 以上两张 rdlc中的 DataSource 部分, 拷贝到 GRPdfTemp.rdlc 的 DataSources 节点里面, 现在改一下DataSources 的 Name属性 <DataSource Name="RdlcDemoBLLModels">
以上两张 rdlc中的 DataSet部分 ,拷贝到 GRPdfTemp.rdlc 的 DataSets 里面 ,然后改一下 DataSet 的Name 属性 <DataSet Name="DataSet1">, 还有 <Query>节点里面的 <DataSourceName>
8. 现在 GRPdfTemp.rdlc 里面 <DataSources> 下面有3个 <DataSource>,如下所示
<DataSources>
<DataSource Name="DataSource_Ryjbxx">
<ConnectionProperties>
<DataProvider>System.Data.DataSet</DataProvider>
<ConnectString>/* Local Connection */</ConnectString>
</ConnectionProperties>
<rd:DataSourceID>af7df84f-629d-422c-8be7-57ce146074ed</rd:DataSourceID>
</DataSource>
<DataSource Name="DataSource_Ryzcxx">
<ConnectionProperties>
<DataProvider>System.Data.DataSet</DataProvider>
<ConnectString>/* Local Connection */</ConnectString>
</ConnectionProperties>
<rd:DataSourceID>d37e0668-2343-42cd-83f5-77c9fd7f070a</rd:DataSourceID>
</DataSource>
<DataSource Name="DataSource_Ryzjxmxx">
<ConnectionProperties>
<DataProvider>System.Data.DataSet</DataProvider>
<ConnectString>/* Local Connection */</ConnectString>
</ConnectionProperties>
<rd:DataSourceID>960a9437-ce82-473b-9466-91dbfa9eadd4</rd:DataSourceID>
</DataSource>
</DataSources>
对应的 3个DataSet

9 这里就能选到数据源了

10 如果你不下心选错了 DataSource, 后面不能重新选,只能 改 rdlc 原代码 xml信息了.
每一张表是 一个 <Tablix Name="Tablix1">, 指定数据集 <DataSetName> 节点, 更改里面的 对应的 名字, 可以选到 对应数据源下面的字段.

第四步: 调用RDLC模板 生成PDF文件,
public class CreateRyxxPdfBLL
{
public void CreatePdfByRdlc()
{
Trace.WriteLine("生成Pdf开始");
string rdlPath = System.AppDomain.CurrentDomain.BaseDirectory + "\\RDLC\\GRPdfTemp.rdlc";
DataSourceBLL dataSourceBLL = new DataSourceBLL(); List<Ryjbxx> list1 = dataSourceBLL.GetRyjbxxList();
List<Ryzcxx> list2 = dataSourceBLL.GetRyzcxxList();
List<Ryzjxmxx> list3 = dataSourceBLL.GetRyzjxmxxList();
byte[] pdfByte = CreatePdfFromRdlc(list1, list2, list3, rdlPath); string savepath = string.Format(@"d:\grpdf_{0}_{1}.pdf", list1[].zjh, DateTime.Now.ToString("yyyyMMddHHmmssfff"));
File.WriteAllBytes(savepath, pdfByte);
Trace.WriteLine("生成Pdf结束");
} public byte[] CreatePdfFromRdlc(List<Ryjbxx> list1, List<Ryzcxx> list2,List<Ryzjxmxx> list3, string rdlPath)
{
try
{
ReportViewer viewer = new ReportViewer(); viewer.ProcessingMode = ProcessingMode.Local; viewer.LocalReport.ReportPath = rdlPath; ReportDataSource ds1 = new ReportDataSource() { Name = "DataSet1", Value = list1 };
ReportDataSource ds2 = new ReportDataSource() { Name = "DataSet2", Value = list2 };
ReportDataSource ds3 = new ReportDataSource() { Name = "DataSet3", Value = list3 }; viewer.LocalReport.DataSources.Add(ds1);
viewer.LocalReport.DataSources.Add(ds2);
viewer.LocalReport.DataSources.Add(ds3); byte[] fileContent = viewer.LocalReport.Render("pdf");
return fileContent;
}
catch (Exception ex)
{ throw ex;
} } }
生成结果样图

程序源代码 : 点击下载
心得整理之一--RDLC多数据源多表的更多相关文章
- [RDLC]心得整理(一)
2014年在做项目的时候, 过用过RDLC, 之后便在没有使用过了. 最近又有项目使用rdlc, 感觉有些陌生,然后重新阅读了以前的笔记,想做一下整理. 常见问题: 1. 为什么rdlc报表出来的pd ...
- (转)Mysql数据库主从心得整理
Mysql数据库主从心得整理 原文:http://blog.sae.sina.com.cn/archives/4666 管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本 ...
- 纯粹的K12精髓 - 名师指导整理《20以内加法口诀表》
纯粹的K12精髓 - 名师指导整理<20以内加法口诀表> 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一 ...
- Mysql数据库主从心得整理
管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验所写,整理了一下,分享给各位同行,希望对 ...
- jQuery整理笔记七----几个经典表单应用
1.文本框获得(失去)焦点 当文本框获得输入焦点时,将该文本框高亮显示,算不得一个应用,仅仅是一个小技巧,能够提高用户体验. <!DOCTYPE html PUBLIC "-//W3C ...
- maven学习心得整理
maven的学习心得 已经接触了maven项目有一段时间了,开始时仅仅会使用,在使用中发现了它的强大和方便,于是决心研究一下: 首先,普及一下maven参数: -D:传入属性参数 -P:使用POM中指 ...
- MySQL 笔记整理(13) --为什么数据表删掉一半,表文件大小不变?
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 13) --为什么数据表删掉一半,表文件大小不变? 我们还是以MySQL ...
- WEB网站测试心得整理
一.输入框: 1.正常的字母/文字/数字(正常流程的测试): 2.重复提交(输入内容后,重复点击提交按钮): 3.纯异常字符/正常输入夹杂异常字符(!@#¥%……&**等等): 4.长度限制( ...
- 自学java一路以来,心血心得整理分享
✿ 贴心提示:文章内容比较长,但都是干货,请大家耐心看完.时间不够充裕的小伙伴,建议收藏,一定要耐心看完,保证对你有后续学习java有所帮助. 一.推荐背景介绍 (一)我是怎么学的? ★ 非常普通的人 ...
随机推荐
- POJ1060 Modular multiplication of polynomials
题目来源:http://poj.org/problem?id=1060 题目大意: 考虑系数为0和1的多项式.两个多项式的加法可以通过把相应次数项的系数相加而实现.但此处我们用模2加法来计算系数之和. ...
- 处女座和小姐姐(三)(数位dp)
链接:https://ac.nowcoder.com/acm/contest/329/G 来源:牛客网 题目描述 经过了选号和漫长的等待,处女座终于拿到了给小姐姐定制的手环,小姐姐看到以后直呼666! ...
- 8.10zju集训日记
今天的题目比昨天的简单,一开始自己看了一道题意比较难懂的题目,然后看到榜上有人做出的两道不同的题目,然后马上改变目标,金大佬看的题目是一道比较裸的高斯消元,基本上只要模板正确就可以对,于是很快就开始打 ...
- codeforces-777E Hanoi Factory (栈+贪心)
题目传送门 题目大意: 现在一共有N个零件,如果存在:bi>=bj&&bj>ai的两个零件i,j,那么此时我们就可以将零件j放在零件i上.我们现在要组成一个大零件,使得高度 ...
- POJ-2112 Optimal Milking(floyd+最大流+二分)
题目大意: 有k个挤奶器,在牧场里有c头奶牛,每个挤奶器可以满足m个奶牛,奶牛和挤奶器都可以看成是实体,现在给出两个实体之间的距离,如果没有路径相连,则为0,现在问你在所有方案里面,这c头奶牛需要走的 ...
- yii2 basic VER
assets/ contains assets definition 包含资源定义 commands/ contains console commands (controllers) 包含命令行命令, ...
- hive 取两次记录的时间差 lead lag first_value last_value
-- LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值 -- 第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如 ...
- 如何 将下载离线 nupkg 文件 安装到VS2017
https://www.cnblogs.com/cncc/articles/8276878.html --------------------------------------------- ...
- LBS开发
功能:用户发送自动的位置,返回周围的厕所信息 思路:根据用户的经纬度信息,调用百度地图的api,查询周围的厕所位置并且返回! 步骤:进入百度地图官网注册账号,选择web api接入 我们先看开发者文档 ...
- 转 windows下安装pycharm并连接Linux的python环境 以及 windows 下notepad ++编辑 linux 的文件
######sample 1:windows下安装pycharm并连接Linux的python环境 https://www.cnblogs.com/junxun/p/8287998.html wind ...