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>
本文详细介绍了RDLC报表的结构,包括DataSources、DataSets、Body、页眉和页脚等关键元素,并提供了代码示例。在动态生成RDLC报表时,需要注意数据源的指定、数据表的结构、报表内容的展示以及处理空值和图片控件的用法。
&spm=1001.2101.3001.5002&articleId=126241043&d=1&t=3&u=ebd1229936cf4543a63f7e96b67b71a7)
2933

被折叠的 条评论
为什么被折叠?



