摘要
開發b/s結構的應用程式最頭疼的問題可能就是報表列印了,由於只能採用瀏覽器來作為使用者介面進行互動,所以不能精確控制客戶端的印表機。而很多b/s結構的應用程式常常需要完成非常複雜的報表列印任務。而靠ie自帶的頁面列印功能一般不能滿足需要。
採用crystal report是一種大型報表系統常用和推薦的解決方案,但是如果我們只需要進行一些小規模的報表列印的話,crystal report則顯得龐**煩了一點,可定製性也不太好,它的列印實際上也是利用了ie的列印功能,也不能精確控制列印效果,而且需要您對它進行註冊。
所以我們這裡討論的是另外一種辦法,簡單來說,如果您有下列需求中的任何一條,那麼就可以嘗試採用本方案。
目錄方案適用性
1. 遠端資料列印。需要列印的資料並不在本地,必須進行遠端讀取。
2. 需要精確控制列印效果,包括頁面格式,分頁,附加條目,**等。
3. 出於安全性考慮,不能直接連線到資料庫。
方案原理
其實原理很簡單,通過xml強大的自定義功能,我們便能方便的自定義出我們所有需要的格式控制標籤,在伺服器端進行動態編碼後通過web伺服器傳到客戶端,然後在客戶端進行格式解析,根據伺服器端定義的列印格式從客戶端直接控制印表機列印出我們需要的報表。
技術選擇
不允許直接連線到資料庫,因此只能採用xml檔案進行中間資料交換格式,通過普通web伺服器的預設80埠進行資料傳輸。事實上,我簡直找不到其它更理想的方案了,當然,web service也許能算是一種,但是它採用的是soap傳輸資料,從原理上看,應該和我們採用的xml屬於同種類技術。
再補充說明一下我為什麼要採用.net編寫的受控元件,優點在於:
1. 它不需要進行客戶端註冊。相對於activex的乙個大優點。
2. 比activex安全性高。在.net common language runtime的控制之下執行
3. 編寫方便。我喜歡c#和visual studio .net。
4. 有很強大的列印控制功能。利用.net framework類庫。
5. 直接支援xml技術。
6. 和ie相容性高。同為microsoft公司產品。
另外,需要注意一點就是,在.net framework sp1和sp2中預設的安全級別是不能直接執行受控元件的,但是在.net framework 1.1 beta中又改了回來,可以直接執行了。
伺服器端您則可以採用現有的伺服器系統和資料庫,不需要新新增任何新硬體裝置和新的.net伺服器管理人員,他們往往是些要求拿高薪的傢伙。 :)
伺服器的工作流程為:
1. 接受客戶端的標準xml模版查詢。
2. 需要根據查詢要求將資料庫資料格式轉換成標準的xml資料格式。
3. 將xml資料通過80埠傳送出去。
可行性分析
由於現在的大部分資料庫都支援xml格式的資料查詢和轉換,如sql server 2000,oracle 9i,ibm db2等大型關係型資料庫。只需要通過簡單的設定就能直接進行xml資料轉換工作。如果資料庫不能支援直接xml資料轉換,也可以籍由一些伺服器端指令碼程式進行指令碼轉換工作,比如jsp,asp,php等等。
客戶端也不需要任何特殊的設定工作,僅需要安裝乙個大小為21m的.net framework分發包,然後直接開啟網頁就可以進行工作。也沒有作業系統限制,從windows 98到windows xp都能很好的支援。
伸縮性和安全性
伸縮性安全性
由於採用的是普通web伺服器傳送資料,因此可以直接採用ssl安全套接字等已經成熟的web加密技術。同時還可以對xml進行資料演算法加密,在客戶端再進行解密,保證了傳輸的安全性。
由於採用的是80埠,不需要再另外新增加專用埠,減少了安全漏洞的可能性,同時還能方便的穿過雙方的的網路防火牆等保護裝置。
方案設計圖
格式定義
為了能自己控制列印的格式,我們定義了下列的格式標籤,其中在命名上參考了html的命名辦法,所以基本上熟悉html的都能一看就能明白標籤的具體含義。如果您覺得這些標籤的表達能力還不夠強,您還可以自己定義一些更多更精確的格式標籤。
主要標籤說明:
text:文字字串
屬性:x:列印輸出的x座標
y:列印輸出的y座標
fontname:字型
fontsize:字型大小
fontcolor:顏色
b:是否為粗體
i:是否為斜體
u:是否有下劃線
table:表
屬性:x:列印輸出的x座標
y:列印輸出的y座標
border:邊框粗細
bordercolor:邊框顏色
maxlines:每頁最大行數
tr:行
屬性:height:高度
td:列
屬性:width:寬度
align:對齊方式
fontname:字型
fontsize:字型大小
fontcolor:字型顏色
b:是否粗體
i:是否斜體
u:是否下劃線
bgcolor:背景顏色
tablehead:表頭
tablebody:表項
tablefoot:表底
page:頁設定
printward:橫/縱向列印
pagetype:紙張型別
pageleft:左邊距
pageright:右邊距
pagetop:上邊距
pagebottom:下邊距
標籤應用示例:
true注意事項:a4210
297000
0最新成交合同資訊
單位:元
合同號產品名稱
成交量成交價
成交金額
掛單量起始價
賣方買方
20021010015
cnr93
6680
621240
936680
湖北省國營新星拖拉機廠
中化國際**股份****
……….
a) 如果採用伺服器指令碼動態生成xml文件時,傳送內容型別應該設定為text/xml(普通html頁面為text/html),字元編碼應該為utf-8,否則會出現編碼錯誤問題。
b) 應該嚴格按照xml規定的格式來生成檔案,否則xml解析器將不會予以解析。
2. 客戶端
可以採用任意應用程式來讀取伺服器端生成的xml檔案,如果採用vb、delphi等桌面應用軟體開發工具,則可以使用msxml的com解析器。推薦採用.net,內部已經整合了xml解析器,直接就可以通過使用.net類庫呼叫。既可以做成桌面應用程式形式,通過遠端呼叫;也可以嵌入到ie瀏覽器中,直接在網頁中執行。
效果示例圖
列印預覽
注意事項:
2. 如果採用嵌入到網頁中的形式,那麼本程式需要編譯成乙個控制項形式(乙個擴充套件名為dll的檔案),然後在網頁中插入以下標記:
將控制項嵌入到乙個靜態或動態網頁中。然後將該控制項檔案拷貝到和該網頁相同的目錄中(標記中print.dll為生成的控制項檔名,print.usercontrol1為該控制項的命名空間namespace)。
總結作者
盧彥e-mail: [email protected]
2023年10月20日
利用XML實現通用WEB報表列印
利用xml實現通用web報表列印 盧彥 方案適用性 1.遠端資料列印。需要列印的資料並不在本地,必須進行遠端讀取。2.需要精確控制列印效果,包括頁面格式,分頁,附加條目,等。3.出於安全性考慮,不能直接連線到資料庫。方案原理 其實原理很簡單,通過xml強大的自定義功能,我們便能方便的自定義出我們所有...
利用XML實現通用WEB報表列印
專欄作品 利用xml實現通用web報表列印 盧彥 方案適用性 1.遠端資料列印。需要列印的資料並不在本地,必須進行遠端讀取。2.需要精確控制列印效果,包括頁面格式,分頁,附加條目,等。3.出於安全性考慮,不能直接連線到資料庫。方案原理 其實原理很簡單,通過xml強大的自定義功能,我們便能方便的自定義...
利用XML實現通用WEB報表列印
盧彥 方案適用性 1.遠端資料列印。需要列印的資料並不在本地,必須進行遠端讀取。2.需要精確控制列印效果,包括頁面格式,分頁,附加條目,等。3.出於安全性考慮,不能直接連線到資料庫。方案原理 其實原理很簡單,通過xml強大的自定義功能,我們便能方便的自定義出我們所有需要的格式控制標籤,在伺服器端進行...