摘要:本文是在開發數據庫管理系統的實踐中,為解決把大量以Excel表形式保存的學生歷史考試成績自動錄入數據庫的問題,提出了一種利用PowerBuilder特有的數據窗口、OLE技術以及對文件進行操作的函數等把Excel表導入SQL Server數據庫的一種高效率的實現方法,并在所研發的系統中運行成功。
關鍵詞:Excel表;PowerBuilder;數據庫;數據窗口
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)16-21179-03
A High-efficiency Method for Switching Excel-data Into Database
KANG Ya,SHAO Kang,WU Man-yi
(Institute of Economy and Management, Anhui University of Science Technology,Huainan 232001,China)
Abstract: In order to switch massive data saved as excel table into database automatically, proposed one kind of high-efficiency method for switching data saved as excel table into database by using the PowerBuilder’s unique data window, the OLE technology as well as function on the operation to the document, and it was run successfully in practice.
Key words: excel table; PowerBuilder; database; data-window
1 引言
在開發數據庫管理系統時經常會遇到對大量歷史數據進行錄入的問題,如果手動錄入一條一條的記錄既費時費力又容易出錯,因此客戶經常要求把一些大量的歷史數據能夠自動錄入到數據庫中去。在為安徽淮南實驗中學開發教務管理系統的過程中就遇到類似的問題,校方要求能夠把大量以Excel表形式保存的學生歷史考試成績自動錄入數據庫,這個問題必須很好的解決,否則開發出來的系統不可能令校方滿意。目前解決類似問題的常用方法是將Excel格式數據文件轉存為文本文件[1],再設法導入數據庫中。文獻[1]中詳細闡述了用這種方法把Excel數據導入Oracle數據庫中。但是這種方法使用起來不太方便,如果在實際應用中讓使用方增加一步這種操作,肯定是不合適的。還有些方法可以實現把Excel表數據直接導入數據庫,但是要按記錄逐條導入,也比較麻煩。因此,本文提出了一種把Excel表直接導入數據庫的實現方法。
2 理論分析
2.1 數據窗口
數據窗口是PowerBuilder的一大特色,數據窗口對象是數據窗口的一個組成部分,也是PowerBuilder的一大特色,它為我們操作數據庫中的數據提供了一種直觀有效的手段,利用它可以方便地進行連接數據庫,以自己喜歡的方式顯示數據庫中的數據以及修改數據庫[2]。PowerBuilder為數據窗口對象提供了11種顯示風格,每種風格只是定義了數據窗口的基本顯示樣式,在此基礎上可以進一步對數據窗口對象以及它所包含的其它對象的屬性進行設置,從而構造出千邊萬化的數據顯示界面[3]。
2.2 GetFileOpenNam()函數
功能:顯示打開文件對話框,讓用戶選擇要打開的文件。
語法:GetFileOpenName(title,pathname,filename{,extension{,filter}})。
示例:下面的代碼顯示“打開文件”對話框,之后打開用戶選擇的文件,對話框中顯示TXT和DOC類型文件:
string docname , named
integer value
value=GetFileOpenName(“打開文件”,docname,named,”DOC”,”本文件(*.TXT),*.TXT”
+”DOC文件(*.DOC),*.DOC”)
if value=1 then FileOpen(docname)[4]
2.3 ImportFile()函數
數據窗口的ImportFile函數可以將滿足某種格式的外部數據讀入到數據窗口中,該函數語法如下:
ImportFile(filename{,startrow {,endrow {,startcolumn {,endcolumn ,{dwstartcolumn}}}}})。
2.4 OLE技術
PowerBuilder 支持OLE(Object Linking and Embedding) , 即對象鏈接與嵌入。OLE 是一種為Windows 設計的交互進程通信機制, 實際上是一種編程接口。OLE 自動化技術使得用戶不僅能操縱駐留在自己應用程序里的對象, 而且能操縱駐留在系統上的其他程序中的對象。要實現OLE 技術, 首先要用OLE 對象OLEObject 聲明一個OLEObject 實例,然后創建該對象的實例,創建方法如下:
OLEObject oleobjectname
Oleobjectname = create OLEObject[5]。
在對安徽淮南實驗中學保存的學生成績表進行仔細研究后發現,這些表格都保存在電腦指定的硬盤上,且都有相同的表結構,根據這一特點考慮利用PowerBuilder中與Excel表樣式比較像的grid風格的數據窗口,利用OLE技術結合GetFileOpenName()、ImportFile()等函數來實現把Excel表導入SQL Server 2000數據庫中。
3 具體實現方法
在開發安徽淮南實驗中學教務管理系統中具體實現把Excel表導入SQL Server數據庫中的方法如下:
3.1 字段設計
創建grid風格數據窗口對象d_sjdr(如圖1),數據源為數據庫中已經創建好的xscjb表,選取的字段與Excel表的一致,變量類型也要一致(如圖2)。
■ ■
圖1grid風格數據窗口對象d_sjdr圖2Excel表
3.2 代碼設計
創建窗口w_sjdr,并添加一個數據窗口控件dw_1,dataobject為d_sjdr,兩個命令按鈕控件cb_1、cb_2,在Excel表導入按鈕中寫如下代碼:
String pathname,filename
Int openname_return
openname_return=GetFileOpenName(\"打開文件\",pathname, filename, \"TXT\", \"文本文件 (*.TXT),*.TXT,\" + \"Excel文件 (*.XLS),*.XLS\")
IF openname_return=1 THEN
IF Upper(Right(filename,3))=\"TXT\" THEN
dw_1.ImportFile(pathname)
ELSE
OLEObject ExcelServer
Long excelok
String str_savename
ExcelServer = CREATE OLEObject
ExcelOK = ExcelServer.ConnectToNewObject( \"excel.application\" )
IF excelok < 0 THEN
messagebox(\"連接excel失敗,檢查你的系統是否安裝了office\",string(excelok))
ELSE
ExcelServer.Workbooks.Open(pathname)
str_savename=\"c:\emp.txt\"
ExcelServer.activeworkbook.saveas(str_savename,3)
ExcelServer.displayalerts=False
ExcelServer.quit()
ExcelServer.DisconnectObject()
DESTROY ExcelServer
dw_1.ImportFile(str_savename)
filedelete(str_savename)
END IF
END IF
END IF
在保存按鈕中寫入如下代碼:
string ls_nj,ls_bj,ls_xm
decimal ls_yw,ls_sx,ls_yy,ls_zz,ls_ls,ls_dl,ls_sw,ls_wl,ls_hx
string ls_kc,ls_rxnf
long ll_check
long ll_rowcount,i,j
ll_rowcount=dw_1.rowcount()
if ll_rowcount<1 then
messagebox(\"系統提示\",\"沒有要執行的記錄!\")
return
end if
for i=1 to ll_rowcount
ls_nj=dw_1.object.nj[i]
ls_bj=dw_1.object.bj[i]
ls_xm=dw_1.object.xm[i]
ls_yw=dw_1.object.yw[i]
ls_sx=dw_1.object.sx[i]
ls_yy=dw_1.object.yy[i]
ls_zz=dw_1.object.zz[i]
ls_ls=dw_1.object.ls[i]
ls_dl=dw_1.object.dl[i]
ls_sw=dw_1.object.sw[i]
ls_wl=dw_1.object.wl[i]
ls_hx=dw_1.object.hx[i]
ls_kc=dw_1.object.kc[i]
ls_rxnf=dw_1.object.rxnf[i]
insert into xscjb
(nj,bj,xm,yw,sx,yy,zz,ls,dl,sw,wl,hx,kc,rxnf)
values(:ls_nj,:ls_bj,:ls_xm,:ls_yw,:ls_sx,:ls_yy,:ls_zz,:ls_ls,:ls_dl,:ls_sw,:ls_wl,:ls_hx,:ls_kc,
:ls_rxnf);
commit;
next
messagebox(\"系統提示\",\"成績錄入成功!\")
4 運行結果
在系統主界面菜單中點數據導入子菜單,在彈出的窗口中點Excel表導入按鈕,彈出打開文件對話框,找到要打開的Excel表所在的路徑,在文件類型中選擇Excel文件(*.XLS),選中存放學生成績的Excel表格文件,點打開就可以把成績讀人到當前數據窗口中(如圖3),與原始數據進行對比,發現完全一致,再點保存按鈕即可把數據錄入到數據庫中。
在程序運行時如果創建數據窗口對象選取的字段與Excel表的不一致,或者系統沒有安裝office軟件,都會出現運行錯誤,這兩點一定要注意,否則不能實現預期的功能。
■
圖3 運行結果
5 結束語
本文提出了一種利用PowerBuilder特有的數據窗口、OLE技術以及對文件進行操作的函數等把Excel表導入SQL Server 2000數據庫的實現方法,該方法已成功應用于安徽淮南實驗中學教務管理系統研發中,系統的運行環境是Windows XP 。實踐證明該方法在程序設計上比較簡單易行,而且效率非常高,它可以把大量的數據一次性導入,比按記錄行一條一條導入的方法效率高的多,可以很好的解決目前客戶對系統歷史數據錄入的需求問題,具有很強的實用性,可供開發數據庫管理系統時借鑒。
參考文獻:
[1] 馬櫟.如何將Excel、Access、FoxPox數據導入Oracle數據庫[J].電腦開發與應用,2005(11):64.
[2] 呂曉輝. PowerBuilder9.0全方位教程[M].北京:航空工業出版社,2003:196.
[3] 陳永強,等.PowerBuilder數據庫開發經典實例精解[M].北京機械工業出版社,2007:161.
[4] 鄭啟迪,等.PowerBuilder9.0經典范例50講[M].北京:兵器工業出版社、北京希望電子出版社,2005:28-29.
[5] 潘峰,等.PowerBuilder中通過OLE實現復雜Excel報表[J].電腦知識與技術,2006(8):158.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。