fastreport 入門教程之交叉報表,這種報表類型是表格結構,意思是它包含著一系列的行和列。
工具/原料
fastreport
方法/步驟
這種報表類型是表格結構,意思是它包含著一系列的行和列。同時它不可預知,表格有多少個行和列。這就是為什麼報表不但縱向增加,而且橫向增加。以下顯示這種類型的報表的例子:
表格的數據如下:
這個例子中,表格有兩個行和四個列。A和b行的標題,1,2,3,4是列的標題。A1,a2..a4,b1..b4是表格中的數據。我們創建一個數據集,有三個字段,包含如下內容:
a 1 a1
a 2 a2
a 3 a3
a 4 a4
b 1 b1
b 2 b2
b 3 b3
b 4 b4
第一個字段為行序號,第二個字段為列序號,第三個字段為表格數據。當輸出報表時,FastReport在內存創建一個表格,並填入數據。
標題如果有兩層,顯示數據如下:
報表需要如下數據:
a 10 1 a10.1
a 10 2 a10.2
a 20 1 a20.1
a 20 2 a20.2
b 10 1 b10.1
b 10 2 b10.2
b 20 1 b20.1
b 20 2 b20.2
內存中創建的表格數據如下:
1、創建交叉報表
現在我們從理論轉到實踐。我們創建一個簡單的報表,數據包含四年來的僱員的薪水。這樣,我們需要一個“CrossTest”的數據表,數據包含如下內容:
Name Year Salary
Ann 1999 3300
Ben 2002 2000
….
在delphi中創建一個新的工程,添加“TTable”,“TfrxDBData”和“TfrxReport”組件。並設值其屬性:
Table1:
DatabaseName = 'c:\Program Files\FastReport 4\Demos\Main'
TableName = 'crosstest.db'
frxDBDataSet1:
DataSet = Table1
UserName = 'SimpleCross'
為了完成交叉報表,我們需要使用組件“TfrxCrossObject” ,此組件在FastReport組件面板上。將他添加到delphi的表單中,不需要設置任何屬性;同時,包含全部可用函數的“frxCross”單元被添加到uses列表中。
進入報表設計器界面,首先連接數據源,再在報表中添加“Db Cross tab”組件。
通過事件編輯器,設置組件的相關屬性。雙擊組件可以打開編輯器界面。
圖形中數字區說明
1:可用的數據源下拉列表
2:選擇數據源的字段列表。字段可以被拖拽到3、4、5區域中。
3:生成行標題的字段列表。
4:生成列標題的字段列表。
5:顯示錶格數據的字段列表。
6:表格結構預覽
7:可選項。
在這個界面中,只能通過鼠標進行操作修改。在這個示例中,可以託動鼠標將2區域的字段列表託拽到3、4、5區域。然後點擊確定,顯示結構如下:
預覽報表,顯示界面如下:
2、改變顯示
讓我們改變組件的顯示模式。首先我們要做的就是改變標題的顏色,並改變Grand Total 改變為“彙總”。給邊非常簡單,一次選中“year”,“Name”,“Grand Total”組件,點擊按鈕設置顏色,
頁可以在組件的編輯器中選擇你喜歡的樣式。
改變“Grand Total” 標題,上擊要修改的組件,從彈出的編輯窗口中修改文字即可。
格式化顯示結果,可選選中第一個單元格(year和name的交叉位置)。點擊右鍵從菜單中選擇“display format”。
選中需要得顯示格式,然後關閉格式化界面,顯示結果如下圖:
3、使用函數
在上面的示例中,我們可以看到員工四年的工資以及工資彙總情況,我們還可以使用一下函數:
sum:彙總值和
Max:求最大值
Min:求最小值
Avg:求平均值。
Count:計數
我們示例MIN函數,打開交叉組件編輯器,在6區選擇salary,
從菜單中選擇最小值。把表格中的彙總字符改為最小值。然後顯示結果:
4、對結果進行排序
對行和列進行升序排序,如果結果是數字型,則按數據進行排序,如果是字符型,則按字母順序排序。我們可以對行和列分別進行設置排序模式。
我們做個示範,讓year進行降序排列,設置界面如圖(組件設計器):
顯示結果:
5、組合標題的表格
我們的示例只有一個行頭和一個列首。現在我們設計一個複雜標題的報表,它可能包含兩個行或列數據。表格包含如下數據內容:
設置界面如下:
結果顯示界面如下:
注:報表自動在每個year最後做一個總計,這個可以在組件編輯器中設置year的“小計”標識。
另外注意,在最後一列我們沒有做中間的彙總統計,實際上,在我們的示例中也沒有這個必要。
6、調整單元格的寬度
察看前面的示例,可以很清晰的發現,單元格可以自動調整其寬度,以適應最大字符寬度。
然而有時卻不盡人意,如果字符特別的長,這時報表的樣式就變得非常難看。如何解決這種情況呢?讓我們採用3種方法進行處理。
最簡單的方法就是字組件中,將字符設成多行。
Total
for[Value]
可以看到結果如下:
然而,如果行或列的結果值的字符串長度非常大時,這種方法就不適應了。這就是cross-tab組件為什麼有”Minwidth”,”MaxWidth”屬性參數了。
默認情況下,Minwidth值為0,MaxWidth屬性值是200,這可以在大部分情況下都適用。用戶可以根據實際需要進行對這個值進行設置。
這樣,在我們的示例中,我們設置Minwidth=MaxWidth=50;意思是說單元格在任何情況下都是50個象素值,如果字符串比較小,系統自動調整寬度到50,如果字符串長度比較大,系統還是調整寬度到50,同時,長的部分被分割。顯示結果如下圖:
第三種就是手動調整單元格寬度。這時,需要設置AutoSize屬性值為false。現在可以通過鼠標改變組件的大小。顯示界面如下:
記住,如果取消了組件的自動大小屬性,則在報表時,系統不能在調整單元格的寬度和高度,預覽時的結果可能如下圖:
這時,稍微在調整一下單元格的寬度即可。
7、字體顏色和突出顯示
有時我們需要突出顯示某些結果值,或通過字體顏色進行區分。我們在組報表中測試過突出顯示方法。我們使用條件進行設置突出顯示,這在報表中是非常有用的。
添加突出顯示:在我們的示例中,我們將結果值大於3000的字體顏色改為紅色,選中單元格,在工具覽中點擊按鈕,彈處條件設置對話框。設置參數value>3000,並改變字體顏色為紅色。
點擊確定關閉窗口,進行預覽:
同樣,用戶可以設置全部的單元格,行和列的值。
同為比較常用的報表工具,FineReport對交叉報表的解決方案與FastReport有所不同,具體如下:
1. 概述
交叉表,也是常見的基本報表類型,分組報表只是從上到下將數據分組顯示,而交叉表則是從上到下、從左到右都將數據分組的報表,如下圖:
FineReport天然支持行列對稱,設計交叉表的方法也很簡單。
2. 製作步驟
2.1 新建工作簿,添加數據集
新建工作薄,添加數據集ds1,SQL語句為SELECT * FROM [銷量]。
2.2 製作交叉表
設計好表樣後,將數據列拖入對應單元格:
縱表頭:地區與銷售員默認縱向擴展實現從上到下分組;
橫表頭:將產品類型與產品設置為從左到右擴展,讓產品橫向分組,實現橫表頭;
數據:根據父子格的概念,銷量會以銷售員為左父格,產品為上父格,自動匹配出銷售員與產品對應的銷量。
預覽即可看到上圖交叉表。
注:此處銷售員與產品對應的銷量是唯一的,因此,直接將銷量拖入單元格即可。
另:若銷售員與產品對應的銷量不唯一,則將銷量數據列的顯示方式設為彙總-求和,詳細請查看數據顯示方式。
2.3 其他設置
排序、突出顯示以及字體顏色調整參考具體章節
2.4保存發佈