`
wsql
  • 浏览: 11778271 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Sql Server Reporting Service的页面分页讨论

 
阅读更多

以前在使用Reporting Service的时候都不知道,其分页的具体规则。只知道当觉得报表每页长度太小的时候就把报表主体拉长,希望这样报表在每页可以显示更多的数据,当然得到的结果是不尽人意的,因为你会发现你将报表主体拉长后报表还是在原先的位置分页了,其中根本的原因是,控制报表分页位置的并不是报表主体的长和宽,而应该是报表属性窗口中纸张大小标题下的宽度和高度。

1,先搞清怎么调整页面纸张的高度和宽度

再继续下面的讲解之前,有两个概念大家需要清楚,那就是InteractiveSize(交互式页面长宽)和PageSize(页面长宽),这是SSRS中控制页面纸张大小的两个属性,这两个属性可以在SSRS的属性窗口上选中报表后看到(打开属性窗口,再点击设计器上除报表主体、页眉、页脚以外空白区域的任意位置,就在属性窗口上选中报表了),那为什么SSRS中有两个属性来控制页面的长宽呢?

属性窗口中的InteractiveSize和PageSize属性

这是因为根据报表呈现格式的不同,根据页面大小来进行分页的机制也有所不同。大家知道SSRS的报表可导出成很多种格式:Excel、Word、PDF、CSV、HTML、XML,而这些文件格式的分页机制都是不一样的,比如PDF和EXCEL、HTML的分页机制就不同,而XML根本就不能分页。所以根据报表呈现格式的不同,分页后展现的效果自然也就不一样。

那么这里在InteractiveSize中设置的宽度和高度就控制着EXCEL和HTML的分页长宽,而在PageSize中设置的宽度和高度控制着PDF的分页长宽。这意味着根据报表呈现格式的不同,InteractiveSize和PageSize中只有一个在发挥着指定页面纸张长宽的中作用。在SqlServer2008上当你在报表属性窗口中纸张大小标题下设置宽度和高度后,InteractiveSize和PageSize也都会随之而改变成设置的值。但是在SqlServer2005上当你在报表属性窗口中纸张大小标题下设置宽度和高度后,你会发现只有PageSize属性改变成了设置的值,InteractiveSize属性的值没有发生变化,需要你在SSRS的属性窗口中手动去修改。

报表属性窗口中纸张大小标题下的宽度和高度选项

2,现在再来看分页

那么页面纸张大小和分页有什么关系呢?

若当前报表主体区域的高度加上页眉和页脚(前提是报表有页眉和页脚)的高度后大于了页面纸张的高度,那么SSRS就会在报表主体区域刚好达到页面纸张的高度的位置插入垂直分页符。

这里我具体来说明这个情况,假设报表页眉和页脚加在一起现在是10CM,报表主体上有一个Table,这个Table假如有100行数据,假如显示完这100行数据需要报表主体100CM的高度(每行1CM),现在将报表的InteractiveSize和PageSize的Height设置成40CM,也就是每页纸张的高度就是40CM,那么由于在显示Table的时候单个页面无法容纳所有数据,所以当Table显示到第20行数据的时候,由于页眉页脚20cm+报表主体20CM=40CM,这时第一页的高度达到了纸张的高度40CM,所以SSRS会在Table的第20行数据后插入垂直分页符(插入分页符后,报表会立即分页,所以分页符所在位置会成为报表主体旧的一页的结束,和新的一页的开始,分页符后面的报表内容会在新页上继续显示),那么剩下的80行Table数据就只能在第一页后面的页面上显示了,同理在第二页上,当Table的数据从21行显示到第40行的时候,由于第二页也达到了40CM的页高,SSRS会在第40行下面插入垂直分页符,剩下的60行数据只有在第二页后面的页面显示了。以此类推那么要显示完整个Table就需要5页。

同样如果你用的是一个矩阵,大家都知道矩阵会从垂直和水平两个方向显示数据,如果你的矩阵在水平方向显示数据时,导致报表主体的宽度大于了页面纸张的宽度,那么SSRS会在矩阵的列上插入水平分页符,矩阵剩下的列数据就只有在新的一页上显示了。

另外要多说一句,大家也看到设置报表主体的高度和宽度意义并不是太大,因为假如你在SSRS的设计模式下将报表主体的高度设置为只有10CM,如果报表主题上有个Table,这个Table有100行数据(还是假设每行1CM),那么为了显示这100CM的数据报表主体会被撑长,远远大于这10CM的高度,虽然用处不大但是设置报表主体的长宽确实也会影响到报表的的分页,这会在后面讲到。

3,人为插入的分页符

SSRS中的某些控件支持在控件前和控件后插入分页符,比如Table就支持在前后插入分页符,现在我们假定在一个Table上选中“在组件后添加分页符”,这就在Table后手动添加了分页符,那么Table在垂直方向显示完所有数据后会在后面立刻分页,这就产生了一个有趣的现象,比如假如这报表一共用了3页来显示Table的数据,每页能显示20行数据(每行1CM),又假如这个Table一共有43行数据,那么你会在第三页上发现Table在显示完最后3行数据后立刻就分页了,但是第三页只有3行数据,也就是说第三页的报表主体只有3CM高,根本没有达到20CM的页面分页高度,所以第三页看起来高度会很短,这就是在控件上手动插入分页符造成的。

4,报表主体的长宽对分页产生的影响

前面说了设置报表主体的长宽也会影响到报表的的分页,现在就举个例子来说明,假如你设置了报表的页面纸张高度为40CM,现在假如报表每页的页眉页脚占20CM,报表主体设置为60CM,报表主体上有个Table,在设计模式下占2CM,下面用个图来展示这个例子:

大家可以看到报表主体上有58CM的空白位置。而且由于这58CM什么控件都没有也不会被撑长,现在假如Table有60行数据(每行1CM),报表就会用3页来显示Table的数据,但是显示完Table后,由于在SSRS的设计模式上,Table下还有58CM的空白区域,那么SSRS会怎么来处理呢?

在Sql Server2005上经测试发现,这剩余的58CM空白区域会全部显示在最后一页上,即便最后一页的整体高度78CM大大超过了纸张设置高度40CM,这段空白区域也不会分页。

在Sql Server2008上经测试发现,这剩余的58CM空白区域会被分成3页来显示,因为每页20CM的报表主体高度,所以20+20+18=58,58CM的高度需要3页来显示,但是有趣的现象是虽然最后有3页的空白页,但是在运行时这3页每页显示报表主体的高度都是0CM,因为SSRS发现最后3页报表主体上没有任何控件,就做了优化将报表主体压缩成了0CM了,只显示页眉和页脚,不信你可以在最后58CM区域上前20CM上放个TextBox,那么由于报表最后上3页的第一页上面有个控件TextBox,所以这一页报表主体是TextBox的高度,但是最后两页报表主体会被压缩为0CM。

5,使用HTML和Excel格式时对分页带来的问题

前面说了控制HTML和Excel格式页面纸张长宽的是属性InteractiveSize(交互式页面长宽),之所以用“交互式页面长宽”来控制HTML和Excel的页面大小,就是因为在HTML和EXCEL格式上报表可以使用一些交互式展现功能,例如Table上的某一组的数据行先是隐藏的,在点击父组的某个文本框后再显示这组的数据行,这就是一种交互式特效,是HTML和EXCEL格式独有的。这就带来了个问题,MSDN上也提到了这点,交互式特效会使得页面的长宽发生变化,比如Table有一组数据GroupII有50行,但是在隐藏组GroupII时其父组GroupI可能只在Table上显示3行。那么本来在最开始的时候由于GoupII处于隐藏状态Table上只有GroupI的3行数据,3行数据报表一页就能显示完,但是如果现在展开GoupI后将所有GroupII的数据显示出来,Table就变成了53行数据,那么糟糕的事情就出现了,SSRS不会对使用交互式特效多出来的高度进行分页,意思就是说,假如本来报表页面纸张大小规定每页只能显示20行数据,但是这多出来的50行数据由于是有交互式特效产生的,即便超过了20行数据的限制,SSRS还是不会对现在拥有53行数据的Table进行分页,Table上的所有53行数据都会显示在一页上,设想下如果Table下某个组展开后产生了1000行数据会是什么情况,这1000行数据会全部显示在一页上,你的页面估计已经崩溃了.....

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics