我前一段時間開發(fā)一個B/S項目,需要用到打印功能,如是上網(wǎng)到處查找有關(guān)Web打印的控件(呵呵,我向來比較喜歡使用成熟的控件,這樣用不著自己去開發(fā),自己開發(fā)很多時候是費力不討好,再說一個三五幾百塊的注冊費用,俺還是付得起,自己去搞費上幾天功夫,其工錢遠不止這個數(shù)。),可是找來找去,挺讓我失望的,真沒想到一個Web打印有這么難嗎,網(wǎng)上流傳的商業(yè)Web打印控件,其復雜程度讓我望而卻步,不得不自己搞了一個Web打印控件,在項目中用起來挺順心的,后來有幾個朋友,也要用到Web打印的功能,我就把我這個控件發(fā)給他們,他們說用起來也挺不錯的。
現(xiàn)在網(wǎng)上流傳的Web打印控件,在我看來主要是分兩種,一種是水晶報表派,一種是IE打印派。水晶報表派當然是以水晶報表為代表,這種的特點是先設(shè)計好報表文件,然后在程序中組織好數(shù)據(jù)源,調(diào)用報表文件,然后進行預(yù)覽或打印。而IE打印派,國內(nèi)的Web打印控件通常都是這一種,在用戶客戶端注冊一個Activex控件,然后用JavaScript定義報表的格式,定義報表的數(shù)據(jù)內(nèi)容(也可以通過URL讀?。?,然后再用Windows的打印API進行預(yù)覽或打印。
水晶報表作為微軟推薦的報表工具,其功能強大,但是目前只能用于.NET平臺,其通用版本的功能也有限制,比如不能直接打印,不能自定義紙張的大小等。而IE打印,我也下載過幾個控件試用,發(fā)現(xiàn)其報表設(shè)計繁瑣,既當?shù)之攱尩?,既要?/span>JavaScript定義報表的格式,又要組織報表的數(shù)據(jù),仿佛一下子回到DOS時代,一個操作窗口,需要自己先計算好各顯示的坐標,然后再一一的畫出來,這樣的報表設(shè)計用起來使人發(fā)狂,一二個報表還可以勉強對應(yīng),要是多做幾個就累死人了,而且以后維護修改也很麻煩。
作為報表設(shè)計的核心,我想不論是C/S架構(gòu),還是B/S架構(gòu),無非就是兩點,一是報表的數(shù)據(jù)源,二是報表的格式。無論報表多么復雜,都脫離不了這兩點。作為報表的數(shù)據(jù)源,我們習慣用SQL語句產(chǎn)生,當然對于過分復雜的分析報表,有時候我們也不得不先產(chǎn)生臨時表,通過較復雜的程序把數(shù)據(jù)組織好,再進行打印。報表的格式我們通常利用報表設(shè)計工具把報表設(shè)計好,然后作為文件保存。程序中打印報表,通常是先組織好數(shù)據(jù)集,然后調(diào)用報表文件,傳遞報表所需參數(shù),最后進行報表的預(yù)覽或打印。
C/S架構(gòu)下的打印很成熟,用戶一般只需單擊按鈕,就可以把報表預(yù)覽或直接打印出來。報表的設(shè)計也很成熟,無論是古老的Foxpro,還是VB、Delphi都可以進行方便高效的報表設(shè)計,只要報表不是很復雜,工具熟練,一天做十幾份報表都可以的。
我想作為B/S架構(gòu)的報表也可以借鑒C/S架構(gòu)的設(shè)計理念進行設(shè)計,堅持報表的數(shù)據(jù)源和報表的格式分開,用做C/S架構(gòu)的報表工具來做B/S架構(gòu)的報表,這樣既可以做到C/S架構(gòu)下報表設(shè)計的方便高效,又可以做到B/S架構(gòu)的分布性。當然由于B/S架構(gòu)的特殊性,現(xiàn)有的打印,特別需要用到自定義紙張大小和直接打印等功能,不得不采用Activex控件。
我按照用C/S架構(gòu)的報表工具來設(shè)計B/S架構(gòu)報表的理念,設(shè)計開發(fā)了自己的Web打印控件,該控件的報表工具是FastReport,該報表工具的功能可以和水晶報表媲美,使用起來也挺簡單的,為了適應(yīng)中國式報表的劃線,我還在FastReport的基礎(chǔ)上開發(fā)6個設(shè)計按鈕:縮放寬度最小、縮放寬度最大、縮放高度最小、縮放高度最大、水平首尾對齊、垂直首尾對齊,利用這6個按鈕,則加上FastReport的邊框和對齊功能,就可以很高效很準確的劃出表格線。
有了這個設(shè)計工具,我們就可以很高效的設(shè)計報表了,不再需要自己一筆一劃的很原始的方式去畫報表。但還需解決一個問題,就是服務(wù)端的數(shù)據(jù)和報表格式如何傳遞到客戶端電腦。XML作為網(wǎng)絡(luò)通用語言可以作為傳遞的載體,當然這其中要進行相應(yīng)的轉(zhuǎn)換,不同語言,不同數(shù)據(jù)庫可能轉(zhuǎn)換不一樣,我在示例中詳細列出了常用的語言和數(shù)據(jù)庫如何進行轉(zhuǎn)換,有興趣的朋友可以下載回來,看一下就明白了。
我設(shè)計的這個Web打印控件當然也不是百分之百的完美,因為一次性把報表的數(shù)據(jù)傳遞給客戶端,若數(shù)據(jù)龐大,則用戶等待的時間過長,這個可以在程序中控制,檢測數(shù)據(jù)超過多少頁,提示用戶分次打印就可以避免此問題。
報表控件本身有800多K,不過我覺得這個倒不是什么問題,就是2M的帶寬也只需三四秒鐘就可下載完,那些所謂的輕量級打印控件,也有200多K,只要報表控件好用,再大一點也無所謂,反正就下載一次而已。還有報表還沒有申請數(shù)字用證,以后如果用的人多了,有了銀子,我會去申請的,哈哈。不過作為Activex控件之王的Flash控件,現(xiàn)在都改為手動安裝了,看來這個也無所謂了,大家也用不著把白白花花的銀子交給微軟去搞什么用證了。