[摘 要] 在管理信息化中,雖然說是“無紙信息化”時代,但是實際上在很多場合離不開紙質(zhì)的打印或精確打印。本文主要論述用Visual Studio 2008在.NET網(wǎng)頁中如何添加Microsoft SQL Server數(shù)據(jù)庫和報表源,如何創(chuàng)建報表文件,如何通過添加按鈕控件及相關(guān)代碼實現(xiàn)B/S架構(gòu)下水晶報表的打印與精確打印。
[關(guān)鍵詞] 管理信息化;水晶報表;打印;精確打印
[中圖分類號]F232[文獻標識碼]A[文章編號]1673-0194(2009)04-0012-02
隨著計算機技術(shù)的發(fā)展與普及,越來越多的單位或部門已基本實現(xiàn)無紙管理信息化,但是在一些場合現(xiàn)在還不能完全無紙化,還要將計算機處理結(jié)果以報表形式通過打印機輸出到紙上,如公司產(chǎn)品銷售的發(fā)票打印、企業(yè)資格證等。在B/S架構(gòu)中,常規(guī)的打印方法是使用瀏覽器文件菜單中的“打印”。使用這種方法打印雖然簡單,但打印出來的頁面會出現(xiàn)你所不希望出現(xiàn)的頁眉、頁腳、頁碼及背景等,還會出現(xiàn)版面不美、布局不好的現(xiàn)象,而且無法實現(xiàn)精確打印。本文以ASP.NET技術(shù)為基礎(chǔ)論述如何使用VS 2008實現(xiàn)B/S架構(gòu)下的網(wǎng)頁內(nèi)容的打印與精確打印。
一、用VS 2008創(chuàng)建Microsoft SQL Server數(shù)據(jù)庫
1. 打開VS 2008,新建一個Web窗體項目。
2. 在“視圖”菜單中選擇“服務(wù)器資源管理器”或者使用熱鍵Ctrl+Alt+S將“服務(wù)器資源管理器”打開,見圖1。
3. 在窗口的左邊欄,用鼠標右鍵單擊“數(shù)據(jù)連接”,在彈出的浮動菜單中選擇“創(chuàng)建新的SQL Server數(shù)據(jù)庫”,則有新窗口彈出,在該窗口中選擇“服務(wù)器名”,如“47012CAAD3A04CE\\SQLEXPRESS”(如果“服務(wù)”中的SQL Server Browser沒有開啟,則找不到服務(wù)器名),再填上“新數(shù)據(jù)庫名稱”,如“l(fā)ibrary”。最后用鼠標左鍵單擊“確定”。
4. 在圖1中用鼠標的右鍵單擊“表”,在彈出的浮動菜單中選擇“添加新表”,那么在圖1的右邊可以在數(shù)據(jù)庫中添加表的“列名”和“數(shù)據(jù)類型”等。

5. 用鼠標左鍵單擊圖1的右上角的“×”符號,有窗口出現(xiàn),在窗口中單擊“是”,然后又出現(xiàn)一個較小的窗口,在這個窗口中輸入數(shù)據(jù)庫的表名,如“book”,然后再單擊“確定”,那么這個表就建成了,可以用手動方法或編程方法給空表添加數(shù)據(jù)。
二、頁面普通打印功能的實現(xiàn)
1. 在“解決方案”中選擇當(dāng)前的項目,然后在當(dāng)前項目中添加“數(shù)據(jù)集”,并在“數(shù)據(jù)集”中添加DataTable,如book。
2. 新建一個網(wǎng)頁文件,將VS 2008中工具箱的Crystal Report Source控件拖放到網(wǎng)頁上,然后配置報表源。這時可按報表生成向?qū)нM行報表設(shè)計。在報表生成向?qū)е械摹翱捎脭?shù)據(jù)源”中選擇前面已經(jīng)創(chuàng)建的數(shù)據(jù)集中的那個book表。
3. 將Crystal Report Viewer控件拖放到網(wǎng)頁上,點擊Crystal Report Viewer控件設(shè)置該控件的報表源。
4. 在網(wǎng)頁的合適位置放一個Button控件,并將Button的text屬性改為“打印報表”。雙擊該“打印報表”按鈕,打開代碼頁,在代碼頁的命名空間處引入如下命名空間:
using CrystalDecisions.Shared;
using CrystalDecisions.ReportSource;
using CrystalDecisions.CrystalReports.Engine;
并且在Button事件中加入如下代碼:
ReportDocument oRpt = new ReportDocument();
oRpt.Load(Server.MapPath(\"CrystalReport1.rpt\"));
// CrystalReport1.rpt為前面所建的水晶報表文件的默認名。
oRpt.PrintOptions.PaperSize = PaperSize.DefaultPaperSize;
//設(shè)置紙張尺寸為默認尺寸。
PageMargins margins;
margins = oRpt.PrintOptions.PageMargins;
margins.bottomMargin = 0;
margins.leftMargin = 0;
margins.rightMargin = 0;
margins.topMargin = 0;
//以上4行為頁邊距的設(shè)置。
oRpt.PrintOptions.ApplyPageMargins(margins);
oRpt.PrintOptions.PrinterName = \"\";
//這里設(shè)置打印機名,當(dāng)為空表示打印機為操作系統(tǒng)默認打印機。
oRpt.PrintToPrinter(1, 1, 1, 1);
//代碼中oRpt.PrintToPrinter(1, 1, 1, 1)中的第一個參數(shù)為打印的份數(shù)
//第二個參數(shù)為是否設(shè)有逐份打印,1表是不逐份打印
//第三個參數(shù)為打印的起始頁碼,第四個參數(shù)為結(jié)束頁碼。
三、網(wǎng)頁中精確打印功能的實現(xiàn)
精確打印指的是將頁面內(nèi)容打印到一定格式的表格、發(fā)票、證件上,實現(xiàn)步驟如下:
1. 將要精確打印的表格、發(fā)票、證件等進行掃描,生成圖片文件,或者使用圖像工具進行繪制。不管是掃描的還是繪制的,一定要與原件有同樣的大小和比例。
2. 打開報表文件,在Crystal Reports 菜單上選擇“插入”,再選擇“ole對象”,在彈出的窗口中選擇“由文件創(chuàng)建”,通過“瀏覽”在電腦上選擇那個掃描或繪制的圖片文件。
3. 如果精確打印的內(nèi)容是由數(shù)據(jù)庫管理的,那么將報表的“字段資源管理器”中的相關(guān)的數(shù)據(jù)庫字段拖放在報表的表格、證件、發(fā)票的要打印的位置,根據(jù)要求設(shè)計字體、字形、大小等。如果精確打印的內(nèi)容不是由數(shù)據(jù)庫管理的,那么就拖入其他相關(guān)字段。如圖2所示。

4. 選擇剛才插入的ole對象,用鼠標右鍵單擊該對象,選擇“設(shè)置對象格式”,在彈出的窗口中勾選“抑制顯示”。這樣做的目的是使打印時不再打印水晶報表中的表格、證件、發(fā)票等(換句話說,這里的表格、證件、發(fā)票起的作用僅是為了能準確地將打印的內(nèi)容打到指定位置),而只打印要打的相關(guān)字段。
5. 相關(guān)代碼與前所提及的類似,但是如果打印的紙超過A4大小,需要修改下面的語句:
oRpt.PrintOptions.PaperSize = PaperSize.DefaultPaperSize;
如將DefaultPaperSize改成PaperA3,這里表示紙的大小為A3。
主要參考文獻
[1] 邵鵬鳴. ASP.NET Web應(yīng)用程序設(shè)計及開發(fā)(C#版)[M]. 北京:清華大學(xué)出版社,2007.
[2] 劉化果. Visual Basic.NET開發(fā)實例完全剖析[M]. 北京:中國電力出版社,2006.
[3] 盧智勇,等. Visual Basic.NET數(shù)據(jù)庫程序設(shè)計與實例[M]. 北京:冶金工業(yè)出版社,2005.
[4] 唐遠濤. 基于Web報表開發(fā)的研究與應(yīng)用[D]. 成都:成都理工大學(xué),2006.
[5] 賈洪艷,林慶. 基于.NET的高校教師績效考評系統(tǒng)的設(shè)計[J]. 科技廣場,2007(3).
[6] 李濤,屈展. 基于.NET的Web動態(tài)報表研究與實現(xiàn)[J]. 科技廣場,2008(3).