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