摘 要:文章介紹如何使用 Delphi 編程通過定義報表內容描述、Excel 模板文件和服務器描述文件實現 Oracle 數據庫和 Excel 模板文件的數據交換,并以 Ftp 方式自動發布到 Web 數據發布平臺。
關鍵詞:Delphi;Excel模板;報表定義;Ftp
1 引言
隨著計算機應用技術的快速發展,Excel 電子表格的普及,工作中常常需要從不同的信息管理系統中查詢統計數據并以 Excel 表格方式展現報表。由于行業或者業務部門需求的變化,導致報表格式、種類繁多。一些復雜報表,需求在軟件開發期間都無法明確,為了解決此類問題,采用了表格功能強大的 Excel 作為報表模板,Delphi 程序根據報表數據定義動態填入數據,完成數據填充后以 Ftp 方式上傳填寫完數據的文件到 Web 數據發布平臺,從而實現 Excel 報表的自動生成和發布功能。
2 實現原理
2.1 按照業務部門的需求,根據需要的報表格式,編輯好Excel報表模板文件;根據報表的數據內容和區域,編寫好報表定義文件。
2.2 以報表定義文件文件名作為運行的參數,在操作系統下創建批處理命令,并可以根據實際需要把批處理加入操作系統的計劃任務,實現按程序自動運行。
2.3 程序根據報表定義文件的描述,主要做如下操作:①讀取指定的 Excel 模板文件;②到指定的數據庫服務器查詢數據并填充 Excel 模板文件;③以Ftp方式上傳生成好的Excel報表文件到FTP服務器。
3 實現過程描述
3.1 報表定義文件
采用可擴展標記語言(XML文件描述),主要內容描述如下:
D:\xxxx\template_xxx.xls<!-excel 模板文件-->
<!--輸出文件名-->
……
<!-返回游標名-->
……
……
在 Delphi 中使用控件解析方法生成 XML 文件接口框架代碼,通過生成的接口單元讀取 XML 文件,主要代碼如下:
Var xmlReport:IXMLReportType;//定義報表定義文件變量
……
xmlReport := LoadReport(報表定義XML文件);//讀取報表定義文件
if length(trim(xmlReport.Ftpserver))>0 then //是否指定FTP上傳服務器
uplaodFile(xmlReport.output);//上傳文件到Ftp服務器
……
3.2 服務器定義文件
文件格式同報表定義文件,主要內容及描述如下:
……
……
Delphi 處理該文件方法同上,根據指定服務器名稱取查找服務器子節點,主要代碼如下:
//根據指定的FTP名稱,取服務器定義文件中 FTP 中節點
for i := 0 to xmlServers.Ftp.ChildNodes.Count - 1 do begin
if (trim(xmlServers.Ftp.server[i].Name) = trim(serverName)) then begin
result := xmlServers.Ftp.server[i]; exit; end;
end;
3.3 采用第三方數據庫控件 ODAC 訪問 Oracle 數據庫
ODAC 全稱 Oracle Data Access Components,是 Oracle 數據存取組件,直接使用 Oracle 接口(OCI),在應用中建立連接可以使用 ODAC Net 選項無需在客戶機上安裝 Oralce 客戶端,僅需 TCP/IP 支持,本次開發中使用了 TOraSession 和 TOraQuery 兩個控件,主要代碼如下:
if oraSession.Connected then oraSession.Close; //關閉數據庫連接
oraSession.ConnectString := getOracleServerNode(OracleServerNname).ConnectString;//修改連接字串, 函數 getOracleServerNode 返回變量 Oracle 服務器節點;
oraSession.Connect;//連接數據庫;
ToraQuery 的使用方法同 Delphi 中 TQuery;
3.4 Oracle 數據集填充 Excel 數據區域
根據指定數據區域和SQL語句向Excel模板文件中填寫數據,注意點:SQL語句運行結果和指定數據區域要一一對應。
//處理Excel模板主要代碼 excelTemplate 類型為 Variant;
excelTemplate := CreateOleObject( 'Excel.Application' );
excelTemplate.Visible := 1;//設置程序運行時為不可見
excelTemplate.WorkBooks.Open(Excel模板文件);
……
excelTemplate.workbooks[1].saveas(outFile);//保存Execl模板文件
excelTemplate.quit; //關閉
//填充 OraQuery 數據集到 excel 模板文件主要代碼, rectarea 為報表定義文件中當前數據區域節點
rect := strToRect(rectarea.Rect);// strToRect為自定義 String 轉 TRect 函數
excelTemplate.WorkSheets[rectarea.Sheet].Activate;//指定 excelTemplate中sheet;
oraQuery.First;
for nowRow := rect.Top to rect.Bottom do begin
for nowCol := rect.Left to rect.Right do begin
excelTemplate.Cells[nowRow,nowCol] := oraQuery.FieldList[nowCol-rect.Left].AsString; end;
oraQuery.Next;
end;
……
采用Delphi中 TNMFTP 控件上傳文件
所有數據區域數據填充結束后,根據報表定義文件中指定的 FTP 服務器名稱,在服務器定義中查找對應 FTP 服務器節點上傳文件,實現主要代碼如下:
FtpFile:=TNMFTP.create(nil);
FtpFile.Host:= trim(serverFtp.addr); //FTP設置服務器地址
FtpFile.Port:= StrToInt (serverFtp.port); //FTP設置端口號
FtpFile.UserID:=trim(serverFtp.user); //FTP設置用戶名
FtpFile.Password:=trim(serverFtp.pwd); //FTP設置口令
FtpFile.TimeOut:= StrToInt(serverFtp.timeout); //FTP設置延時
……
If FtpFile.Connected then FtpFile.Mode(MODE_BYTE);//設置按二進制方式傳
FtpFile.Upload(xmlReport.output, xmlReport.ftpdir+ ExtractFileName (xmlReport.output));//上傳文件
……
4 結束語
Excel是使用廣泛的辦公軟件,通過Excel與Delphi結合,使用者只要熟悉Oracle數據庫查詢語言就可以設計出比較復雜的報表格式,并實現報表的定期自動生成與上傳,切實提高了工作效率。
參考文獻
[1]耿宏運,等.Delphi6組件大全[M].北京:電子工業出版社,2002,7.
[2]Casteel,J.Oracle9i開發指南(PL\SQL程序設計)[M].北京:清華大學出版社,2004,3.