摘 要:提出一種通用報表的設計和實現方法,在信息管理系統設計中,查詢數據通常需要以報表的形式輸出,設計了一個非常實用的函數,采用OLE自動化技術,通過程序代碼實現對Excel文檔的各種編輯功能,并應用于一類通用報表的設計和輸出。設計的函數接口簡單、易于調用,可以大大減少信息系統開發中一類通用報表的設計工作量,可重用性高。該方法已經應用于多個實際應用系統的開發和設計。在此詳盡分析和闡述了通用報表的設計和實現,并給出了該函數的主要代碼。關鍵詞:通用報表; 信息管理系統; 函數調用; Excel報表格式
中圖分類號:TN911-34; TP31152文獻標識碼:A
文章編號:1004-373X(2010)18-0069-03
Design and Implementation of General Two-dimensional Report
XU Ri1, XUE Hui-jun2
(1.Department of Computer Science, Inner Mongolia Business Trade Vocational College, Hohhot 010010, China;
2.Department of Computer Science, Inner Mongolia Electronic Information Vocational Technical College, Hohhot 010010, China)
Abstract: The design and implementation methods of a general report are proposed. The data of MIS is usually outputed in a report mode during the design of information management system. Various edition functions for Excel files were realized with OLE automatization technology and program code. They are applied to the design and output of the first class common report. The designed function interface is simple and easy to be called, and can greatly reduce the design work of the common report in the development of information systems, this method has been applied to the development and design of many application systems. The detailed analysis and elaboration on design and implementation of a kind of general report are offered. The main codes of this function are also provided.Keywords: common report; information management system; function call; Excel report format
0 引 言
軟件設計和開發過程中,一般都要求數據的輸出,并且以報表的形式進行展示。一般的軟件設計開發工具都提供設計報表的工具和組件,常用的開發工具有微軟的VS系列,Borland 系列等設計工具都提供報表設計功能,但是都需要軟件開發者采用定制的形式逐個進行設計,而一般的MIS系統都有為數不少的報表設計工作,并且報表形式大多是通用的數據報表,部分為圖表結合的報表、三維報表以及其他形式的報表。在工程實踐過程中,逐個設計報表需要很大的工作,一旦需要修改,則逐個修改的工作量很大,存在重復設計和維護問題。
文獻[1-9]提出的報表設計方法,基本側重在設計技術和技巧,或者是定義報表組件[5]方面,其特點是功能多,使用較為復雜,部分也直接輸出為Excel報表格式[6,9]。本文主要針對的情況是在信息系統中,各種查詢的數據一般都是展示在界面窗口中,顯示的格式已經帶有二維報表的特性,帶有標題、列標題和數據等。本文在軟件工程開發實踐中,利用OLE自動化技術,使用Microsoft VBA接口,直接把顯示柵格中的數據,直接以Excel報表的格式輸出。這種報表具有通用性強,使用非常簡單。同時可以利用Excel的功能進行報表格式的控制。本文以Borland Dephi6.0(或以上版本)進行闡述實現的原理,并給出實現的步驟和代碼。
1 通用報表分析
1.1 報表的數據
報表的數據一般從單個或多個數據庫表中獲取,而一般通過SQL查詢語句得到數據。通常在MIS系統設計上,往往都是先顯示在窗口界面,然后輸出打印。所以無論什么形式的數據總是先顯示在窗口界面的數據柵格中,如Delphi中通常用TDBGid或TStringGrid中。因此可以直接把顯示在Grid中的數據直接為報表數據輸出即可。而TDBGrid通過TDatasource獲得現實的數據源,TDataSource的通過TDateset取得數據,TDataset有3種數據形式:TTable,TQuery和TStoreProcedure。而TTable完全使用簡單的TQuery可以實現并代替。TQuery通過SQL語句提取數據庫中的數據,SQL語句極為靈活,可以完成很多包括統計、排序、多表操作等各種功能,而Select類的SQL語句返回的數據均為二維數據。
1.2 報表的顯示格式
一般通用的二維報表包括標題、副標題、列標題、數據行、表尾等幾個部分,當然也有很多復雜的報表,但是復雜的報表一般都需要設計和定制。而本文需要解決的正式這種簡單的而又通用的二維報表,可以通過簡單的函數調用即可完成。
2 報表設計的實現
本文以Delphi開發環境下,Borland Delphi中調用Excel的方式有4種方式,見文獻[10]的相關章節。這里使用以Variant變量的方式來調用Excel。具體的方法可以參見GridToExcel函數中的代碼。
函數體中控制輸入和設置Excel的各種屬性等操作,需要操作Excel文件的接口文件ExcelTLB.pas。該文件提供了編程操作Excel的Delphi接口類庫,需要Microsoft Office環境下,通過Delphi提供的導入類庫來實現,具體操作步驟為:打開Delphi,點擊Project菜單下的“Import Type Library…”,在彈出對話框中,點擊“Add…”按鈕,從office安裝的文件夾找到xl5chs32.olb文件,然后點擊“Create Unit”即生成ExcelTLB.pas文件,把生成的ExcelTLB.pas文件另存到項目的文件夾以備使用。本文實現的函數(GridToExcel)所在單元必須在USES部分加入ExcelTLB單元。
3 報表輸出函數實現
這里給出了表格輸出函數的設計步驟和代碼。函數名稱為GridToExcel,參數有grid類型為TDBGrid,xlfile:string為Excel輸出的文件名,報表標題T1:string。函數返回值為輸入的報表數據行數。函數使用的局部變量如下:
var xlApp:Variant;//Excel對象
i,j:integer;irow,icol:integer;//循環控制變量
函數體分為以下幾個部分。
(1) 創建Excel自動化對象,代碼如下:
//判斷Grid是否有數據,無則直接返回
if (not grid.DataSource.DataSet.Active) or (grid.Datasource.Dataset.RecordCount=0) then exit;
Try
xlapp:=createoleobject(′Excel.application′);
xlapp.workbooks.Add(-4167);
xlapp.visible:=true;
Except
showmessage(′未安裝Microsoft Excel!請安裝!′);exit;
end;
(2) 填充標題到Excel對象,代碼如下:
irow:=grid.DataSource.DataSet.RecordCount;
icol:=0;
for i:=0 to grid.Columns.Count-1 do begin
if grid.Columns[i].Visible then//隱藏列不顯示
begin
inc(icol); xlapp.cells[TitleLines+1,Icol]:=grid.Columns[i].Title.Caption;
end;
end;
(3) 設置Excel報表顯示的標題行格式:
For i:=1 to TitleLines do begin
xlapp.activesheet.cells[i,1]:=Titles[i];xlapp.activesheet.range[′A′+IntToStr(i)+′:′+chr(64+icol)+IntToStr(i)].select;
xlapp.selection.HorizontalAlignment:= xlCenter;
xlapp.selection.VerticalAlignment:= xlCenter;
xlapp.selection.MergeCells := True;
//設置標題字體大小
if i=1 then begin
xlapp.selection.RowHeight:=26;
xlapp.selection.Font.size:=18;
end else begin
xlapp.selection.RowHeight:=20;
xlapp.selection.Font.size:=12;
end;
end;
(4) 設置表格線:
//設置表格線;
xlapp.activesheet.range[′A′+IntTostr(TitleLines+1)+′:′+chr(64+icol)+Inttostr(irow+TitleLines+1)].select;
with xlapp.selection do begin
Borders[xlEdgeBottom].linestyle:=xlContinuous;
Borders[xlEdgetop].linestyle:=xlContinuous;
Borders[xlEdgeright].linestyle:=xlContinuous;
Borders[xlEdgeLeft].linestyle:=xlContinuous;
End;
(5) 把Grid中的數據填到Excel中:
grid.DataSource.DataSet.First;
i:=TitleLines+2;
while not grid.DataSource.DataSet.Eof do begin
icol:=0;
for j:=1 to grid.Columns.Count do begin
if grid.Columns[j-1].Visible then begin
inc(icol);
xlapp.cells[i,icol]:=grid.Columns[j-1].Field.DisplayText;end;
end;
grid.DataSource.DataSet.Next; inc(i);
end;
(6) 調整Excel的列寬度自適應寬度:
For i:=1 to icol do begin
xlapp.activesheet.Columns[i].select;
xlapp.activesheet.Columns[i].EntireColumn.AutoFit;
end;
(7) 保存報表為指定的Excel文件名
xlapp.activesheet.cells[1,1].select;
xlapp.workbooks[1].SaveAs(xlfile);
4 使用實例
上述的函數完全可以加入到設計系統的Delphi項目中,并作為通用的函數,加入到通用函數庫單元中,需要在函數所在單元的USES部分加入上述的ExcelTLB單元。如系統地把圖書系統的查詢結果輸出到報表,只需要在查詢界面中增加一個按鈕,按鈕點擊事件代碼如下。就可以生成生成一個Excel二維報表。
procedure TBookSearchForm.ReportBtnClick(Sender: TObject);
begin
dmf.SaveDialog1.Filter:=′Excel文件(*.xls)| *.xls|所有文件(*.*)|*.*′;
if dmf.SaveDialog1.Execute then
begin GridToExcel(dmf.SaveDialog1.FileName,DBGrid1,′圖書查詢結果表′);
end;
end;
5 結 語
報表制作是MIS系統開發過程的一個重要的部分,許多通用的報表制作工具都提供了很大的功能支持,但是對于設計者而言都需要逐個設計,且工作繁瑣,維護工作量大。本文詳細闡述了通過一個簡單的函數實現簡單報表功能,可以給一類簡單的二維報表輸出提供很方便的調用。提供了完整的Delphi函數實現代碼,可以把其封裝為DLL庫的方式,供其他編程開發工具調用。該報表輸出方法已經在開發的“XX汽車維修企業信息系統”、“出版社圖書信息管理”等多個MIS系統得到應用,提高了報表設計的效率。
參考文獻
[1]李迎春,孫學波.非交互式報表生成器組件的設計和實現[J].計算機工程與設計,2009,30(10):2558-2560,2563.
[2]李興勇,袁兆山,汪正海.復雜報表生成系統實現技術研究[J].計算機應用,2007(7):1821-1824.
[3]艾永亮.一種新的通用報表模型的研究與實現[J].現代電子技術,2007,30(4):172-173,180.
[4]劉紀敏.基于ActiveX控件與SQL查詢的通用報表軟件設計[J].計算機應用與軟件,2005,22(4):134-135.
[5]金雨,張旭堂,劉文劍.用戶自定義通用報表打印的設計與實現[J].計算機應用與軟件,2008,25(3):132-134.
[6]管建和,王紹燕.基于ATL實現通用報表工具COM控件[J].計算機工程與設計,2007,28(17):4241-4242,4256.
[7]高鵬.基于動態DW+Formula1技術的集成式通用報表模型研究[J].計算機應用與軟件,2009,26(11):137-140.
[8]王勇超,張璟,馬靜,等.利用XML和Excel設計動態通用報表系統的新方法[J].現代電子技術,2008,31(18):93-96.
[9]周一,王世耕,黃忠全,等.基于FastReport的通用報表系統的設計與實現[J].計算機應用與軟件,2008,25(2):284-285.
[10]Charlie Calvert. Delphi5編程技術內幕[M].北京:機械工業出版社,2003.