php WEB報表工具的設計

轉自: http://www.51cto.com/art/200509/3145.htm

簡介

本文介紹了一種WEB報表設計工具的實現思路和解決辦法,該工具可以同數據庫連接,讓用戶自己設計報表,報表的數據從數據庫中獲取,用戶修改後的數據可以存回到數據庫中。該工具可以實現任意形式(規整、不規整)的報表設計;不僅可以作爲最終產品提交給用戶使用,對於開發人員來說,也可以作爲報表和數據庫的設計工具來開發自己的產品。一個目的:讓開發人員(至少是本人)不再做“報表苦力”。

前言與問題的提出

本人在C/S結構和B/S結構的軟件開發過程中,碰到大量的設計報表的工作。用戶有大量各式各樣的報表需要實現,並且在系統驗收後用戶還會有一些報表需要實現。在開發C/S結構報表時使用PB,EXCEL,FORMULA ONE等工具埋頭畫表,在開發B/S機構的報表時使用ASP,XML/XSL等一個格一個格產生表;好半天完成了報表的樣式設計,以爲可以歇口氣了,但還不行,還需要設計數據庫,設計產生報表的方法函數,還要設計修改報表的接口、保存數據的函數;每一張報表都得開發人員親自完成;好不容易提交用戶測試了,用戶又說:某某表的格式不對、某某表的公式不對、某某表的大小不對、幫忙增加幾份新表……搞得人昏頭漲腦,剛剛纔有的一點成就感、一絲輕鬆又被嘆氣、唉聲給衝跑了……要是能讓用戶自己去做這些污七八糟的事就好了!

正好接到一個金融系統的WEB辦公系統項目,要實現的報表就有厚厚的一大摞,這還只是初步的需求,乾脆,就設計一個“報表設計工具”,希望能解放以後的報表工作;當然,是在WEB上實現。

做報表設計工具,我以前做C/S結構的系統時就做過,也實現了(用PB6),用戶用的也挺好。但是有缺點:一是不好移植在WEB上使用,二是隻能顯示報表,不能修改報表中的數據,當然更不能增加數據了。在WEB上又該如何實現呢?

實現的方式

要做WEB報表設計工具,必須先要知道報表什麼東西?是如何產生和實現的?先理一理思路。

報表是什麼?這個好說,就是把一些數據放在固定格式的固定位置上的表格。既然是表格,那麼就有“表”有“格”,先要一個“格”一個 “格” 地“拼”出一“行”或一“列”來,再要一“行(列)”一“行(列)”地“拼”出一個“表”來。

雖然同樣是由格子“拼”出來的,但有的表就好畫,有的不好畫,如下圖1和圖2所示:


圖一


圖二

明顯地圖1所示的報表比圖2所示的報表要好“畫”,我們將圖1類型的表稱作“規整報表”,而將圖2類型的報表稱作“不規整報表”。

說了半天廢話,那麼報表到底是如何產生和實現的呢?本人認爲不外乎兩種方式:“畫”和“填”。

“畫表”就是產生一格的同時也將數據按格式放在格子內,就是格式數據同時產生,這樣整個表格畫完了,表中的數據也有了,報表就生成了。這種方式適合於用來產生規整的報表,這樣纔可以逐行或逐列的畫出該報表。這種方式的優點是產生報表快(成批處理數據)、處理程序簡單(一個循環語句就可以了)。

“填表”與“畫表”完全不同,他是必須先有表格格式,然後將指定的數據填在指定的表格位置中就可以了。這種方式既適合於用來產生不規整的報表,也適用於產生規整報表。這種方式的優點當然就是適用範圍廣,但缺點也有,就是速度慢,因爲它要先獲取表樣,然後一個一個地取出數據,再一個一個地填在格中。

那麼應該採取哪種實現方式呢?有兩種解決方案:

1.分開處理:讓用戶在設計報表時確定報表是否規整(這是很簡單的事),如果規整就讓該報表採用“畫表”方式產生,否則採用“填表”方式產生。

2.統一處理:全部採用“填表”方式產生。

本人覺得現在計算機的速度仍然在飛快的提高,硬件的“快”可以消除軟件的“慢”,但主要是爲了簡化軟件的設計和處理,採用了第二種實現方式:填表。

決定了實現的方式,開始考慮一些細節和技術上的事情了:要實現這個WEB報表設計工具,需要考慮哪些方面的事情,需要解決一些什麼問題呢?

需要解決的問題

現在要考慮如何實現了。剛開始,初略一想,不就解決這幾個問題嗎:

1.如何畫表即如何產生表樣?必須是在瀏覽器內實現喲!

——簡單:使用DHTML就行,結合使用XML/XSL。

2.如何保存表樣?

——簡單:都存在數據庫的TEXT字段中

3.如何與數據庫連接?

——簡單:專門定義一個屬性來與表示

4.如何顯示數據?

——簡單:使用DHTML技術、結合XML/XSL就可以實現

5.如何修改數據?

——簡單:檢測事件不就可以了嗎!

 

6.如何保存數據?

——簡單:寫在數據庫中就行。

仔細一想,才發現這裏面問題多多:

7.怎麼畫表?用什麼畫?特別是必須在瀏覽器內實現。

8.如何設計表格樣式?如粗體、下劃線、斜體、小數字數、合併表格、刪除表格等等樣式設計操作。

9.表樣如何保存?以什麼格式保存?存在哪兒?

10.數據顯示的位置如何定義?怎樣定義?定義的結果如何保存?存在哪兒?又如何填數據?

11.單個數據顯示的格式如何定義?怎樣定義?定義的結果如何保存?存在哪兒?

12.報表如何與數據庫連接?如何獲取報表數據?獲取數據的條件如何定義?怎樣定義?定義的結果如何保存?存在哪兒?

13.用戶要新增一張報表,又沒有現成的數據庫表對應,該如何讓用戶來設計數據庫?數據庫又該如何設計?

14.用戶如何知道數據庫定義的含義?如何知道某個格應該取數據庫表中的哪個字段、哪個記錄?

15.如何知道用戶修改(增加)了報表數據?該數據如何與數據庫表中的字段對應?如何才知道哪些格中的數據合起來是數據庫表中的一條完整記錄?又怎樣才能知道用戶輸入的數據足夠組成一條完整記錄?怎樣保存這些修改(增加)的數據呢?

16.有些根本不需要單獨建立數據庫表來保存的數據,又該如何保存?

17.報表的數據平衡關係設計?又如何定義?定義的結果如何保存?存在哪兒?

18.自動計算公式如何實現?又如何定義?定義的結果如何保存?存在哪兒?

19.如何從其它報表中提取數據來產生新報表?如何定義?定義的結果如何保存?存在哪兒?

20.如何定義報表的彙總(由分支機構的數據產生總機構的數據)?定義的結果如何保存?存在哪兒?

21.如何實現數據的上報----即數據格式的轉換?轉換程序如何設計?如何保存?存在哪兒?

……

越想問題越多,就越覺得麻煩,乾脆放棄算了——苦力就做苦力吧,象本人這種手腳慢的人,也許設計完這個工具的時間,一大堆報表早就做完了。

回頭看看爲設計這個報表工具寫的筆記和收集的資料,心有不甘;再掂掂報表的份量,太重又太多——難道老做苦力嗎?不行!爲自己的將來現在麻煩一點也值!可是這麼多的問題需要解決,千頭萬緒一團糟,該如何開頭呢?關鍵的問題是什麼?

問題的關鍵

看看窗外的風景,等到靜下心來,再看看這些羅列的問題,一個問題一個問題逐個進行衡量和比較,才發現首先要解決的問題就是“表樣設計工具”該如何實現。因爲報表的設計、顯示、修改、保存等全部操作都是在該工具環境中實現的,數據庫的連接、表樣的保存等等工作都得圍繞該工具的表現形式和接口形式來實現和調整。

既然找到了工作的頭緒,那麼開始設計吧!不要忙,“工具”的設計方案還沒有定呢!

幾種方案的比較

要在WEB上實現表樣的設計有很多種方案可供選擇:

1.使用XML/XSL/DHTML/HTML技術來實現

2.利用IE的WebBrowser ActiveX 控件來實現

3.自己寫ActiveX控件

4.自己寫Java Applet來實現

5.借用現成的第三方控件實現

那麼哪種方案對本人來講是比較好的呢?

先來了解各個方案的特點,將結果列表如下:

編號

方案名稱

方案優點

方案缺點

1

使用XML/XSL/DHTML/HTML技術來實現

1.   可以自己定製

2.   對瀏覽器要求低

3.   表格格式易於實現

4.   數據格式轉換容易實現

1.   開發週期長

2.   所有的功能都要開發

3.   計算公式不易實現

4.   對不規整表格不易實現

2

利用IEWebBrowser ActiveX 控件來實現

1.   開發較快

2.   可以自己定製功能

3.   表格格式易於實現

1.   數據格式轉換不易實現

2.   計算公式不易實現

3.   所有的功能都要開發

4.   對不規整表格不易實現

3

自己寫ActiveX控件

1.   可以自己定製

2.   表格格式易於實現

3.   數據易於控制

4.   數據格式轉換易於實現

5.   計算公式易於實現

1.   開發週期長

2.   所有的功能都要開發

3.   格式轉換麻煩

4

自己寫Java Applet實現

1.   可以自己定製

2.   對瀏覽器要求低

3.   表格格式易於實現

4.   數據易於控制

5.   計算公式易於實現

1.   開發週期長

2.   所有的功能都要開發

3.   格式轉換麻煩

5

利用現成的第三方控件實現

1.   開發起來最快

2.   需要的功能大部分都有

1.   可能需要購買費用

2.   功能會受限制

表1

而篩選方案的原則是:

1.能滿足工作要求

2.開發週期短

3.開發成本低

4.易於在WEB上發佈使用

如果能夠獲取免費的第三方軟件,無疑是第5種方案最好。找找看,有沒有。還真找到了,就是Microsoft Office Web Components 中的SheetSpace控件,雖然不是免費的(必須要MS Office2000+支持),但用戶都有使用MS Office,不僅開發成本降了,用戶操作也習慣,就選他了——Microsoft Office Web Components中的SheetSpace控件。

解決的辦法

既然關鍵的問題解決了,其它的就都好辦了,下面整理後列舉了相關問題的解決辦法:

1.如何畫表即如何產生表樣?必須是在瀏覽器內實現喲!

—— 在Microsoft Office Web Components中的SheetSpace控件內設計表樣,或者在MS EXCEL內設計好表樣,再將其導入到Microsoft Office Web Components中的SheetSpace控件中顯示出來;設計一個導入MS EXCEL的程序。數據顯示格式、分頁、固定表頭、字體大小、顏色等等都在設計在表樣中。

2.如何保存表樣?以什麼格式保存?存在哪兒?

——將Microsoft Office Web Components中的SheetSpace控件的結果存在數據庫的TEXT字段中。表樣的格式是 MS EXCEL 的HTML格式,由Microsoft Office Web Components中的SheetSpace控件可以直接獲取。

3.如何與數據庫連接?

——專門定義一個字段屬性來表示該報表對應的數據庫表(table)

4.如何顯示數據?

——將報表數據從數據庫中提取後以XML的格式保存在客戶端,在Microsoft Office Web Components中的SheetSpace控件內顯示,將獲取的報表數據填在指定的單元格內。

5.如何知道用戶修改(增加)了報表數據?該數據如何與數據庫表中的字段對應?如何才知道哪些格中的數據合起來是數據庫表中的一條完整記錄?又怎樣才能知道用戶輸入的數據足夠組成一條完整記錄?

——檢測Microsoft Office Web Components中的SheetSpace控件的change事件,將目前單元格的值與原始數據比較,不相同則修改原始數據,並置修改標誌。該數據與數據庫字段的對應關係根據公式解釋得來。這樣也就可以知道哪些格中的數據合起來是數據庫表中的一條完整記錄。對於增加的數據,專門設計一個輸入工具,來提示用戶需要輸入哪些數據纔是完整的。

6.如何保存數據?

——對於XML中有修改(增加)標誌的數據向服務器提交,服務器處理該數據再修改數據庫中對應的數據。

7.如何設計表格樣式?如粗體、下劃線、斜體、小數字數、合併表格、刪除表格等等樣式設計操作。單個數據顯示的格式如何定義?怎樣定義?定義的結果如何保存?存在哪兒?

——Microsoft Office Web Components中的SheetSpace控件提供了這些操作函數,將這些函數以菜單的形式表現在頁面上,提供用戶操作的手段。用戶操作產生的結果保存在表樣中,在表樣保存的時候一起保存在數據庫中。

8.數據顯示的位置如何定義?怎樣定義?定義的結果如何保存?存在哪兒?又如何填數據?

——設計一個公式設計和解釋器,將要顯示的數據以公式的形式保存在表樣中,該公式所在的位置就是數據要顯示的位置,該公式所在單元格的格式就是數據的顯示格式(如字體、顏色等等)。該公式同表樣保存在一起。在顯示數據的時候,根據公式來獲取數據,並將其填入單元格中。

9.如何獲取報表數據?獲取數據的條件如何定義?怎樣定義?定義的結果如何保存?存在哪兒?

——每份報表都定義“查詢條件”屬性,由該屬性來獲取一份完整的報表數據內容。該查詢條件直接對應了數據庫的字段;該屬性同報表表樣一起保存在數據庫中。

10.用戶要新增一張報表,又沒有現成的數據庫表對應,該如何讓用戶來設計數據庫?數據庫又該如何設計?

——設計一個在WEB頁面上設計數據庫的工具,讓用戶根據自己的實際需要來設計數據庫結構。

11.用戶如何知道數據庫定義的含義?如何知道某個格應該取數據庫表中的哪個字段、哪個記錄?

——由於提供了數據庫的設計工具,用該工具設計的數據庫結構要求必須填寫該字段的標題,即對該字段的含義說明;在用戶定義公式的時候,顯示的不是枯燥的英文字段名稱,而是該字段的標題,便於用戶理解。

12.有些根本不需要單獨建立數據庫表來保存的數據,又該如何保存?

——將不需要單獨建數據庫的報表我們區分開來,全部存放在一個公共的表(table)中,該表(table)中的數據既包含了報表樣式又包含了報表數據。

13.報表的數據平衡關係設計?又如何定義?定義的結果如何保存?存在哪兒?

——報表的數據平衡關係完全用EXCEL的計算公式來實現。該公式同表樣保存在一起。Microsoft Office Web Components中的SheetSpace控件可以支持絕大部分的MS EXCEL的公式。公式的用法和語法同MS EXCEL完全相同。

14.自動計算公式如何實現?又如何定義?定義的結果如何保存?存在哪兒?

——使用MS EXCEL的計算公式來實現,如sum,avg等等,該公式同表樣保存在一起。

15.如何從其它報表中提取數據來產生新報表?如何定義?定義的結果如何保存?存在哪兒?

——報表具有一個屬性叫做“取數程序”,用來從其他的數據庫表(table)中提取數據插入本報表對應的數據庫表 (table) 中。

16.如何定義報表的彙總(由分支機構的數據產生總機構的數據)?定義的結果如何保存?存在哪兒?

——報表具有一個屬性叫做“彙總程序”,用來從下級機構的報表中彙總數據產生本機構的報表數據。

17.如何實現數據的上報----即數據格式的轉換?轉換程序如何設計?如何保存?存在哪兒?

——上報數據其實就是數據格式的轉換,通過使用XSL可以十分方便的設計出來。該XSL轉換程序以文本文件的形式保存在一個指定的目錄中,文件的名稱與報表一一對應。要產生上報數據的時候,將報表數據執行該轉換後產生成一個文本文件,保存在客戶端機器的用戶指定位置上即可。

一份報表的完整定義保存在數據中,該數據庫表的結構爲:

序號

字段名

標題

數據類型

允許空

關鍵詞

備註

1

id

報表編號

int

no

yes

 

2

title

報表名稱

varchar(100)

no

no

 

3

dbtable

對應數據庫表

varchar(100)

no

no

對應數據庫表的名稱

4

style

報表樣式

text

yes

no

 

5

style2

編譯樣式

text

yes

no

編譯後的報表樣式

6

address

公式地址

text

yes

no

公式地址,用,分隔

7

query

查詢字段

varchar(400)

yes

no

字段--標題對,多個用|號分割

8

orders

排序字段

varchar(400)

yes

no

排序字段,多個用|號分割

9

program

彙總程序

text

yes

no

 

10

program2

取數程序

text

yes

no

 

11

program3

其它程序1

text

yes

no

 

12

program4

其它程序2

text

yes

no

 

13

createdate

創建時間

smalldatetime

yes

no

 

14

flags

標誌

char(10)

yes

no

保留未用

15

status

狀態

int

yes

no

0:無效,1:有效

16

DAC

數據校驗碼

varchar(20)

yes

no

 

17

appendix

附加說明

varchar(200)

yes

no

 

表2:報表定義結構

爲了操作的方便,又增加了批量處理的功能,讓用戶可以批量提取數據、彙總數據,簡化用戶的操作。

報表的全部處理流程就是這樣的:

1.設計數據庫定義

2.設計報表樣式

3.插入取數公式

4.設置查詢條件

5.設計彙總程序

6.設計取數程序

7.查詢報表

8.彙總報表

9.批量彙總報表

10.提取報表數據

11.批量提取報表數據

12.生成上報文件

設計效果

好了,單槍匹馬苦戰一個多月,編碼工作終於全部完成了,設計數據庫的界面如圖3所示,設計報表的界面如圖4所示。

圖三


圖四
給用戶試用,效果還不錯,幾十份各式各樣的報表全部輕鬆解決。皇天不負“苦”心人。按照這種方式,本人又用一週的時間設計出了一個圖表設計工具,用戶反應也很好。圖表設計界面如圖4所示。

總結

本文討論了一種行之有效的WEB報表設計工具的實現思想,並將實現。對於需要大量設計報表的用戶,特別是報表格式和數量經常變化的用戶,使用將非常方便。對於開發人員,也可以減少大量的工作。

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