动态RDLC报表类DynamicReport:基础设置

了解了RDLC报表的结构后,我们就来把传递进来的数据转变成符合RDLC报表结构的xml格式文档,用一个类的形式来做,方便以后调用。
       这个报表是按我项目的需要来做的,基本要求:
      1、可以设置页面大小、边距、字体、数据表样式;
      2、可以做多维表头和统计;
      3、可以添加多个数据表和标题;
      4、可以自动签名、盖章。

基础的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;
using System.Data;
using Microsoft.Reporting.WinForms;
using System.Text;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Xml.Serialization;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Printing;
using System.Drawing.Imaging;namespace RDLC
{public class DynamicReport : IDynamicReport{//需要一个ReportViewer来接收送递进来的ReportViewer加载RDLCprivate ReportViewer _report;private string languageCode = "zh_CHS";private string totalString = "合计:";private string notesString = "备注:";//设置字体和大小private string fontString = "微软雅黑";private int fontSize = 9;//设置页面大小private float pageWidth = 21.0F;private float pageHeight = 29.7F;//设置上边距和左边距,右边和下边就不用设置了,一般是对称的private float topMargin = 0.8F;private float leftMargin = 1.5F;#region  参数设置public string LanguageCode{get { return languageCode; }set{languageCode = value;if (languageCode == "zh_CHT"){totalString = "合計:";notesString = "備註:";}else if (languageCode == "en"){totalString = "Total:";notesString = "Remark:";}else{totalString = "合计:";notesString = "备注:";}}}public string FontString{get { return fontString; }set { fontString = value; }}public int FontSize{get { return fontSize; }set { fontSize = value; }}public float PageHeight{get { return pageHeight; }set { pageHeight = value; }}public float PageWidth{get { return pageWidth; }set { pageWidth = value; }}public float LeftMargin{get { return leftMargin; }set { leftMargin = value; }}public float TopMargin{get { return topMargin; }set { topMargin = value; headerHeight = value; }}#endregionpublic DynamicReport(){}}
}

这里继承了一个IDynamicReport接口

    public interface IDynamicReport{void SetReport(ReportViewer reportViewer, DisplayMode displayMode = DisplayMode.PrintLayout, ZoomMode zoomMode = ZoomMode.PageWidth);void AddData(DataTable dataTable, string totalColumn);void ShowReport();void LoadReport(string reportPath);void SetColoumStyle(List<ReportColoumStyle> coloumStyle);}

需要为表格的样式增加一个辅助类和枚举,这样主涌方便地设置表格的样式。

    public class ReportColoumStyle{public string ColoumName { get; set; }public float ColoumWidth { get; set; }public TextAlign TextAlign { get; set; }public ConsoleColor ConsoleColor { get; set; }public Boolean IsShortDate { get; set; }public ReportColoumStyle(){ColoumWidth = DynamicReport.ColoumWidth;}}public enum TextAlign{Left,Center,Right}

接下来就是主体部分了,先来定义一个空白的包含RDLC所需节点的xml文档来做模板,模板中用@XXX来表示相应的节点内容,比如@DataSets、@Tablix分别代表要设置的数据源中的数据表和<Body>中要显示的数据表格,后面会用传递进来的数据替换。

        protected string _docTemplate ="<?xml version=\"1.0\" encoding=\"utf-8\"?>" +"<Report xmlns:rd=\"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner\" xmlns=\"http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition\">" +"<DataSources>" +"   <DataSource Name=\"DummyDataSource\">" +"       <ConnectionProperties>" +"           <DataProvider>SQL</DataProvider>" +"           <ConnectString />" +"       </ConnectionProperties>" +"       <rd:DataSourceID>3eecdab9-6b4b-4836-ad62-95e4aee65ea8</rd:DataSourceID>" +"   </DataSource>" +"</DataSources>" +"<DataSets>@DataSets</DataSets>" +"<Body>" +"<ReportItems>@Tablix" +"</ReportItems>" +"<Style />" +"<Height>1cm</Height>" +"</Body>" +"<Width>3cm</Width>" +"<Page>" +"   <PageHeader>" +"      <Height>@HeaderHeightcm</Height>" +"      <PrintOnFirstPage>true</PrintOnFirstPage>" +"      <PrintOnLastPage>true</PrintOnLastPage>" +"      <ReportItems>@PageHeader</ReportItems>" +"      <Style>" +"         <Border>" +"            <Style>None</Style>" +"         </Border>" +"      </Style>" +"   </PageHeader>" +"   <PageFooter>" +"      <Height>@FooterHeightcm</Height>" +"      <PrintOnFirstPage>true</PrintOnFirstPage>" +"      <PrintOnLastPage>true</PrintOnLastPage>" +"      <ReportItems>@PageFooter</ReportItems>" +"      <Style>" +"         <Border>" +"            <Style>None</Style>" +"         </Border>" +"      </Style>" +"   </PageFooter>" +"   <PageWidth>21.0cm</PageWidth>" +"   <PageHeight>29.7cm</PageHeight>" +"   <LeftMargin>0.0cm</LeftMargin>" +"   <RightMargin>0.0cm</RightMargin>" +"   <TopMargin>0.0cm</TopMargin>" +"   <BottomMargin>0.0cm</BottomMargin>" +"   <ColumnSpacing>0.13cm</ColumnSpacing>" +"   <Style />" +"</Page>" +"<EmbeddedImages>@LogoImageData</EmbeddedImages>" +"<rd:ReportID>809f16cf-ea78-4469-bf43-965c4afe69d0</rd:ReportID>" +"<rd:ReportUnitType>Cm</rd:ReportUnitType>" +"</Report>";

同样地分别给页眉里标签中用到的Textbox、标题中用到的Textbox和签名中的图片定义一个格式

        //标签中用到的Textboxprotected string LabelPattern =" <Textbox Name=\"Name@TextboxName\"> "+ @"<CanGrow>true</CanGrow><KeepTogether>true</KeepTogether><Paragraphs><Paragraph><TextRuns><TextRun><Value>@NameText</Value><Style><FontFamily>@FontString</FontFamily><FontSize>9pt</FontSize></Style></TextRun></TextRuns><Style><TextAlign>Right</TextAlign></Style></Paragraph></Paragraphs><rd:DefaultName>Name@TextboxName</rd:DefaultName><Top>@TopPositioncm</Top><Left>@NamePositioncm</Left><Height>0.5cm</Height><Width>@NameWidthcm</Width><ZIndex>1</ZIndex><Style><Border><Style>None</Style></Border><VerticalAlign>Middle</VerticalAlign><PaddingLeft>0pt</PaddingLeft><PaddingRight>2pt</PaddingRight><PaddingTop>0pt</PaddingTop><PaddingBottom>0pt</PaddingBottom></Style></Textbox>" +" <Textbox Name=\"Split@TextboxName\"> "+ @"<CanGrow>true</CanGrow><KeepTogether>true</KeepTogether><Paragraphs><Paragraph><TextRuns><TextRun><Value>:</Value><Style><FontFamily>@FontString</FontFamily><FontSize>9pt</FontSize></Style></TextRun></TextRuns><Style><TextAlign>Left</TextAlign></Style></Paragraph></Paragraphs><rd:DefaultName>Split@TextboxName</rd:DefaultName><Top>@TopPositioncm</Top><Left>@SplitPositioncm</Left><Height>0.5cm</Height><Width>0.3cm</Width><ZIndex>1</ZIndex><Style><Border><Style>None</Style></Border><VerticalAlign>Middle</VerticalAlign><PaddingLeft>0pt</PaddingLeft><PaddingRight>0pt</PaddingRight><PaddingTop>0pt</PaddingTop><PaddingBottom>0pt</PaddingBottom></Style></Textbox>" +" <Textbox Name=\"Value@TextboxName\"> "+ @"<CanGrow>true</CanGrow><KeepTogether>true</KeepTogether><Paragraphs><Paragraph><TextRuns><TextRun><Value>@ValueText</Value><Style><FontFamily>@FontString</FontFamily><FontSize>9pt</FontSize><Color>@Color</Color></Style></TextRun></TextRuns><Style><TextAlign>Left</TextAlign></Style></Paragraph></Paragraphs><rd:DefaultName>Value@TextboxName</rd:DefaultName><Top>@TopPositioncm</Top><Left>@ValuePositioncm</Left><Height>0.5cm</Height><Width>@ValueWidthcm</Width><ZIndex>1</ZIndex><Style><Border><Style>None</Style></Border><VerticalAlign>Middle</VerticalAlign><PaddingLeft>0pt</PaddingLeft><PaddingRight>0pt</PaddingRight><PaddingTop>0pt</PaddingTop><PaddingBottom>0pt</PaddingBottom></Style></Textbox>";//标题中用到的Textboxprotected string TitlePattern =" <Textbox Name=\"Title@TextboxName\"> "+ @"<CanGrow>true</CanGrow><KeepTogether>true</KeepTogether><Paragraphs><Paragraph><TextRuns><TextRun><Value>@Title</Value><Style><FontFamily>@FontString</FontFamily><FontSize>@FontSizept</FontSize><FontWeight>@FontWeight</FontWeight><Color>@Color</Color></Style></TextRun></TextRuns><Style><TextAlign>@TextAlign</TextAlign></Style></Paragraph></Paragraphs><rd:DefaultName>Title@TextboxName</rd:DefaultName><Top>@TopPositioncm</Top><Left>@LeftPositioncm</Left><Height>@Heightcm</Height><Width>@Widthcm</Width><ZIndex>1</ZIndex><Style><Border><Style>None</Style></Border><VerticalAlign>Bottom</VerticalAlign><PaddingLeft>0pt</PaddingLeft><PaddingRight>0pt</PaddingRight><PaddingTop>0pt</PaddingTop><PaddingBottom>0pt</PaddingBottom></Style></Textbox>";//签名中的图片string signaturePattern = "         <Image Name=\"EmployeeSignature\">" +"            <Source>Embedded</Source>" +"            <Value>SignatureImg</Value>" +"            <MIMEType>image/png</MIMEType>" +"            <Sizing>AutoSize</Sizing>" +"            <Top>@TopPositioncm</Top>" +"            <Left>@LeftPositioncm</Left>" +"            <Height>3.9cm</Height>" +"            <Width>3.9cm</Width>" +"            <ZIndex>1</ZIndex>" +"            <Visibility>" +"               <Hidden>=IIF(First(Fields!Reviewed.Value, \"DataLogoData\")=\"√\", False, True)</Hidden>" +"            </Visibility>" +"            <Style>" +"               <Border><Style>None</Style></Border>" +"            </Style>" +"         </Image>";

当然也对DataSets和Tablix定义一个格式

 internal class ReportItemPattern{public string DataSetName { get; set; }public string DataSetString { get; set; }public string TablixString { get; set; }public dynamic Data { get; set; }public string DataSetPattern{get{return "    <DataSet Name=\"@DataSetNameData\">" +"       <Fields>@Fields</Fields>" +"       <Query>" +"           <DataSourceName>DummyDataSource</DataSourceName>" +"           <CommandText />" +"       </Query>" +"    </DataSet>";}}public string TablixPattern{get{return " <Tablix Name=\"Tablix@DataSetName\">" +"   <TablixBody>" +"       <TablixColumns>@TablixColumns</TablixColumns>" +"       <TablixRows>" +"           <TablixRow>" +"               <Height>0.5cm</Height>" +"               <TablixCells>@TablixHeader</TablixCells>" +"           </TablixRow>" +"           <TablixRow>" +"               <Height>0.5cm</Height>" +"               <TablixCells>@TablixCells</TablixCells>" +"           </TablixRow>" +"@TotalRow" +"       </TablixRows>" +"   </TablixBody>" +"   <TablixColumnHierarchy>" +"       <TablixMembers>@TablixMember</TablixMembers>" +"   </TablixColumnHierarchy>" +"   <TablixRowHierarchy>" +"       <TablixMembers>" +"@MergeMember" +"           <TablixMember>" +"               <KeepWithGroup>After</KeepWithGroup>" +"               <RepeatOnNewPage>true</RepeatOnNewPage>" +"           </TablixMember>" +"           <TablixMember>" +"               <Group Name=\"详细信息@DataSetName\" />" +"           </TablixMember>" +"@TotalMember" +"       </TablixMembers>" +"   </TablixRowHierarchy>" +"   <DataSetName>@DataSetNameData</DataSetName>" +"   <Top>@TopPositioncm</Top>" +"   <Left>@LeftPostioncm</Left>" +"   <Height>0.5cm</Height>" +"   <Width>1.0cm</Width>" +"   <Style>" +"       <Border>" +"           <Style>None</Style>" +"       </Border>" +"   </Style>" +"</Tablix>";}}}

之前已经说了这里的数据列的数据类型全部用字符System.String,可数据库里可不止有字符类别啊,那就用下面的方法来转换,部分值也相应转换一下,比如Bool字段的”True“转换成”√“,数字空值转换成0等等。

    internal static class DynamicReportExtension{public static dynamic RemoveZeroData(this object data){if (data is DataTable) return ((DataTable)data).ChangeEachColumnTypeToString();return data;}public static DataTable ChangeEachColumnTypeToString(this DataTable dt){DataTable tempdt = new DataTable();foreach (DataColumn dc in dt.Columns){DataColumn tempdc = new DataColumn();tempdc.ColumnName = dc.ColumnName;tempdc.DataType = typeof(String);tempdt.Columns.Add(tempdc);//System.Windows.Forms.MessageBox.Show(dc.DataType.ToString());}int coloumCount = dt.Columns.Count;foreach (DataRow dr in dt.Rows){var newrow = tempdt.NewRow();for (int i = 0; i < coloumCount; i++){var value = dr[i].ToString();switch (value){case "":if (dt.Columns[i].DataType.ToString().IndexOf("System.Int") > -1) newrow[i] = "0";if (dt.Columns[i].DataType.ToString().IndexOf("System.Decimal") > -1) newrow[i] = "0.00";break;case "True":newrow[i] = "√";break;case "False":newrow[i] = "-";break;case "0.00%":newrow[i] = "-";break;default:newrow[i] = value;break;}}tempdt.Rows.Add(newrow);}return tempdt;}}

到此,主体的基础部分已经完成,下面就是操作相应的节点处理了。

动态RDLC报表(一)

动态RDLC报表(二)

动态RDLC报表(三)

动态RDLC报表(四)

动态RDLC报表(五)

动态RDLC报表(六)

动态RDLC报表(七)

动态RDLC报表完整实例下载

动态RDLC报表(三)相关推荐

  1. 使用RDLC报表(三)--向RDLC报表传入参数

    在使用报表向客户展示结果数据时,实时的在报表中显示某些特定的数据是必需的,如:显示的部门.打印的日期等.本文只简单的演示向报表内传入一个字符值.如有其它问题,欢迎讨论. 1.新建一个工程TestRep ...

  2. C# rdlc 报表学习总结

    C# 创建报表过程详解 http://www.jb51.net/article/68481.htm 本文给大家介绍的是使用vs2012 c#创建报表的全部过程的记录,十分的详细,有需要的小伙伴可以参考 ...

  3. RDLC报表系列(一) 简单的动态数据绑定和配置

    RDLC报表系列(一) 简单的动态数据绑定和配置 原文:RDLC报表系列(一) 简单的动态数据绑定和配置 RDLC系列链接 RDLC报表系列(一) 简单的动态数据绑定和配置  RDLC报表系列(二) ...

  4. C# 动态生成RDLC报表文件

    Visual Studio 中的报表有两种,水晶报表和微软自己的RDLC报表,水晶报表太复杂,一直不用.感觉rdlc的报表很好用,跟着web一起发布也很简单(只可惜只能在IE中使用).不好的是太繁琐, ...

  5. 动态生成RDLC报表

    前段时间,做了RDLC报表,主要是三块功能: 1.从DataGrid提取(包括最新的增删改)数据,自动生成对应的RDLC报表文件(以流的形式驻存在内存中),用ReportViewer类来展示.打印.排 ...

  6. [转]RDLC报表-参数传递及主从报表

    本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/09/19/2180940.html 今天继续学习RDLC报表的"参数传递"及&qu ...

  7. 7月13日RDLC报表,ReportViewer使用详解

    7月13日 RDLC报表,ReportViewer VS .NET开发中,用什么做报表? 可能的回答是Crystal Report,自.NET"紧密"集成Crystal Repor ...

  8. 分享懒人张RDLC报表(四)

    来自懒人张:RDLC报表(四)         RDLC报表中有一个概念叫数据区域(Data Region),数据区域是数据绑定的报表项目,在数据区域中可以显示来自数据集的多行数据.RDLC报表设计器 ...

  9. 项目中使用RDLC报表

    原文地址:http://www.cnblogs.com/wuhuacong/p/4109833.html RDLC是一个不错的报表,有着比较不错的设计模式和展现效果,在我的Winform开发里面,使用 ...

最新文章

  1. es6学习笔记2-—symbol、变量与作用域
  2. perl随机打乱数组
  3. 1.7 截取(提取)子字符串(substring())
  4. 格力的“阵痛”与“头痛”
  5. 15张图呈现数据库事务背后的并发原理
  6. df满足条件的值修改_如何用python实现熵值法求指标权重(实例)
  7. WTA (winner-take-all) 与 自组织映射 SOM (self organizing map)的理解
  8. 【图文】在windows7 下安装和配置Memcached 64-bit for Windows
  9. java和C#的区别汇总
  10. linux添加jdk权限不够
  11. python安装numpy模块教程_Python中Numpy包的安装与使用方法简明教程
  12. 缓存问题(二) 布隆过滤器(Bloom Filter) 介绍和原理
  13. 管理者如何抓绩效管理?
  14. 计算机网络课程设计组建大型网吧局域网,计算机网络课程设计组建网吧局域网...
  15. vue图片时间轴滑动_Vue之时间轴组件
  16. VMware虚拟机系统没有声音?
  17. ASO优化:如何提高App Store应用商店中排名?
  18. python demo.py_pythonDemo.py
  19. 满意度模型及其应用——客户满意度
  20. BuddyPress汉化中文语言包 BuddyPress汉化教程步骤

热门文章

  1. codeforce之Magic Powder
  2. 谷歌网页无法翻译4步教你搞定
  3. 计算机在条形码的应用,条码应用系统的组成
  4. BSV节点软件升级版本v1.0.9正式发布
  5. vue项目怎么在手机查看
  6. 【抓包工具】配置:Charles 配置华为手机 HTTPS CA 证书
  7. 如何为MacBook或Mac电脑恢复出厂设置
  8. 【技巧】批量解除可执行文件的锁定 “此文件来自其他计算机,可能被阻止以帮助保护该计算机”
  9. 专业人脸识别研究计算机的配置,联想电脑win10系统人脸识别登录的设置方法
  10. html复制并弹窗提示已复制,js复制操做,复制成功弹出提示框