心得整理之一--RDLC多数据源多表

      我将项目中的一部分提炼出来,写了这个Demo. 先说一下需求, 从 API接口, 获取数据源, 调用RDLC 生成PDF文件. (后面还有涉及到使用福昕PDf阅读器进行设置文件自定义内容,以供外部程序使用,这里就不列举.)

 现在要生成以下格式的PDF文件, 其中  "职称信息" 会有多个, "项目负责人登记信息(本市在建项目)" 也会有多个. 如下如

      心得整理之一--RDLC多数据源多表_第1张图片

    很明显, 这里涉及到的数据源,会有多个. 我将这个 拆成3个数据源. 

  第一个: 人员基本信息+pdf信息

  第二个: 职称信息List

  第三个: 项目负责人登记信息(本市在建项目)

 

特别说明:  项目负责人登记信息(本市在建项目) 下面的那一行字,  截止至xxxx详细信息是动态的,这里也是一个字段,  我将  列表以外的 字段, 都归为 第一个数据源里面.

第一步: 构建 实体类

  

 /// 
    /// 人员基本信息
    /// 
    public class Ryjbxx
    {
        /// 
        /// pdf文件编号
        /// 
        public string pdfbh { get; set; }
       
        /// 
        /// 生成时间
        /// 
        public string scsj { get; set; }
      
        /// 
        /// 姓名
        /// 
        public string xm { get; set; }
        /// 
        /// 证件号
        /// 
        public string zjh { get; set; }
        /// 
        /// 证件类型
        /// 
        public string zjlx { get; set; }

        /// 
        /// 在建项目截止日期
        /// 
        public string zjxm_jzrq { get; set; }
Ryjbxx
 /// 
    /// 人员职称信息
    /// 
    public class Ryzcxx
    {
        /// 
        /// 人员职称
        /// 
        public string ryzc { get; set; }
        /// 
        /// 证书编号
        /// 
        public string zsbh { get; set; }
        /// 
        /// 批准日期
        /// 
        public string pzrq { get; set; }
        /// 
        /// 发证机构
        /// 
        public string fzjg { get; set; }
    }
Ryzcxx
    /// 
    /// 在建项目信息
    /// 
    public class Ryzjxmxx
    {
        /// 
        /// 项目名称
        /// 
        public string xmmc { get; set; }
        /// 
        /// 合同信息报送编号
        /// 
        public string htxxbsbh { get; set; }
        /// 
        /// 合同类别
        /// 
        public string htlb { get; set; }
    }
Ryzjxmxx

 

第二步: 业务类,获取数据源

 我这里做了一下数据模拟.

    public class DataSourceBLL
    {
        /// 
        /// 获取人员基本信息
        /// 
        /// 
        public List GetRyjbxxList()
        {
            List list = new List();
            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;
        }

        /// 
        /// 获取在建项目信息
        /// 
        /// 
        public List GetRyzjxmxxList()
        {
            List list = new List();
            Ryzjxmxx itme1 = new Ryzjxmxx() { htlb = "施工", htxxbsbh = "W2015080136330", xmmc = "延吉中路(双阳路-营口路)道路整治工程" };
            Ryzjxmxx itme2 = new Ryzjxmxx() { htlb = "施工", htxxbsbh = "W2015080136316", xmmc = "阿里巴巴(上海)物联网技术应用中心" };
            list.Add(itme1);
            list.Add(itme2);
            return list;
        }

        /// 
        /// 获取人员职称信息
        /// 
        /// 
        public List GetRyzcxxList()
        {
            List list = new List();
            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报表, 大概是下面这个样子.

            心得整理之一--RDLC多数据源多表_第2张图片

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

           心得整理之一--RDLC多数据源多表_第3张图片

 

           这篇文章 主要点,就在这里. 

          5.新建一个rdlc, 拉一个 表, 可用数据集 选择 Ryjbxx,

            再新建一个rdlc, 拖一张表, 可用数据集 选择 Ryzjxmxx

   

         6. 后面2个 里面的 数据字典,拷贝到第一个 rdlc里面.并且更改 DataSource 和DataSet 名称

            右键GRPdfTemp.rdlc ==> 打开方式 ==>选择 XML(文本)编辑器

            拉到最下面, 可以看到  节点和  节点

            心得整理之一--RDLC多数据源多表_第4张图片

 

          心得整理之一--RDLC多数据源多表_第5张图片

         7.将  以上两张 rdlc中的 DataSource 部分, 拷贝到 GRPdfTemp.rdlc 的  DataSources 节点里面, 现在改一下DataSources  的 Name属性  

                  以上两张 rdlc中的 DataSet部分  ,拷贝到 GRPdfTemp.rdlc 的 DataSets 里面 ,然后改一下 DataSet  的Name  属性  , 还有  节点里面的 

                 

         8. 现在 GRPdfTemp.rdlc 里面 下面有3个 ,如下所示

               

  <DataSources>
    <DataSource Name="DataSource_Ryjbxx">
      <ConnectionProperties>
        <DataProvider>System.Data.DataSetDataProvider>
        <ConnectString>/* Local Connection */ConnectString>
      ConnectionProperties>
      <rd:DataSourceID>af7df84f-629d-422c-8be7-57ce146074edrd:DataSourceID>
    DataSource>
    <DataSource Name="DataSource_Ryzcxx">
      <ConnectionProperties>
        <DataProvider>System.Data.DataSetDataProvider>
        <ConnectString>/* Local Connection */ConnectString>
      ConnectionProperties>
      <rd:DataSourceID>d37e0668-2343-42cd-83f5-77c9fd7f070ard:DataSourceID>
    DataSource>
    <DataSource Name="DataSource_Ryzjxmxx">
      <ConnectionProperties>
        <DataProvider>System.Data.DataSetDataProvider>
        <ConnectString>/* Local Connection */ConnectString>
      ConnectionProperties>
      <rd:DataSourceID>960a9437-ce82-473b-9466-91dbfa9eadd4rd:DataSourceID>
    DataSource>
  DataSources>

         对应的 3个DataSet

 

     心得整理之一--RDLC多数据源多表_第6张图片

         9 这里就能选到数据源了 

             心得整理之一--RDLC多数据源多表_第7张图片

          10  如果你不下心选错了 DataSource, 后面不能重新选,只能 改 rdlc 原代码 xml信息了.

                 每一张表是 一个 , 指定数据集   节点, 更改里面的 对应的 名字, 可以选到 对应数据源下面的字段.

           心得整理之一--RDLC多数据源多表_第8张图片

           

  

第四步: 调用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 list1 = dataSourceBLL.GetRyjbxxList();
            List list2 = dataSourceBLL.GetRyzcxxList();
            List 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 list1, List list2,List 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

 

 生成结果样图

 心得整理之一--RDLC多数据源多表_第9张图片

 

  程序源代码 :  点击下载 

          

 

 

 

 

 

 

 

   

 

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

你可能感兴趣的:(心得整理之一--RDLC多数据源多表)