我将项目中的一部分提炼出来,写了这个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 = "420117198008065923",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[0].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;}}}

View Code

生成结果样图

程序源代码 :  点击下载

转载于:https://www.cnblogs.com/mjxxsc/p/9675773.html

心得整理之一--RDLC多数据源多表相关推荐

  1. mysql主从数据库含义_(转)Mysql数据库主从心得整理

    管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验所写,整理了一下,分享给各位同行,希望对 ...

  2. vs2008网站模式下不能设置rdlc的数据源

    很郁闷,vs2008中网站中rdlc报表竟然不能设置数据源,必须在工程下才能用. 转载于:https://www.cnblogs.com/shunliy/archive/2009/01/09/1373 ...

  3. jQuery整理笔记七----几个经典表单应用

    1.文本框获得(失去)焦点 当文本框获得输入焦点时,将该文本框高亮显示,算不得一个应用,仅仅是一个小技巧,能够提高用户体验. <!DOCTYPE html PUBLIC "-//W3C ...

  4. jQuery整理笔记七----几个经典表单应用 .

    登录 | 注册 收藏成功 确定 收藏失败,请重新收藏 确定 标题 标题不能为空 网址 标签 摘要 公开 取消收藏 全部设为已读查看所有通知 暂没有新通知 返回通知列表 下一条 上一条 分享资讯传PPT ...

  5. 关于数据库、数据源、表、脚本语句的创建、连接与使用的个人学习随笔

    创建数据库创建表的工具有很多,看起来似乎很不一样,但其实里面的知识是通用的,理解了数据库相关的知识和相应操作,就算换个工具,也最多是趁不趁手的问题,所以,如果你是准备自学数据库的话,下面的这些基础知识 ...

  6. 关于魅蓝Note2的使用心得整理

    2019独角兽企业重金招聘Python工程师标准>>> 今年6月份,魅族推出了新一代大屏千元手机--魅蓝Note2,相比上一代魅蓝Note,不仅价格降低了200元,外观设计也更完美. ...

  7. 2018.10.1(这不仅是一篇日记,也是mac使用心得整理,未完待续……)

    今天是国庆节,祝祖国母亲生日快乐. 今天在ucl正式上课了,还去蹭了一节非监督学习的课.挺好. 9月20+号买的mac,通过船运,终于到手了.非常高兴. 晚上回家去中国城买了一些食材自己做.一半的花生 ...

  8. 《暗时间》第一遍读书心得整理

    在知乎上面看到了刘未鹏,购买了他的<暗时间>一书,趁着坐车和空闲的时间阅读了全书,整理第一遍阅读的心得如下: 首先我读书的时候喜欢划掉不重要的章节和段落如下:         先从总体的角 ...

  9. 肝!精心整理了 50 个数据源网站!

    点击关注上方"小詹学Python", 作者:王术,发表于知乎 来源:zhihu.com/question/22698541/answer/22367802 部分内容来自网络 01 ...

最新文章

  1. POJ1258 Agri-Net【最小生成树】
  2. BZOJ3133[ballmachine]——倍增+优先队列
  3. 86. Leetcode 264. 丑数 II (动态规划-基础题)
  4. cba篮球暂停次数和时间_中国篮球即将来袭!202021赛季CBA赛程时间表
  5. edittext 选中焦点在最后_安卓开发中EditText的焦点改变处理(获取焦点和失去焦点交互变化)...
  6. ITK:观察过滤器Watch A Filter
  7. 系统磁盘空间满的一个问题
  8. Java 常用的 4 种加密方式(MD5+Base64+SHA+BCrypt)
  9. Mendeley Destop引用格式自定义调整
  10. 手工内存管理规则的总结
  11. Discuz!风格模版初级不完全修改教程
  12. 入侵检测领域数据集总结
  13. conda删除环境 显示cannot remove current environment. deactivate and run conda remove again
  14. 韩寒做错了(update 4 12)。
  15. Android九环刀之RatingBar之评委请亮分
  16. 【2022考研】 肖四大题(马原第一套)背诵笔记
  17. centos8重启网卡命令nmcli
  18. 企业如何选择BPM业务管理系统?要注意哪些?
  19. css01-css2
  20. 规模化交付OpenStack和Kubernetes,Airship成为顶级OSF项目

热门文章

  1. java实现图像对比度增强_java图片对比度调整示例代码
  2. 侠诺虚拟服务器,简便不简单 侠诺PPPoE服务器功能介绍
  3. 第12期《 蓄势待发 》1月刊
  4. dynamic-datasource Please check the setting of primary解决方案
  5. Linux下部署kettle
  6. 技术架构图-银行业务架构图解
  7. 【CSDN】创作区上传图片-粘贴/文件上传失败解决!
  8. 计算机二级证书北京联合大学,北京联合大学是几本
  9. vue打包部署,解决更新版本清理缓存问题
  10. lyapunov函数