VFP和Excel都可以用來(lái)進(jìn)行處理數(shù)據(jù)庫(kù)表格,如果巧妙地將二者的優(yōu)點(diǎn)結(jié)合起來(lái),將會(huì)大大方便我們的工作。比如我們可以利用VFP進(jìn)行處理數(shù)據(jù),而利用Excel的預(yù)覽打印功能進(jìn)行報(bào)表打印。這就需要我們?cè)赩FP中直接來(lái)控制Excel。下面就在開發(fā)VFP應(yīng)用項(xiàng)目時(shí)對(duì)Excel的控制作一下介紹:
*!* 1.創(chuàng)建Excel對(duì)象
oExcel=Createobject("Excel.application")
*!* 2.添加新工作簿
oExcel.Workbooks.Add
*!* 3.設(shè)置第3個(gè)工作表為激活工作表
oExcel.Worksheets("sheet3").Activate
*!* 4.打開指定工作簿
oExcel.Workbooks.Open("c:\temp\ll.xls")
*!* 5.顯示Excel窗口
oExcel.Visible=.T.
*!* 6.更改Excel標(biāo)題欄
oExcel.Caption="VFP應(yīng)用程序調(diào)用Microsoft Excel"
*!* 7.給單元格賦值
oExcel.cells(1,4).Value=XM(XM為數(shù)據(jù)庫(kù)字段名)
*!* 8.設(shè)置指定列的寬度(單位:字符個(gè)數(shù))
oExcel.ActiveSheet.Columns(1).ColumnWidth=5
*!* 9.設(shè)置指定行的高度(單位:磅)
oExcel.ActiveSheet.Rows(1).RowHeight=1
(設(shè)定行高為1磅,1磅=0.035厘米)
oExcel.ActiveSheet.Rows("50:100").RowHeight=1 &&設(shè)置第50行至100行的高度
*!* 10.在第18行之前插入分頁(yè)符
oExcel.Worksheets("Sheet1").Rows(18).PageBreak=1
*!* 11.在第4列之前刪除分頁(yè)符
oExcel.ActiveSheet.Columns(4).PageBreak=0
*!* 12.指定邊框線寬度(Borders參數(shù)如下)
ole.ActiveSheet.Range("b3:d3").BorderS(2).Weight=3
*!* 13.設(shè)置四個(gè)邊框線條的類型
oExcel.ActiveSheet.Range("b3:d3").BorderS(2).LineStyle=1
(其中Borders參數(shù):1-左、2-右、3-頂、4-底、5-斜、6-斜/;LineStyle值:1與7-細(xì)實(shí)、2-細(xì)虛、4-點(diǎn)虛、9-雙細(xì)實(shí)線)
*!* 14.設(shè)置頁(yè)眉
oExcel.ActiveSheet.PageSetup.CenterHeader="報(bào)表1"
*!* 15.設(shè)置頁(yè)眉(字體大小)
oExcel.ActiveSheet.PageSetup.CenterHeader="&50報(bào)表1" &&'&'后面的50可以自定義,表示字體的大小
*!* 16.設(shè)置頁(yè)腳
oExcel.ActiveSheet.PageSetup.CenterFooter="第&P頁(yè)"
*!* 17.設(shè)置頁(yè)腳(字體大小)
oExcel.ActiveSheet.PageSetup.CenterFooter="&28第&P頁(yè)" &&'&'后面的28可以自定義,表示字體的大小
*!* 18.設(shè)置頁(yè)眉到頂端邊距為2厘米
oExcel.ActiveSheet.PageSetup.HeaderMargin=2/0.035
*!* 19.設(shè)置頁(yè)腳到底邊距為3厘米
oExcel.ActiveSheet.PageSetup.FooterMargin=3/0.035
*!* 20.設(shè)置頂邊距為2厘米
oExcel.ActiveSheet.PageSetup.TopMargin=2/0.035
*!* 21.設(shè)置底邊距為4厘米
oExcel.ActiveSheet.PageSetup.BottomMargin=4/0.035
*!* 22.設(shè)置左邊距為2厘米
oExcel.ActiveSheet.PageSetup.LeftMargin=2/0.035
*!* 23.設(shè)置右邊距為2厘米
oExcel.ActiveSheet.PageSetup.RightMargin=2/0.035
*!* 24.設(shè)置頁(yè)面水平居中
oExcel.ActiveSheet.PageSetup.CenterHorizontally=.T.
*!* 25.設(shè)置頁(yè)面垂直居中
oExcel.ActiveSheet.PageSetup.CenterVertically=.T.
*!* 26.設(shè)置頁(yè)面紙張大小(1-窄行8511 39-寬行1411 9:A4)
oExcel.ActiveSheet.PageSetup.Papersize=1
*!* 27.打印單元格網(wǎng)線
oExcel.ActiveSheet.PageSetup.PrintGridlines=.T.
*!* 28.拷貝整個(gè)工作表
oExcel.ActiveSheet.UsedRange.Copy
*!* 29.拷貝指定區(qū)域
oExcel.ActiveSheet.Range("A1:E2").Copy
*!* 30.粘貼
oExcel.WorkSheet("Sheet2").Range("A1").PasteSpecial
*!* 31.在第2行之前插入一行
oExcel.ActiveSheet.Rows(2).Insert
*!* 32.在第2列之前插入一列
oExcel.ActiveSheet.Columns(2).Insert
*!* 33.設(shè)置字體
oExcel.ActiveSheet.Cells(2,1).Font.Name="黑體"
*!* 34.設(shè)置字體大小
oExcel.ActiveSheet.Cells(1,1).Font.Size=25
*!* 35.設(shè)置字體為斜體
oExcel.ActiveSheet.Cells(1,1).Font.Italic=.T.
*!* 36.設(shè)置整列字體為粗體
oExcel.ActiveSheet.Columns(1).Font.Bold=.T.
*!* 37.清除單元格公式
oExcel.ActiveSheet.Cells(1,4).ClearContents
*!* 38.打印預(yù)覽工作表
oExcel.ActiveSheet.PrintPreview
*!* 39.打印輸出工作表
oExcel.ActiveSheet.PrintOut
*!* 40. oExcel.CommandBars(1).Controls(1).accChild(18).Execute &&打印(菜單序號(hào)18為Excel2003的‘打印’項(xiàng))
&&不同版本Excel的菜單序號(hào)可以通過(guò)以下程序取得
*(需要在VFP7.0以上運(yùn)行)
oXls=Getobject("","excel.sheet")
XlApp=oXLS.Application
XlSheet=XlApp.ActiveSheet
bars=xlapp.CommandBars.Count
Str1=''
For i=1 To bars
Str1=Str1+Chr(13)+Alltrim(Str(i))+'、'+xlapp.CommandBars(i).accName+'(NAME:'+xlapp.CommandBars(i).Name+' INDEX:'+Alltrim(Str(xlapp.CommandBars(i).Index))+')'
bars2=xlapp.commandbars(i).accChildCount
For j=1 To bars2
Try
obj=xlapp.commandbars(i).Controls(j)
Str1=Str1+Chr(13)+' '+Alltrim(Str(j))+'、'+xlapp.commandbars(i).Controls(j).accname+'(ID:'+Alltrim(Str(xlapp.CommandBars(i).Controls(j).Id))+')'
For k=1 To obj.accChildCount
Try
If Not Empty(obj.Controls(k).accname )
Str1=Str1+Chr(13)+' '+Alltrim(Str(k))+'、'+obj.Controls(k).accName+' (ID:'+ Alltrim(Str(obj.Controls(k).Id))+')'
Endif
Catch
Exit
Endtry
Endfor
Catch
Exit
Endtry
Endfor
Wait Windows Alltrim(Str(i))+' / '+Alltrim(Str(bars))+' '+Str(i/bars*100,10,2)+'%' Nowait
Endfor
Save To Xls.txt All Like Str1
Modify Command Xls.txt
Return
*!* 41.工作表另存為
oExcel.ActiveWorkbook.SaveAs("c:\temp\22.xls")
*檢測(cè)當(dāng)前目錄是否有同名的EXCEL表,如果有先刪除,再另存
If !File(Sys(5) + Curdir() + "result.xls")
oExcel.ActiveWorkbook.SaveAs(Sys(5) + Curdir() + "result.xls")
Else
lcFileName = loExcel.GetSaveAsFilename("result", "Excel (*.xls), *.xls")
If !Empty(lcFileName)
If File(lcFileName)
Delete File (lcFileName)
Endif
oExcel.ActiveWorkbook.SaveAs(lcFileName)
Endif
Endif
*!* 42.放棄存盤 && 避免出現(xiàn)保存對(duì)話框
oExcel.ActiveWorkbook.saved=.T.
*!* 43.存盤
oExcel.ActiveWorkbook.Save
*!* 44.關(guān)閉工作簿
oExcel.Workbooks.Close
objexcel.activeworkbook.Close(.F.)
*!* 45.退出Excel
oExcel.Quit
Release oExcel &&只有釋放對(duì)象變量, EXCEL進(jìn)程才會(huì)完全關(guān)閉
*!* 46.合并單元格
oExcel.ActiveSheet.Range("A4:B5").MergeCells=.T.
*!* 47.下列設(shè)置大家自己理解
With crfole.ActiveSheet.PageSetup
.LeftHeader = Chr(13)+"左頁(yè)眉"
.CenterHeader = "中頁(yè)眉"
.RightHeader = "右頁(yè)眉"
.LeftFooter = "左頁(yè)腳"
.CenterFooter = "中頁(yè)腳"
.RightFooter = "右頁(yè)腳"
.Orientation=1 &&1豎排,2橫排
Endwith
With crfole.Range("A4:C4")
.MergeCells = .T.
.WrapText =.F.
.Orientation = 0
.AddIndent =.F.
.ShrinkToFit = .F.
Endwith
*!* 48.文本對(duì)齊
oExcel.Range("A4:c4").HorizontalAlignment =1 &&水平(1-默認(rèn)、2-靠左、3-居中、4-靠右、5-填充、6=兩端對(duì)齊、7=跨列居中、8=分散對(duì)齊)
oExcel.Range("A4:c4").VerticalAlignment =2 &&垂直(1=靠上、2=居中、3=靠下、4=兩端對(duì)齊、5=分散對(duì)齊)
*!* 49.拷貝整個(gè)工作表(含格式)
oExcel.activesheet.cells.Copy &&拷貝
oExcel.sheets(1).Select &&選擇第一工作表
oExcel.ActiveSheet.Paste &&粘貼
oExcel.ActiveSheet.Cells(3,4).Value && ActiveSheet 為當(dāng)前的Sheet工作薄名字,Cells(3,4).value 為第3行第4列的值
*以上控制調(diào)用語(yǔ)句在中文VFP5.0企業(yè)版下運(yùn)行通過(guò),運(yùn)行環(huán)境為Excel 97及中文Windows 98
*!* 50.顯示某個(gè)單元格的批注內(nèi)容
oExcel=Createobject("Excel.application")
oExcel.Workbooks.Open("d:\TEST\testa.xls")
oExcel.Visible=.T.
oExcel.Range("B5").Comment.Text &&顯示B5單元格的批注內(nèi)容
oExcel.Workbooks.Close
oExcel.Quit
Release oExcel
*!* 51.oExcel.ActiveSheet.PageSetup.PrintTitleRows="$1:$1" &&每頁(yè)都打印行標(biāo)頭(每頁(yè)頂部出現(xiàn)的單元格的行)
*!* 52.保護(hù)工作表:
oExcel.ActiveSheet.Protect('密碼',.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.)
*!* 53.保護(hù)工作薄
oExcel.ActiveWorkbook.Protect('密碼',.T.,.T.)
第一個(gè).T.:保護(hù)工作簿結(jié)構(gòu)
第二個(gè).T.:保護(hù)工作簿窗口
*!* 54.設(shè)置允許用戶編輯區(qū)域
oExcel.ActiveSheet.Protection.AllowEditRanges.Add("區(qū)域3",oExcel.ActiveSheet.Range("A2:D5"))
*!* 55.如果不想在宏運(yùn)行時(shí)被無(wú)窮無(wú)盡的提示和警告消息所困擾,就將本屬性設(shè)置為.F.
oExcel.DisplayAlerts = .F.
如果不想在宏運(yùn)行時(shí)被無(wú)窮無(wú)盡的提示和警告消息所困擾,就將本屬性設(shè)置為 False;這樣每次出現(xiàn)需用戶應(yīng)答的消息時(shí),Microsoft Excel 將選擇默認(rèn)應(yīng)答。
如果將本屬性設(shè)置為 False,那么宏運(yùn)行結(jié)束后, Microsoft Excel 并不自動(dòng)將其設(shè)置回 True。故當(dāng)宏運(yùn)行結(jié)束后,都應(yīng)將本屬性設(shè)置回 True 值。
*!* 56.將當(dāng)前工作表中的已用區(qū)域(只讀)存入數(shù)組。
strPath='D:\TEST\123.xls'
Local oExcel
oExcel=Createobject("Excel.Application")
oExcel.WorkBooks.Open(strPath)
arrTableInfo=oExcel.ActiveSheet.UsedRange.Value &&將當(dāng)前工作表中的已用區(qū)域(只讀)存入數(shù)組。
oExcel.Quit
Release oExcel
Insert Into 表名 From arrTableInfo
*!* 57.設(shè)置excel批注的字體(excel 2000實(shí)現(xiàn)了,如下:)
ole.Range("a3").Comment.Shape.Select && 此命令要求批注的 Visible=.t.
ole.Selection.Font.Size=9
ole.Selection.Font.Name="黑體"
ole.Selection.Font.bold=.F.
注:該組命令要求先選中批注框,否則寫成 ole.Range("a3").Comment.Shape.Font.Size=9 則出錯(cuò),不知為何!
*!* 58.如何取得當(dāng)前EXCEL表中工作表的數(shù)目及各工作表的名稱?
Clear
Local lnSheetCount
oExcel=Createobject("EXCEL.APPLICATION") &&創(chuàng)建Excel對(duì)象
oExcel.WORKBOOKS.Open("c:\111\321.xls") &&打開指定工作簿
With oExcel
lnSheetCount=.WorkBooks(1).Sheets.Count &&統(tǒng)計(jì)工作表數(shù)量
Endwith
'當(dāng)前EXCEL表中工作表的數(shù)目為:'+Alltrim(Str(lnSheetCount))
For Each oMyVar In oExcel.sheets
'當(dāng)前EXCEL表中工作表的名稱分別為'+oMyVar.Name &&顯示Excel表中所有工作表
Next oMyVar
oExcel.WORKBOOKS.Close &&關(guān)閉工作簿
oExcel.Quit &&退出Excel
*!* 59.獲取工作表名稱
在以下示例中,創(chuàng)建了一個(gè) microsoft excel 實(shí)例,添加了一個(gè)新的工作簿。使用 foreach 語(yǔ)句顯示工作簿中每個(gè)工作表的名稱。此示例要求在運(yùn)行示例的機(jī)器上正確安裝 microsoft excel。
oExcel = Create("Excel.Application")
oExcel.Workbooks.Add
For Each oMyVar In oExcel.sheets
oMyVar.Name
Next oMyVar
*!* 60.雖然用APPEND From tx.Xls Type XL8可以更簡(jiǎn)單的追加數(shù)據(jù),但有時(shí)會(huì)導(dǎo)致程序非法錯(cuò)誤退出(除非先另存為Excel 5.0)
*!* 61.VFP控制EXCL文件另存為DBF(EXCEL后臺(tái)運(yùn)行)
fil=Thisform.List1.Value &&其值為一個(gè)包含路徑的文件名
oExcel=Createobject('Excel.application')
oExcel.Workbooks.Open(fil) &&打開文件
oExcel.Selection.AutoFilter &&關(guān)閉(如果無(wú)則打開)自動(dòng)篩選
oExcel.Range("A1:F1000").Select &&選中從第1行到1000行的前6列數(shù)據(jù)(另存后只有這些數(shù)據(jù))
asfil=Strtran(Upper(Strtran(fil,Substr(fil,1,Rat('\',fil)),'c:\windows\desktop\cphz\')),'.XLS','.dbf') &&要保存的文件名
If File(asfil)
Delete File &asfil
Endif
oExcel.ActiveWorkbook.SaveAs(asfil,8) &&另存為DBF
oExcel.ActiveWorkbook.saved=.T. &&不保存當(dāng)前EXCEL表
oExcel.Workbooks.Close &&關(guān)閉表
oExcel.Quit &&退出EXCEL
Release oExcel &&釋放變量
*************VFP中例子******************
lcFileName='D:\TEST.XLS'
oExcel=Createobject('Excel.application')
oExcel.Workbooks.Open('&lcFileName') &&打開文件
R=oExcel.SHEETS(1).UsedRange.Rows.Count &&有數(shù)據(jù)的總行數(shù)
C=oExcel.SHEETS(1).UsedRange.Columns.Count &&有數(shù)據(jù)的總列數(shù)
oExcel.Cells(R,C).Select &&選中數(shù)據(jù)
oExcel.Selection.NumberFormatLocal = "@" &&把被選定的單元格設(shè)為文本格式
oExcel.Columns.AutoFit &&讓所有的列寬都自動(dòng)調(diào)整
oExcel.DisplayAlerts=.F.
oExcel.ActiveWorkbook.SaveAs('D:\TEST.DBF',8) &&另存為DBF
*oExcel.ActiveWorkbook.SaveAs('D:\NewTest.xls',39) &&另存為5.0的Excel,或用43表示95/97格式
oExcel.ActiveWorkbook.saved=.T. &&不保存當(dāng)前EXCEL表
oExcel.Workbooks.Close &&關(guān)閉表
oExcel.Quit &&退出EXCEL
Release oExcel &&釋放變量
Messagebox('Excel文件:D:\TEST.XLS 另存為 D:\TEST.DBF 完成!',64,'信息提示')
***********VB例子*************
'功能:VB調(diào)用Excel,將一個(gè)Excel文件另存為Dbf。'
'前提:要安裝Excel'
Dim oExcel As Object
lcSFileName = "D:\test.xls" '源Excel文件名
lcDFileName = "D:\test1.dbf" '目標(biāo)Dbf文件名
Set oExcel = Createobject("Excel.Application") '創(chuàng)建Excel對(duì)象
oExcel.Workbooks.Open (lcSFileName) '打開Excel表
*R = oExcel.SHEETS(1).UsedRange.ROWS.Count '有數(shù)據(jù)的總行數(shù)
*C = oExcel.SHEETS(1).UsedRange.Columns.Count '有數(shù)據(jù)的總列數(shù)
*oExcel.Cells(R, C).Select '選中數(shù)據(jù)
*oExcel.Columns.AutoFit '讓所有的列寬都自動(dòng)調(diào)整
oExcel.DisplayAlerts = Flase '不顯示提示框
oExcel.ActiveWorkbook.SaveAs FileName:=lcDFileName, FileFormat:=8
oExcel.ActiveWorkbook.saved = Ture '不保存當(dāng)前EXCEL表
oExcel.Workbooks.Close '關(guān)閉表
oExcel.Quit '退出EXCEL
Set oExcel = Nothing '釋放對(duì)象
MsgBox ("Excel文件: " & lcSFileName & " 另存為 " & lcDFileName & " 完成!")
*!* 62.VFP用ADO連接Excel,然后將Excel內(nèi)容導(dǎo)出DBF的方法
*--以下代碼是將123.XLS中的SHEET5中的內(nèi)容轉(zhuǎn)換成RR.DBF
oConnection = Createobject("adodb.connection") &&建立連接對(duì)象
With oConnection
.ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\temp\123.xls;Extended Properties="excel 8.0;HDR=YES;IMEX=1;";Persist Security Info=False'
.Open
Endwith
oConnection.EXECUTE('select * into [dBase III;DataBase=d:\temp].rr from [sheet5$]')
oConnection.Close
*!* 63.設(shè)置打印參數(shù):
用Excel做報(bào)表,可打印時(shí)怎么選擇打印機(jī),即.ActiveWindow.SelectedSheets.PrintOut的參數(shù)有哪些?
Expression.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName)
Expression 必選。該表達(dá)式返回“應(yīng)用于”列表中的某個(gè)對(duì)象。
From Variant 類型,可選。打印的開始頁(yè)號(hào)。如果省略該參數(shù),將從起始位置開始打印。
To Variant 類型,可選。打印的終止頁(yè)號(hào)。如果省略該參數(shù),將打印至最后一頁(yè)。
Copies Variant 類型,可選。要打印的份數(shù)。如果省略該參數(shù),將只打印一份。
Preview Variant 類型,可選。如果為 True 則 Microsoft Excel 打印指定對(duì)象之前進(jìn)行打印預(yù)覽。如果為 False,或者省略此參數(shù)則立即打印該對(duì)象。
ActivePrinter Variant 類型,可選。 設(shè)置活動(dòng)打印機(jī)的名稱。
PrintToFile Variant 類型,可選。如果為 True 則打印輸出到文件。如果沒有指定 PrToFileName,則 Microsoft Excel 將提示用戶輸入要輸出文件的文件名。
Collate Variant 類型,可選。如果為 True 則逐份打印每份副本。
PrToFileName 可選,Variant 類型。如果將 PrintToFile 設(shè)置為 True,則本參數(shù)指定要打印到的文件名。
說(shuō)明
From 參數(shù)和 To 參數(shù)所描述的“頁(yè)”指的是要打印的頁(yè),并非指定工作表或工作簿中的全部頁(yè)。
*!* 64.如何用編程的方法打開有密碼的Excel文件?
*Excel文件加了密碼,如何在VFP中用編程的方式把密碼輸入,使Excel文件打開
oExcel=Createobject('Excel.application')
oExcel.Workbooks.Open("d:\22.xls")
這樣還有一個(gè)密碼的對(duì)話框出來(lái),需要輸入密碼才能打開文件。
*!* 65.如何用編程的方法直接打開有密碼的Excel文件?
oEle.Workbooks.Open("d:\22.xls",.F.,.F., ,"123","456")
"123"表示打開權(quán)限的密碼,
"456"表示修改權(quán)限的密碼.
*!* 66.如何將一個(gè)已知路徑的圖片插入到excel中.
oexcel1.ActiveSheet.PictureS.Insert("圖片文件名")
*!* 67.能不能指定在某一位置或區(qū)域放置圖片并控制圖片顯示大小呢?
OLEAPP.SHEETS(1).Select
oleapp.Range("位置").Select
oleapp.ActiveSheet.PictureS.Insert("圖片文件名")).Select
oleapp.Selection.ShapeRange.LockAspectRatio =.T.
oleapp.Selection.ShapeRange.Height = 57
*!* 68.類型為字符型的字段輸出到excel 中,前面的零被自動(dòng)去掉,例如“009877”變?yōu)?#8220;9877”,怎么解決?
1.在字符串前面加半角單引號(hào)“ ' ”,
例如:
o.Cells(1,1).Value="'0123"
或用變量
cString="'"+"0123" &&其中0123可以取自表中一個(gè)字段
o.Cells(1,1).Value=cString &&o.Range("A1:A1").value=cString
2.
oExcel.CELLS(1,1).Select &&或eole.Range("A1:E1").Select
oExcel.Selection.NumberFormatLocal = "@" &&把被選定的單元格設(shè)為文本格式
oExcel.Cells(1,1).Value="0123" &&給所選單元格覆值
*!* 69.在 Excel 中插入行和列 :
objExcel.Rows(1).Insert() &&在第一行前面插入一行
objExcel.Columns(2).Insert() &&在第二列前面插入一列
*!* 70.獲取 Excel 記錄數(shù)
loXls = Createobject("excel.application")
bookExcel = loXls.Application.Workbooks.Open("f:\pz.xls")
nrows=bookExcel.Worksheets('pz')
UsedRange =nrows.UsedRange
r=UsedRange.Rows.Count &&有數(shù)據(jù)的總行數(shù)
c=UsedRange.Columns.Count &&有數(shù)據(jù)的總列數(shù)
loXls.Workbooks.Close
loXls.Quit
*!* 71.在EXCEL中如何在打開文件的同時(shí)自動(dòng)執(zhí)行一個(gè)宏命令。
只要將宏的命名為 AUTO_OPEN 即可。
如果要在文件關(guān)閉時(shí)運(yùn)行,則命名為auto_close 。
*!* 72.在VFP中可以執(zhí)行EXCEL的選擇性粘貼嗎?
.Range("A2").PasteSpecial ("xlPasteValues") && 會(huì)出錯(cuò)
.Range("A2").PasteSpecial (3) && 也會(huì)出錯(cuò)
.Range("A2").PasteSpecial && 只好這樣了
*!* 73.如何才能只粘貼值呢?
xlPasteValues=-4163
oExcel.Range("A1").Select
oExcel.Selection.Copy
oExcel.Range("B1")._PasteSpecial(xlPasteValues)
*注意:在Excel 中,"xlPasteValues"是一個(gè)常量,它的值是一個(gè)數(shù)值型的:-4163
oExcel.Range("A1").Copy
oExcel.Range("B3").PasteSpecial(8) &&粘貼行、列寬
oExcel.Range("B3").PasteSpecial(-4122) &&粘貼格式
*!* 74.如何從excel讀取數(shù)據(jù)
*******建立一個(gè)excel對(duì)象*******
Local hb1 As excel.Application
csheetname=Trim(Thisform.text2.Value)&&讀取用戶要讀取excel的sheet名
***讀取數(shù)據(jù)源所在的EXCEL文件名****
If Empty(Trim(Thisformset.filepath))
Messagebox("請(qǐng)先選擇要導(dǎo)入的excel文件!",0,"提示")
Return
Endif
If Empty(Trim(csheetname))
Messagebox("請(qǐng)先選擇要導(dǎo)入的工作表sheet名稱!",0,"提示")
Return
Endif
Try
hb1=Createobject("excel.application")
Catch
Messagebox("請(qǐng)檢查你是否已安裝microsoft excel應(yīng)用程序!",0,"提示")
Endtry
***打開EXCEL對(duì)象,開始讀取數(shù)據(jù)********
HB1.workbooks.Open(Trim(Thisformset.filepath))
hb1.Sheets(csheetname).Select
Sele Store&&這是要讀取的數(shù)據(jù)存放的表
Zap
isend=.F. &&用于判斷是否記錄已到底
i=1
Do While isend=.F.
Append Blank
crq=Dtoc(drq)
cdh=hb1.Cells(i,1).Value
If Isnull(cdh)
cdh=""
Endif
**用于判斷數(shù)據(jù)類型,數(shù)據(jù)類型一定要判斷是否為NULL,**
** 然后如果不是指定的類型,還要進(jìn)行轉(zhuǎn)換*************
If Type("cdh")<>'C'
cdh=Alltrim(Str(cdh))
Endif
cdwmc=Trim(hb1.Cells(i,2).Value)
If Isnull(cdwmc)
cdwmc=""
Endif
cgg=hb1.Cells(i,3).Value
If Isnull(cgg)
cgg=""
Else
If Type("cgg")<>'C'
cgg=Alltrim(Str(cgg))
Endif
Endif
cjldw=hb1.Cells(i,4).Value
If Isnull(cjldw)
cjldw=""
Endif
cjldw=Iif(Type("jldw")<>"C",Alltrim(Str(cjldw)),Alltrim(cjldw))
nsl=hb1.Cells(i,5).Value
If Isnull(nsl)
nsl=0
Endif
cch=Trim(hb1.Cells(i,6).Value)
If Isnull(cch)
cch=''
Endif
cxh=hb1.Cells(i,8).Value
If Isnull(cxh)
cxh=""
Else
If Type("cxh")<>'C'
cxh=Trim(Str(cxh))
Else
cxh=Trim(cxh)
Endif
Endif
ccpmc=hb1.Cells(i,9).Value
If Isnull(ccpmc)
ccpmc=''
Endif
If Type("ccpmc")<>'C'
ccpmc=Alltrim(Str(ccpmc))
Else
ccpmc=Trim(ccpmc)
Endif
Select Store
Replace rq With crq,dh With cdh,dwmc With cdwmc,gg With cgg,jldw With cjldw,sl With nsl,ch With cch,cpbh With cxh,cpmc With ccpmc
i=i+1
&&如果一行全為空,記作記錄到底,如果中間存在多行的問題,我沒有做考慮****
If Empty(cxh) And nsl=0 And Empty(cch) And Empty(cjldw) And Empty(cdh) And Empty(cgg)
isend=.T.
Endif
Enddo
Dele &&最后一行為空行,刪除
Wait "共轉(zhuǎn)換得到"+Alltrim(Str(Reccount()))+"條記錄!" Window Timeout 2
hb1.Quit
*!* 75.本程序通過(guò)將原dbf表拷成excel格式,然后導(dǎo)入并設(shè)置報(bào)表格式
Para tablename
Local hb1 As excel.Application
Wait "正在導(dǎo)出數(shù)據(jù),請(qǐng)稍侯……" Window At 20,30 Timeout 1
bhaveerror=.F. &&定義一個(gè)變量判斷是否發(fā)生錯(cuò)誤
Try
hb1=Createobject("excel.application")
Catch
Messagebox("請(qǐng)檢查你是否已安裝microsoft excel應(yīng)用程序!",0,"提示")
bhaveerror=.T.
Endtry
If bhaveerror=.T.
Return
Endif
If Right(curr_path,1)<>'\'
curr_path=curr_path+"\"
Endif
ctablename=tablename+"_excel"
filepath=curr_path+"temp\sheet1.xls"
*filepath="temp\sheet1.xls"
If !File(filepath)
Messagebox("數(shù)據(jù)源的excel文件未生成,報(bào)表生成被終止!")
Return
Endif
HB1.workbooks.Open(filepath)
HB1.SHEETS("sheet1").Select
hb1.sheets(1).Rows(1).entirerow.Insert
hb1.sheets(1).Rows(1).entirerow.Insert
Sele (ctablename)
nfieldcount=Fcount()
nreccount=Reccount()
hbdygs="A1:"+Chr(nfieldcount+64)+"2"
HB1.Range(hbdygs).Select
****合并兩行作為報(bào)表標(biāo)題*************
HB1.Selection.HorizontalAlignment = 3 &&水平方向 2左對(duì)齊,3居中,4右對(duì)齊
HB1.Selection.VerticalAlignment = 2 &&垂直方向 1靠上,2居中,3靠下
HB1.Selection.WrapText = .F. && ??
HB1.Selection.Orientation = 0 && ??
HB1.Selection.AddIndent = .F. && ??
HB1.Selection.ShrinkToFit = .F. && ??
HB1.Selection.MergeCells = .T. && ??
HB1.Range(hbdygs).FormulaR1C1 = "請(qǐng)輸入報(bào)表標(biāo)題"
HB1.Range(hbdygs).Characters.Font.Name = "隸書"
HB1.Range(hbdygs).Characters.Font.FontStyle = "常規(guī)"
HB1.Range(hbdygs).Characters.Font.ColorIndex = 1 &&字符顏色
***根據(jù)數(shù)據(jù)源表結(jié)構(gòu)的寬度設(shè)置列的寬度********
Copy Stru Exte To temp\term_stru
Sele 0
Use temp\term_stru
Select (ctablename)
For i=1 To nfieldcount
cvalue=Allt(Field(i))
Select term_stru
Loca For Lower(Allt(field_name))==cvalue
If Found()
columnname=Chr(i+64)+":"+Chr(i+64)
hb1.Columns(columnname).ColumnWidth=field_len
Endif
Sele (ctablename)
Endfor
Sele term_stru
Use
activecellname=Chr(nfieldcount+64)+Allt(Str(nreccount+3))
*************設(shè)置數(shù)據(jù)區(qū)域的字體格式***************
HB1.Range("A3:"+activecellname).Characters.Font.Name = "宋體"
HB1.Range("A3:"+activecellname).Characters.Font.Size= 9
HB1.Range("A3:"+activecellname).Select
hb1.Selection.BorderS(1).LineStyle = .T.
hb1.Selection.BorderS(2).linestyle = .T.
hb1.Selection.BorderS(3).linestyle = .T.
hb1.Selection.BorderS(4).linestyle = .T.
hb1.ActiveWorkbook.SaveAs("c:\aa.xls")
hb1.Application.Visible=.T.
* HB1.ACTIVEWORKBOOK.SAVE &&自動(dòng)保存數(shù)據(jù)
* HB1.ACTIVEWORKBOOK.CLOSE &&關(guān)閉當(dāng)前工作簿
* HB1.QUIT
*!* 76.如何修改sheet工作表名:
EFILENAME='D:\TEST\TEMPA.XLS'
oExcel=Createobject("Excel.application")
oExcel.Workbooks.Open("&EFILENAME")
oExcel.Visible=.T.
oExcel.Worksheets("Sheet2").Select
oExcel.Worksheets("Sheet2").Name='NewSheet' &&這里的NewSheet為新的名字。
*!* 77.復(fù)制Sheet工作表
EFILENAME='D:\你的Excel表名.XLS'
oExcel=Createobject("Excel.application")
oExcel.Workbooks.Open("&EFILENAME")
oExcel.Visible=.T.
oExcel.SHEETS(1).Select
oExcel.SHEETS(1).Copy(Null,oExcel.SHEETS(1)) &&&&把第1個(gè)工作表復(fù)制到第1個(gè)工作表之后
oExcel.SHEETS(2).Name='NewSheetName' &&設(shè)置第2個(gè)工作表名稱
*!*oExcel.SHEETS(1).COPY(oExcel.SHEETS(1),NULL) &&&&把第1個(gè)工作表復(fù)制到第1個(gè)工作表之前
*!*oExcel.SHEETS(1).NAME='NewSheetName' &&設(shè)置第1個(gè)工作表名稱
*!* 78.如何將DBF中內(nèi)容COPY到EXCEL的指定區(qū)域
例如我有一個(gè)DBF:
Name_F Sl_f
Mike 546
kyle 200
想將這個(gè)內(nèi)容轉(zhuǎn)到EXCEL里面的E1:F2區(qū)域!
Use 表名
_vfp.DataToClip('表名',Reccount(),3) &&將一組記錄作為文本復(fù)制到剪貼板上,3使用制表符分隔字段。
oexl=Createobject('excel.application') &&創(chuàng)建電子表格
oexl.Visible=.T. &&使電子表格可見
oexl.workbooks.Add &&創(chuàng)建工作簿
With oexl
.Range("E1:F2").Select &&根據(jù)你的表中的記錄數(shù)和字段數(shù)調(diào)整此項(xiàng)中的'F2'
.ActiveSheet.Paste
Endwith
*!* 79.VFP調(diào)用EXCEL查詢打印示例
EFILENAME='查詢打印.XLS'
*LOCAL oExcel
oExcel=Createobject("Excel.application")
oExcel.Workbooks.Open("&EFILENAME")
oExcel.Caption="VFP應(yīng)用程序調(diào)用Microsoft Excel"
oExcel.Worksheets("查詢打印").Activate
oExcel.Visible=.T.
nRows=oExcel.Worksheets('查詢打印').UsedRange.Rows.Count
nColumns=oExcel.Worksheets('查詢打印').UsedRange.Columns.Count
oExcel.Range(oExcel.Cells(1,1),oExcel.Cells(nRows,nColumns)).BorderS.LineStyle=1
oExcel.Range(oExcel.Cells(1,1),oExcel.Cells(nRows,nColumns)).HorizontalAlignment=3 &&水平(1-默認(rèn)、2-靠左、3-居中、4-靠右、5-填充、6=兩端對(duì)齊、7=跨列居中、8=分散對(duì)齊)
oExcel.Range(oExcel.Cells(1,1),oExcel.Cells(nRows,nColumns)).VerticalAlignment=2 &&垂直(1=靠上、2=居中、3=靠下、4=兩端對(duì)齊、5=分散對(duì)齊)
oExcel.ActiveSheet.PageSetup.RightFooter="第&P頁(yè) / 共&N頁(yè)"
oExcel.ActiveSheet.PageSetup.TopMargin=2/0.035 &&設(shè)置頂邊距為2厘米
oExcel.ActiveSheet.PageSetup.BottomMargin=2/0.035 &&設(shè)置左邊距為2厘米
oExcel.ActiveSheet.PageSetup.HeaderMargin=1/0.035 &&設(shè)置頁(yè)眉到頂端邊距為1厘米
oExcel.ActiveSheet.PageSetup.FooterMargin=1/0.035 &&設(shè)置頁(yè)腳到底邊距為1厘米
oExcel.ActiveSheet.PageSetup.LeftMargin=2/0.035 &&設(shè)置左邊距為2厘米
oExcel.ActiveSheet.PageSetup.RightMargin=2/0.035 &&設(shè)置右邊距為2厘米
oExcel.ActiveSheet.PageSetup.CenterHorizontally=.T. &&設(shè)置頁(yè)面水平居中
oExcel.ActiveSheet.PageSetup.CenterVertically=.T. &&設(shè)置頁(yè)面垂直居中
oExcel.ActiveSheet.PageSetup.Zoom=90 &&縮放90%
oExcel.Cells.Select
oExcel.Cells.EntireColumn.AutoFit
oExcel.Selection.AutoFilter
oExcel.ActiveSheet.Rows(1).Insert
oExcel.Range("A2:BB2").RowHeight=37.5
oExcel.Range("A2:BB2").WrapText=.T.
oExcel.ActiveSheet.Columns(1).ColumnWidth=3
oExcel.ActiveSheet.Columns(1).ColumnWidth=4
oExcel.Range("A2:BB2").RowHeight=12.5
*oExcel.RANGE("M1").VALUE='統(tǒng)計(jì)月份:'+ALLTRIM(STR(YEAR(KKS_DATE1)))+'年'+ALLTRIM(STR(MONTH(KKS_DATE1)))+'月 - '+ALLTRIM(STR(YEAR(KKE_DATE1)))+'年'+ALLTRIM(STR(MONTH(KKE_DATE1)))+'月'
oExcel.ActiveSheet.PageSetup.CenterHeader="&20部 門 出 勤 統(tǒng) 計(jì) 表"
oExcel.ActiveSheet.PageSetup.CenterFooter="單位領(lǐng)導(dǎo):"
oExcel.ActiveSheet.PageSetup.LeftFooter="打印時(shí)間:&D - &T"
oExcel.Selection.AutoFilter
oExcel.ActiveSheet.Range('B2').Select
oExcel.ActiveSheet.PageSetup.PrintTitleRows="$1:$1"
oExcel.ActiveSheet.PageSetup.Orientation=2 && 1:縱向打印 2:橫向打印
oExcel.ActiveWorkbook.Save
*!* 80.Excel報(bào)表巧生成
巧讓FoxPro數(shù)據(jù)生成Excel報(bào)表
Visual FoxPro是應(yīng)用廣泛的前臺(tái)數(shù)據(jù)庫(kù)開發(fā)平臺(tái)之一,因此在我們?nèi)粘9ぷ髦袝r(shí)常會(huì)遇到DBF數(shù)據(jù)文件。然而隨著辦公自動(dòng)化的普及,越來(lái)越多的時(shí)候需要將DBF文件轉(zhuǎn)化為Excel電子文檔。常用轉(zhuǎn)化方法是在FoxPro中用Copy命令進(jìn)行格式轉(zhuǎn)化或直接用Excel打開DBF文件。這兩種方式雖然都能達(dá)到目的,卻不能得到格式規(guī)范、可以直接打印輸出的報(bào)表,且輸出的Excel文件中,無(wú)法對(duì)數(shù)據(jù)類型進(jìn)行有效轉(zhuǎn)換,極易出現(xiàn)數(shù)據(jù)統(tǒng)計(jì)錯(cuò)誤。有沒有更好的方法呢?這里有一個(gè)更加通用的方法,在VFP中調(diào)用Excel,可以由DBF文件直接生成格式如下圖所示一樣復(fù)雜的Excel報(bào)表(如圖1)。 Excel報(bào)表
具體過(guò)程如下:
編輯推薦文章
● 新鮮接觸Excel 2000 XP
● Excel 2000公式應(yīng)用的幾條經(jīng)驗(yàn)
● Excel 2000函數(shù)應(yīng)用之信息函數(shù)
假設(shè)我們要將表Agcallop.dbf文件輸出為Excel格式文檔,報(bào)表形如圖1所示。為使通用性更強(qiáng),頁(yè)面采用A4紙橫向輸出,默認(rèn)字體為宋體10號(hào),頁(yè)腳處添加頁(yè)號(hào)。
部分程序代碼如下:
m.outfilename=Putfile('輸出結(jié)果','agcallop','xls')
&&取導(dǎo)出文件名稱
ef=Createobject('Excel.application')
&&調(diào)用Excel程序
ef.Workbooks.Add
&&添加工作簿
ef.Worksheets("sheet1").Activate
&&激活第一個(gè)工作表
ef.Visible=.T.
&&顯示Excel界面
ef.Cells.Select
&&選擇整張表
ef.Selection.Font.Size = 10
&&設(shè)置整表默認(rèn)字體大小為10
Select 0
Use agcallop
&&選擇被導(dǎo)出的表
num=Reccount()
&&求導(dǎo)出總記錄數(shù)
Go Top
i=5
ef.Range("F1:K1").Select
&&選擇標(biāo)題欄所在單元格
ef.Selection.Merge
&&合并單元格
With ef.Range("F1 ")
&&設(shè)置標(biāo)題及字體屬性
.Value='客戶服務(wù)部業(yè)務(wù)代表工作量情況統(tǒng)計(jì)表'
.Font.Name="黑體"
.Font.Size=18
Endwith
ef.Rows(2).RowHeight=1/0.035
&&設(shè)置第二行高度為1cm
ef.Range("H2:O2").Select
&&選定統(tǒng)計(jì)條件欄所在單元格
ef.Selection.Merge
&&合并單元格
ef.Range("H2").Font.Size=10
ef.Range("H2").HorizontalAlignment=4
&&設(shè)置內(nèi)容對(duì)齊方式為右對(duì)齊,3為居中,4為右對(duì)齊
ef.Range("H2").Value='統(tǒng)計(jì)時(shí)間:'+Dtoc(Date())+' 打印日期:'+Dtoc(Date())
ef.Rows("3:4").Select
With ef.Selection
.HorizontalAlignment = 3
&&設(shè)置3、4行為水平對(duì)齊
.VerticalAlignment = 2
&&垂直居中
.NumberFormatLocal = "@"
&&設(shè)置3、4行為字符型內(nèi)容
Endwith
ef.Range("A3:A4").Select
ef.Selection.Merge
&&縱向合并第一列3、4行
ef.Range("A3").Value='工號(hào)'
&&設(shè)置第一列標(biāo)題內(nèi)容
ef.Columns("A").Select
&&整列選擇
ef.Selection.HorizontalAlignment = 3
&&水平居中
ef.Columns("A:B").Select
ef.Selection.NumberFormatLocal = "@"
&&設(shè)置A、B列為字符型內(nèi)容
ef.Range("B3:B4").Select
ef.Selection.Merge
&&縱向合并第二列3、4行
ef.Range("B3").Value='姓名'
&&設(shè)置第二列標(biāo)題內(nèi)容
ef.Columns("B").Select
&&整列選擇
ef.Selection.HorizontalAlignment = 3
&&水平居中
ef.Range("C3:E3").Select
&&橫向合并第三行C-E列
ef.Selection.Merge
ef.Range("C3").Value='話務(wù)總量'
&&第三行大標(biāo)題為“話務(wù)總量”的列
ef.Range("C4").Value='電話呼入量'
&&“話務(wù)總量”下第1個(gè)小標(biāo)題“電話呼入量”
ef.Range("D4").Value='電話呼出量'
&&“話務(wù)總量”下第2個(gè)小標(biāo)題“電話呼出量”
ef.Range("E4").Value='合 計(jì)'
&&“話務(wù)總量”下第3個(gè)小標(biāo)題“合計(jì)”
ef.Range("F3:H3").Select
ef.Selection.Merge
ef.Range("F3").Value='話務(wù)總時(shí)間'
ef.Range("F4").Value='呼入時(shí)間'
ef.Range("G4").Value='呼出時(shí)間'
ef.Range("H4").Value='合 計(jì)'
ef.Range("I3:K3").Select
ef.Selection.Merge
ef.Range("I3").Value='單個(gè)話務(wù)平均時(shí)間'
ef.Range("I4").Value='呼入時(shí)間'
ef.Range("J4").Value='呼出時(shí)間'
ef.Range("K4").Value='合 計(jì)'
ef.Range("L3:L4").Select
ef.Selection.Merge
ef.Range("L3").Value='累計(jì)工作時(shí)間'
ef.Range("M3:M4").Select
ef.Selection.Merge
ef.Range("M3").Value='無(wú)效時(shí)間'
ef.Range("N3:N4").Select
ef.Selection.Merge
ef.Range("N3").Value='錄入量'
ef.Range("O3:O4").Select
ef.Selection.Merge
ef.Range("O3").Value='有效時(shí)間比'
接下來(lái)通過(guò)scan語(yǔ)句,依次為每一行每一列單元格賦值。為了獲得更好的打印效果,還需進(jìn)行頁(yè)面設(shè)置,如標(biāo)題行、頁(yè)面居中、橫向排版等,還可以加邊框線。
以上程序在VFP 6+Excel 2000+Windows 2000下調(diào)試通過(guò)。實(shí)際應(yīng)用中可根據(jù)需要對(duì)各項(xiàng)參數(shù)設(shè)置進(jìn)行相應(yīng)調(diào)整。
*!* 81.實(shí)用的VFP與EXCEL交互編程
摘要:本文介紹了幾種實(shí)用的VFP與EXCEL交互編程的方法與實(shí)例,將VFP強(qiáng)大的數(shù)據(jù)處理功能與EXCEL優(yōu)異的制表功能有機(jī)地結(jié)合起來(lái),大大增強(qiáng)了軟件的應(yīng)用效果。
關(guān)鍵詞:VFP、EXCEL、DDE、OLE、交互編程。
Some Cross_Programming Methods Between VFP And EXCEL
Zou yiming(Gansu Lanzhou Section Of Instruments Lanzhou Petrochemical Staff College)
Abstract: The author introduces us In This Paper Some practical methods And instance Of cross_programming Between VFP And EXCEL . It extremely improves their performances By combining VFP's data processing functions with EXCEL's excellent tabulation functions.
Key Words: VFP、EXCEL、OLE、DDE、Cross-Programming
VFP(Visual Foxpro)是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由于其強(qiáng)大的數(shù)據(jù)處理能力及良好的兼容性,使其成為數(shù)據(jù)庫(kù)應(yīng)用程序開發(fā)人員的強(qiáng)有力工具,而EXECL則是一種優(yōu)秀的電子表格處理軟件,在兼容性、操作界面、公式運(yùn)算、圖表等方面有著獨(dú)到的優(yōu)勢(shì)。上述兩種軟件在各自的應(yīng)用領(lǐng)域均得到廣泛的應(yīng)用,同時(shí)上述兩種軟件還具有良好的交互編程能力,為兩者相輔相成、取長(zhǎng)補(bǔ)短奠定了良好的基礎(chǔ)。
本文將結(jié)合具體實(shí)例介紹幾種VFP與EXCEL交互編程的方法,每種方法雖然實(shí)現(xiàn)手段各異,但功能相仿。其功能可簡(jiǎn)述如下:VFP數(shù)據(jù)表“學(xué)生成績(jī)表.DBF”中含“學(xué)生姓名”、“語(yǔ)文”、“數(shù)學(xué)”......等字段,示例程序?qū)腅XCEL工作簿“VFP交互.XLS”之工作表“查詢”中用書簽“課程名”指定的單元取得欲查詢的課程名稱,然后在數(shù)據(jù)表“學(xué)生成績(jī)表.DBF”中自動(dòng)搜索,以找到該門課程不及格的同學(xué)名單,最后傳送至原EXCEL工作薄形成新的工作表單,同時(shí),新工作表還將以該課程名命名。
下列程序均在VFP5.0與EXCEL97中調(diào)試通過(guò)。因篇幅所限,程序中的錯(cuò)誤處理部分略去。
一、EXECL驅(qū)動(dòng)VFP
EXECL內(nèi)置的VBA語(yǔ)言(Visual Basic For Application)為EXECL功能的擴(kuò)展提供了便利的手段,用戶可使用該語(yǔ)言直接驅(qū)動(dòng)VFP完成數(shù)據(jù)檢索等功能。
程序首先生成一個(gè)VFP對(duì)象,然后用VFP的DoCmd方法執(zhí)行VFP摸索命令串,其摸索結(jié)果再借助于VFP的DateToClip方法拷貝至剪切板,最后VBA將其粘貼至工作表的正確位置。
Sub FoxTest()
Dim oFox As Object
Dim SLesson As String
Dim SCommand As String
Set oFox = Createobject("VisualFoxPro.Application") '啟動(dòng)VFP,生成VFP對(duì)象
Sheets("查詢").Select
SLesson = Range("課程名") '在名為“課程名”的單元格中得到欲查詢的課程名稱
Sheets.Add '產(chǎn)生新的工作表單
ActiveSheet.Name = Slesson '指定工作表單的名稱與課程名稱相同
SCommand = "SELECT 學(xué)號(hào),語(yǔ)文,數(shù)學(xué) FROM d:\vfp\學(xué)生成績(jī)表 WHERE "+ SLesson + "<60 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
為便于使用,作者在EXECL中自制了一名為“搜索”的工具欄及一名為“開始搜索”的按鈕,并將上述宏程序段與自制按鈕相關(guān)聯(lián),按下此按鈕即可運(yùn)行程序并在EXCEL中得到要求的數(shù)據(jù)。
制作工具欄及按鈕的方法如下:
1. 選“工具”/“自定義”菜單,出現(xiàn)自定義對(duì)話框;
2. 選擇“工具欄”頁(yè)框,然后按下“新建”按鈕;
3. 在工具欄對(duì)話框中輸入“搜索”作為新建工具欄的名稱;
4. 選擇“命令”頁(yè)框,在“類別”列表中選“宏”,在“命令”列表中選“自定義按鈕”并將其拖放至新建的“搜索”工具欄;
5. 按下“更新所選內(nèi)容”按鈕,首先在“命名”欄中填入按鈕名稱“開始搜索”,然后選擇“指定宏”,在隨后出現(xiàn)的“指定宏”列表中選擇上述宏程序FoxTest()即可實(shí)現(xiàn)為該宏指定一個(gè)工具欄按鈕。
二、VFP使用OLE功能驅(qū)動(dòng)EXECL
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生成新的工作表,VFP的查詢結(jié)果仍然使用剪切板的方式傳遞至EXCEL工作表。
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工作簿
Do While .T.
With OleApp.Application
nAnswer = Messagebox("開始搜索?", 32+4, "搜索指定數(shù)據(jù)") &&產(chǎn)生信息框
If (.Not.(nAnswer=6)) && 如按下“Yes"按鈕,則開始搜索,反之退出
Exit
Endif
.Sheets("查詢").Select && 選擇“查詢”工作表單
SLesson = OleApp.Application.Range("課程名").Value && 得到欲查詢的課程名稱
.Sheets.Add && 新建一工作表單
.ActiveSheet.Name = Slesson && 指定工作表單的名稱
SCommand = "SELECT 學(xué)號(hào),語(yǔ)文,數(shù)學(xué) FROM d:\vfp\學(xué)生成績(jī)表 WHERE " +Alltrim(SLesson) + "<60 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,保存更新后的工作簿文件
*!* 82.在VFP中Disabled/Enabled EXCEL中的菜單項(xiàng)及按鈕
有時(shí)需要在VFP中控制EXCEL中的按鈕及菜單項(xiàng),以達(dá)到由VFP控制XLS文檔的目的??梢钥刂芚LS文
檔不能復(fù)制、不能另存、不能打印、不能以附檔的形式發(fā)郵件。結(jié)合陸老師的在通用字段中存放文檔
的思路,完全可以用VFP開發(fā)文檔發(fā)布系統(tǒng),可以發(fā)布公司的守則、公告、管理辦法、機(jī)密資料、圖
片資料等而不用擔(dān)心用戶復(fù)制、打印、以郵件傳播資料。
XLS中各個(gè)菜單項(xiàng)或按鈕都有唯一的ID或序號(hào),本例是利用序號(hào)來(lái)控制的(利用ID也可以控制)。
對(duì)象大多只有三層,對(duì)應(yīng)的控制方法是:
對(duì)象.CommandBars(第一層序號(hào)).Controls(第二層序號(hào)).accChild(第二層序號(hào)).屬性=值
本例僅列出菜單項(xiàng)的部分控制,其它菜單項(xiàng)或按鈕的序號(hào)可以程序取得,此程序參考本文章開頭第40條
oXLS=Createobject('excel.application')
oXLS.Workbooks.Add
oXLS.Visible=.T.
1、工作表功能表列(Name:Worksheet Menu Bar Id:1) &&禁用/不可見系統(tǒng)菜單
oxls.commandbars(1).Enabled=.F.
1、檔案(Id:30002) &&禁用菜單中的“檔案”項(xiàng) oXLS.commandbars(1).controls(1).enabled=.f.
12、打印... (ID:4) &&禁用“檔案”菜單下的“打印”項(xiàng)
oXLS.CommandBars(1).Controls(1).accChild(18).Enabled=.F.