VFP與Excel交互編程
發(fā)表時(shí)間:2023-08-07 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]◆ 何詠明 (djkhym@netease.com) VFP(Visual Foxpro)是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由于其強(qiáng)大的數(shù)據(jù)處理能力及良好的兼容性,使其成為數(shù)據(jù)庫(kù)應(yīng)用程序開發(fā)人員強(qiáng)有力的工...
◆ 何詠明 (djkhym@netease.com)
VFP(Visual Foxpro)是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由于其強(qiáng)大的數(shù)據(jù)處理能力及良好的兼容性,使其成為數(shù)據(jù)庫(kù)應(yīng)用程序開發(fā)人員強(qiáng)有力的工具而廣為使用; 而Excel則是一個(gè)優(yōu)秀的電子表格處理軟件,在兼容性、操作界面、公式運(yùn)算、圖表等方面有著獨(dú)到的優(yōu)勢(shì),成為廣大辦公應(yīng)用人員必備的首選軟件。上述兩種軟件在各自的應(yīng)用領(lǐng)域均得到了廣泛的應(yīng)用,同時(shí)上述兩種軟件還具有良好的交互編程能力,為兩者相輔相成、取長(zhǎng)補(bǔ)短奠定了良好的基礎(chǔ)。
本文將結(jié)合實(shí)例介紹VFP與Excel交互編程的方法,在VFP中除了使用OLE技術(shù)外,還可使用DDE技術(shù)與外部服務(wù)器進(jìn)行數(shù)據(jù)交換,本文主要講解VFP中使用OLE技術(shù)與Excel交換數(shù)據(jù),Excel中借助內(nèi)置的VBA使用VFP提供的Application對(duì)象來調(diào)用VFP中的一些功能。其功能可簡(jiǎn)述如下:VFP數(shù)據(jù)表“學(xué)生成績(jī).DBF”中含“學(xué)號(hào)、姓名、語(yǔ)文、數(shù)學(xué)”等字段,示例程序?qū)腅xcel工作簿“VFP交互.XLS”的工作表“查詢”中用“條件”區(qū)域(一般為一個(gè)矩形區(qū)中的數(shù)據(jù),該區(qū)域名稱指定為“條件”,數(shù)據(jù)形如“語(yǔ)文>60”、“數(shù)學(xué)<90”等)中的數(shù)據(jù)作為查詢的條件,用“連接條件”區(qū)域(一般為一個(gè)單元格,其值為“or”或者“and”)來獲取組合“條件”的邏輯連接,并將該連接信息的內(nèi)容以工作表的形式顯示出來,然后調(diào)用VFP中針對(duì)給定表的SQL查詢來找出給定條件的記錄并顯示到Excel中。下列程序均在VFP 6.0與Excel 2000中調(diào)試通過。
Excel驅(qū)動(dòng)VFP
Excel內(nèi)置的VBA語(yǔ)言(Visual Basic For Application)為Excel功能的擴(kuò)展提供了便利的手段,用戶可使用該語(yǔ)言直接驅(qū)動(dòng)VFP完成數(shù)據(jù)檢索等功能。程序首先生成一個(gè)VFP對(duì)象,然后用VFP的DoCmd方法執(zhí)行VFP搜索命令串,其搜索結(jié)果再借助于VFP的DataToClip方法拷貝至剪切板,最后VBA將其粘貼至工作表的正確位置,為了每次運(yùn)行時(shí)能將結(jié)果插入到工作表中,依次對(duì)操作的工作表以“搜索結(jié)果”、“搜索結(jié)果1”等進(jìn)行編號(hào)。
Sub exceluseFox ()
Dim oFox As Object ’聲明oFox為一個(gè)對(duì)象
Dim SCommand As String
’SQL對(duì)應(yīng)的命令串變量
Dim cell As Variant
Dim choice As String
Dim join As String
Dim first As Boolean
Dim found As Boolean ’搜索結(jié)果標(biāo)志,若表單中有搜索結(jié)果,則為真
Set oFox = CreateObject(“VisualFoxPro
.Application”)
’啟動(dòng)VFP,生成VFP對(duì)象
Sheets(“查詢”).Select
’選擇對(duì)應(yīng)的工作表“查詢”
join = Range(“連接條件”)
’在單一表格中的一個(gè)元素,其值為and或者or
choice = “” ’置連接串初值為空
first = True ’一般情況下連接串后需要加上邏輯連接符and 或 or,首次例外
For Each cell In Range(“條件”) ’產(chǎn)生連接條件,形成where語(yǔ)句的連接邏輯串
If first Then
choice = choice + cell ’形成第一次出現(xiàn)的where子句后的字符串
first = False
’修改首次進(jìn)入標(biāo)志,以后的連接均需要加上邏輯連接符
Else
choice = choice + “ ” + join + “ ” + cell
’join的值是and或者是or
End If
Next cell
Sheets.Add ’ 產(chǎn)生新的工作表單
’找一個(gè)不重復(fù)的工作表名
found = False
’工作表名中前四個(gè)漢字有沒有“搜索結(jié)果”的標(biāo)志變量
n = 1
For Each cell In Worksheets
If InStr(1, cell.Name, “搜索結(jié)果”) <> 0 Then
found = True ’找到對(duì)應(yīng)的工作表
If n < Val(Mid(cell.Name + Space(2), 5, 2)) Then
n = Val(Mid(cell.Name + Space(2), 5, 2))
’形成形如搜索結(jié)果1、搜索結(jié)果2等的表單名
End If
End If
Next cell
If Not found Then
ActiveSheet.Name = “搜索結(jié)果”
Else
n = n + 1 ’值增1
ActiveSheet.Name = “搜索結(jié)果”& n
’形成工作表名
End If
SCommand =“SELECT * FROM d:\vfp\學(xué)生成績(jī)表WHERE”+choice +“ INTO CURSOR TEMP” ’形成VFP查詢命令串
oFox.DoCmd Scommand ’執(zhí)行VFP命令串
oFox.DataToClip “temp”, , 3
’將搜索結(jié)果以文本方式拷貝至剪切板
Range(“a1: a1”).Select
’指向拷貝目標(biāo)區(qū)域左上角單元
ActiveSheet.Paste ’粘貼搜索結(jié)果
End Sub
上述Excel中的區(qū)域名稱(如“條件”和“連接條件”名稱)的設(shè)定方法是,在Excel中選擇菜單“插入->名稱->定義”來完成對(duì)給定區(qū)域名稱的設(shè)定,這個(gè)名稱可以在VBA中訪問,如前述中的“條件”和“連接條件”。
VFP使用Excel
OLE(Object Linking and Embedding)對(duì)象鏈接與嵌入,是Windows應(yīng)用程序間相互傳遞和共享數(shù)據(jù)的一種有效方法。VFP借助于OLE不僅可共享其他應(yīng)用程序的數(shù)據(jù),而且還能以對(duì)象方式直接控制其他應(yīng)用程序的運(yùn)行,從而進(jìn)一步擴(kuò)展VFP的功能。VFP支持直接在程序中創(chuàng)建、使用和控制OLE對(duì)象,實(shí)現(xiàn)OLE自動(dòng)化。作為OLE客戶,VFP與作為OLE服務(wù)器的Excel具有良好的編程接口,下述程序段用OLE方式實(shí)現(xiàn)所要求的功能。程序首先生成一個(gè)Excel的OLE對(duì)象OleApp以便對(duì)其進(jìn)行操作,然后利用OLE功能從Excel表單中獲取欲查詢的條件,并控制Excel生成新的唯一的工作表,通過找尋當(dāng)前操作的所有工作表達(dá)到名稱的唯一,VFP的查詢結(jié)果仍然使用剪切板的方式傳遞至Excel工作表中。
local condition,where1,first,scommand,cell,newsheet,found1,n
OleApp=CreateObject(“Excel.Application”)
&& 打開Excel,產(chǎn)生OLE對(duì)象
OleApp.Application.Caption=“VFP交互編程”
&& 指定標(biāo)題欄名稱
OleApp.Application.Visible=.T.
&& 置Excel可見
OleApp.Application.WorkBooks.Open(“d:\vfp\VFP交互.xls”)
&& 打開Excel工作簿,用戶也可以修改連接條件或者查詢條件
where1=“”
&&保存SQL中where子句的變量
first=.t.
&&置首次進(jìn)入“查詢”工作表中“條件”區(qū)域標(biāo)志
found1=.f.
n=1
DO WHILE .T.
WITH OleApp.Application
nAnswer = MessageBox(“開始搜索?”, 32+4, “搜索指定數(shù)據(jù)”)
&&顯示搜索信息
IF (.NOT. (nAnswer=6))
&& 如按下“Yes”按鈕,則開始搜索,反之退出
EXIT
ENDIF
.Sheets(“查詢”).Select
&& 選取示例中的對(duì)應(yīng)工作表
condition=.range(“連接條件”).value
&&得到“連接條件”區(qū)域中的邏輯連接符
for each cell in .range(“條件”).value
&&將表單區(qū)域內(nèi)所有單元的數(shù)據(jù)拼接以形成where的連接邏輯串
If first Then
Where1 = Where1 + cell
&&首次進(jìn)入時(shí)where子句中串前不需要邏輯連接符
first = .f. &&置非首次進(jìn)入標(biāo)志
Else
Where1=Where1 +“ ”+condition +“ ”+ cell
&&這里condition的值取and或者or
EndIf
next for
.Sheets.Add && 新建一工作表單
&&下面的for …each子句是用于找尋有否對(duì)應(yīng)的工作表,若有則在搜索結(jié)果1、搜索結(jié)果2……搜索結(jié)果n中得到最大的n值以便產(chǎn)生下一個(gè)比n大1的新工作表“搜索結(jié)果&(n+1)”
for each newsheet in .worksheets
if “搜索結(jié)果”$ newsheet.name
n=max(val(subset(newsheet.name+space(2),9,2)),n) &&得到最大的n值
found1=.t. &&置找到工作表中前四個(gè)漢字是“搜索結(jié)果”的工作表
endif
next for
if not found1
.ActiveSheet.Name =“搜索結(jié)果1”
&& 指定工作表單的名稱
else
.activesheet.name=“搜索結(jié)果”+str(n+1,2)
&&得到唯一的工作表
endif
SCommand = “SELECT * FROM d:\vfp\學(xué)生成績(jī)表 WHERE ”+ALLTrim(where1) +
“INTO CURSOR TEMP”
&& 形成VFP查詢命令串
&Scommand && 執(zhí)行VFP命令串
_VFP.DataToClip(“TEMP”, , 3)
&& 將搜索結(jié)果以文本方式拷貝至剪切板
.Range(“a1: a1”).Select
&& 指向拷貝目標(biāo)區(qū)域左上角單元
.ActiveSheet.Paste
&& 粘貼搜索結(jié)果
ENDWITH
ENDDO
OleApp.Quit
&& 關(guān)閉Excel,保存更新后的工作簿文件
結(jié)束語(yǔ)
VFP與Excel的交互能力是很強(qiáng)的,用戶可以使用VFP處理數(shù)據(jù)庫(kù)的一些運(yùn)算,如插入、排序、合并、選擇等,將結(jié)果交由Excel中進(jìn)行一些后期的處理,甚至可以將一些抽取數(shù)據(jù)的條件直接加入到Excel的條件區(qū)域中,由VFP來讀取條件區(qū)域進(jìn)行數(shù)據(jù)的篩選。總之,只要能充分利用好各自的優(yōu)點(diǎn),理解交互的接口方法,就一定能夠編寫出較適用的程序,滿足實(shí)際工作的需要。