当前位置:网站首页>动态RDLC报表(二)
动态RDLC报表(二)
2022-08-09 16:51:00 【xgh815】
RDLC报表的结构
要根据不同数据动态生成RDLC报表,我们需要先了解RDLC报表的结构。右键以记事本打开一个rdlc为后缀的文件,你就会我感到这世态炎凉是一个xml文件,里面包含不同的节点,简化后大致如下:
<?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>
//数据源
</DataSources>
<DataSets>
//DataSet数据表
</DataSets>
<Body>
<ReportItems>
//数据展示
</ReportItems>
<Style />
<Height>1cm</Height>
</Body>
<Width>3cm</Width>
<Page>
<PageHeader>
//页眉
</PageHeader>
<PageFooter>
//页脚
</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>
//图片
</EmbeddedImages>
<rd:ReportID>809f16cf-ea78-4469-bf43-965c4afe69d0</rd:ReportID>
<rd:ReportUnitType>Cm</rd:ReportUnitType>
</Report>
我们从这个简化的RDLC报表结构中可以看到有DataSources数据源、DataSets数据表、Body主要数据显示、EmbeddedImages图片、页眉、页脚、页面属性,下面我们一个一个来分解这些节点。
1、DataSources数据源
在常规的报表设计中需要先定义一个xsd为后缀的DataSet数据源文件,里面有DataSets数据表,同一个项目中可以有许多不同名称数据源,RDLC需要指定使用那一个数据源,这里是动态RDLC就简单一点,就用固定一个就好了,代码如下:
<DataSources>
<DataSource Name="DummyDataSource">
<ConnectionProperties>
<DataProvider>SQL</DataProvider>
<ConnectString />
</ConnectionProperties>
<rd:DataSourceID>3eecdab9-6b4b-4836-ad62-95e4aee65ea8</rd:DataSourceID>
</DataSource>
</DataSources>
2、DataSets数据表
这里就是数据的名称和结构,也就是数据表的名称和所包含的数据列(名称、数据类型),可以有多个数据表,但名称不能有相同,否则就会出错。这里的数据列的数据类型全部用字符System.String就可以了,以下是具体代码:
<DataSets>
<DataSet Name="数据表名称">
<Field Name="字段名称">
<DataField>字段名称</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
......
<Query>
<DataSourceName>DummyDataSource</DataSourceName>
<CommandText />
</Query>
</DataSet>
......其它数据表......
</DataSets>
3、Body数据显示
<Body>
<ReportItems>
//数据展示
</ReportItems>
<Style />
<Height>1cm</Height>
</Body>
<Width>3cm</Width>
在这个Body中,最主要的是ReportItems节点,这里才显示内容的存放地方,样式、高和宽都不需理会,就定一个小一点的值就好了,注意RDLC报表中宽、高的值都是以cm或in为单位的,这里全用cm。
在ReportItems里可以放文本框、图片等控件,在这里是用来显示DataSet数据表的,所以就放Tablix表格控件就好了。
Tablix表格控件包含表头行和数据行,当然也可以增加其它行,如统计行。表头行对应的是数据表的列名,数据行就是对应列中的数据,其结构如下:
<Tablix Name="Tablix名称">
<TablixBody>
<TablixColumns>
<TablixColumn>
<Width>1.0cm</Width>
</TablixColumn>
......其它列,数据列有多少列就有多少个<TablixColumn>节点......
</TablixColumns>
<TablixRows>
//表头行
<TablixRow>
<Height>0.5cm</Height>
<TablixCells>
<TablixCell>
<CellContents>
//Textbox名称不能有相同,并且要和下面的DefaultName要相同
<Textbox Name="Textbox名称">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>列的名称</Value>
<Style><FontWeight>Bold</FontWeight><FontFamily>字体名称</FontFamily><FontSize>字体大小pt</FontSize></Style>
</TextRun>
</TextRuns>
<Style><TextAlign>Center</TextAlign></Style>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox名称</rd:DefaultName>
<Style>
<Border><Color>DarkGray</Color><Style>Solid</Style></Border>
<VerticalAlign>Middle</VerticalAlign>
<PaddingLeft>2pt</PaddingLeft><PaddingRight>2pt</PaddingRight><PaddingTop>2pt</PaddingTop><PaddingBottom>1pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
......其它列,数据列有多少列就有多少个<TablixCell>节点......
</TablixCells>
</TablixRow>
//数据行
<TablixRow>
<Height>0.5cm</Height>
<TablixCells>
<TablixCells>
<TablixCell>
<CellContents>
//Textbox名称不能有相同,并且要和下面的DefaultName要相同
<Textbox Name="Textbox名称">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Fields!列名.Value</Value>
<Style><FontFamily>字体名称</FontFamily><FontSize>字体大小pt</FontSize></Style>
</TextRun>
</TextRuns>
<Style><TextAlign>Center</TextAlign></Style>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox名称</rd:DefaultName>
<Style>
<Border><Color>DarkGray</Color><Style>Solid</Style></Border>
<VerticalAlign>Middle</VerticalAlign>
<PaddingLeft>2pt</PaddingLeft><PaddingRight>2pt</PaddingRight><PaddingTop>2pt</PaddingTop><PaddingBottom>1pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
......其它列,数据列有多少列就有多少个<TablixCell>节点......
</TablixCells>
</TablixRow>
......其它行,比如统计行......
</TablixRows>
</TablixBody>
<TablixColumnHierarchy>
<TablixMembers>
<TablixMember />
......数据表有多少列就要有多少个<TablixMember />......
</TablixMembers>
</TablixColumnHierarchy>
<TablixRowHierarchy>
<TablixMembers>
<TablixMember>
<KeepWithGroup>After</KeepWithGroup>
<RepeatOnNewPage>true</RepeatOnNewPage>
</TablixMember>
......如果是多维表头的话,需要重复上面这个<TablixMember>,多少行表头就出现多少个......
<TablixMember>
<Group Name="详细信息" />
</TablixMember>
......如果是有统计行或其它行的话就要相应增加<TablixMember><KeepWithGroup>Before</KeepWithGroup></TablixMember>......
</TablixMembers>
</TablixRowHierarchy>
//<DataSets>节点中的数据表名称
<DataSetName>数据表名称</DataSetName>
<Top>0.5cm</Top>
<Left>0.5cm</Left>
<Height>0.5cm</Height>
<Width>1.0cm</Width>
<Style>
<Border>
<Style>None</Style>
</Border>
</Style>
</Tablix>
4、页眉和页脚
页眉和页脚部分比较简单,只需在相关位置填入想要的文本框、图片等控件即可。
<PageHeader>
<Height>1.0cm</Height>
<PrintOnFirstPage>true</PrintOnFirstPage>
<PrintOnLastPage>true</PrintOnLastPage>
<ReportItems>
//相关的文本、图片等控件
</ReportItems>
<Style>
<Border>
<Style>None</Style>
</Border>
</Style>
</PageHeader>
<PageFooter>
<Height>1.0cm</Height>
<PrintOnFirstPage>true</PrintOnFirstPage>
<PrintOnLastPage>true</PrintOnLastPage>
<ReportItems>
//相关的文本、图片等控件
</ReportItems>
<Style>
<Border>
<Style>None</Style>
</Border>
</Style>
</PageFooter>
文本框控件代码:
<Textbox Name="Textbox名称">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>文本内容</Value>
<Style><FontFamily>字体名称</FontFamily><FontSize>字体大小pt</FontSize></Style>
</TextRun>
</TextRuns>
<Style><TextAlign>Center</TextAlign></Style>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox名称</rd:DefaultName>
<Style>
<Border><Color>DarkGray</Color><Style>Solid</Style></Border>
<VerticalAlign>Middle</VerticalAlign>
<PaddingLeft>2pt</PaddingLeft><PaddingRight>2pt</PaddingRight><PaddingTop>2pt</PaddingTop><PaddingBottom>1pt</PaddingBottom>
</Style>
</Textbox>
文本框控件中有一个问题,那就是Value为空的时间加载后会提示错误,那怕这个值变成一个空格也还是一样提示错误,未加载前的代码是一点问题也看不出有错误的的,所以不明白错在那里。而在Body数据显示中也用到Textbox,但空值时没有提示错误。这个问题曾经困扰了我好长时间,后来才知是加载后这种特殊格式的自动转成二行了,<Value>在一行,</Value>在下一行,这样肯定格式就不对啦,错误是自然的了。怎么办呢?其实也简单,只要是空值的时候就把<Value> </Value>转换成<Value />就好了。
图片控件代码:
<Image Name=\"EmployeeSignature\">
<Source>Embedded</Source>
<Value>SignatureImg</Value>
<MIMEType>image/png</MIMEType>
<Sizing>AutoSize</Sizing>
<Top>1.0cm</Top>
<Left>1.0cm</Left>
<Height>3.9cm</Height>
<Width>3.9cm</Width>
<ZIndex>1</ZIndex>
<Style>
<Border><Style>None</Style></Border>
</Style>
</Image>
其中<Value>SignatureImg</Value>中的SignatureImg,就是要在RDLC中增加一个名为SignatureImg的EmbeddedImage节点,重点是要把图片Byte[]转换成Base64String,Convert.ToBase64String(ImageToBytes(bitmap))。
<EmbeddedImage Name="SignatureImg"><MIMEType>image/png</MIMEType><ImageData>Base64String图片数据</ImageData></EmbeddedImage>
边栏推荐
猜你喜欢

Redis的那些事:一文入门Redis的基础操作

ABP 6.0.0-rc.1的新特性

Fees and inquiry methods of futures account opening exchanges

方舟开服务器Vmware虚拟机安装不上?

ABP详细教程——模块类

期货开户流程和手续费如何调整

2022 全球 AI 模型周报

期货开户应该了解的行内知识

What is hardware integrated development?What are the cores of hardware integrated development?

Self-taught software testing, how far can I go out to find a job?
随机推荐
SimpleDateFormat线程安全问题和解决方案
crm系统哪家好?好用的crm管理系统推荐
论如何提升学习的能力
[极客大挑战 2019]HardSQL
[ Kitex 源码解读 ] 请求重试
How to choose a good SaaS knowledge base tool?
Tan Zhongyi: Do you know who the "Queen of Open Source" is?
如何在 PC 机上测试移动端的网页?
Smart Tool Management System
自学软件测试,学到什么程度可以出去找工作啊?
Fees and inquiry methods of futures account opening exchanges
【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例...
2022 全球 AI 模型周报
原油等特殊期货开户要求和豁免
期货开户应该了解的行内知识
华为云全流程护航《流浪方舟》破竹首发,打造口碑爆款
What is test development and why is it so popular now?
The most complete architect knowledge map in history
uniapp电影购票选座系统源码
重谈联想5G编码投票事件