Reporting打印分頁

以前在使用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行數據會全部顯示在一頁上,你的頁面估計已經崩潰了.....


http://blog.csdn.net/tearsmo/article/details/6583691

http://msdn.microsoft.com/zh-cn/library/2a767f0f-84f2-4099-8784-1e37790f858e(v=sql.105)

http://bbs.csdn.net/topics/390633353

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章