VFP和Excel都可以用來進行處理數(shù)據(jù)庫表格,如果巧妙地將二者的優(yōu)點結合起來,,將會大大方便我們的工作,。比如我們可以利用VFP進行處理數(shù)據(jù),而利用Excel的預覽打印功能進行報表打印,。這就需要我們在VFP中直接來控制Excel,。下面就在開發(fā)VFP應用項目時對Excel的控制作一下介紹:
*!* 1.創(chuàng)建Excel對象 oExcel=Createobject("Excel.application") *!* 2.添加新工作簿 oExcel.Workbooks.Add *!* 3.設置第3個工作表為激活工作表
oExcel.Worksheets("sheet3").Activate *!* 4.打開指定工作簿
oExcel.Workbooks.Open("c:\temp\ll.xls") *!* 5.顯示Excel窗口
oExcel.Visible=.T. *!* 6.更改Excel標題欄
oExcel.Caption="VFP應用程序調(diào)用Microsoft Excel" *!* 7.給單元格賦值
oExcel.cells(1,4).Value=XM(XM為數(shù)據(jù)庫字段名) *!* 8.設置指定列的寬度(單位:字符個數(shù))
oExcel.ActiveSheet.Columns(1).ColumnWidth=5 *!* 9.設置指定行的高度(單位:磅)
oExcel.ActiveSheet.Rows(1).RowHeight=1 (設定行高為1磅,1磅=0.035厘米) oExcel.ActiveSheet.Rows("50:100").RowHeight=1 &&設置第50行至100行的高度 *!* 10.在第18行之前插入分頁符
oExcel.Worksheets("Sheet1").Rows(18).PageBreak=1 *!* 11.在第4列之前刪除分頁符
oExcel.ActiveSheet.Columns(4).PageBreak=0 *!* 12.指定邊框線寬度(Borders參數(shù)如下)
ole.ActiveSheet.Range("b3:d3").BorderS(2).Weight=3 *!* 13.設置四個邊框線條的類型
oExcel.ActiveSheet.Range("b3:d3").BorderS(2).LineStyle=1 (其中Borders參數(shù):1-左,、2-右,、3-頂、4-底,、5-斜,、6-斜/;LineStyle值:1與7-細實、2-細虛,、4-點虛、9-雙細實線) *!* 14.設置頁眉
oExcel.ActiveSheet.PageSetup.CenterHeader="報表1" *!* 15.設置頁眉(字體大小)
oExcel.ActiveSheet.PageSetup.CenterHeader="&50報表1" &&'&'后面的50可以自定義,,表示字體的大小 *!* 16.設置頁腳
oExcel.ActiveSheet.PageSetup.CenterFooter="第&P頁" *!* 17.設置頁腳(字體大小)
oExcel.ActiveSheet.PageSetup.CenterFooter="&28第&P頁" &&'&'后面的28可以自定義,,表示字體的大小 *!* 18.設置頁眉到頂端邊距為2厘米
oExcel.ActiveSheet.PageSetup.HeaderMargin=2/0.035 *!* 19.設置頁腳到底邊距為3厘米
oExcel.ActiveSheet.PageSetup.FooterMargin=3/0.035 *!* 20.設置頂邊距為2厘米
oExcel.ActiveSheet.PageSetup.TopMargin=2/0.035 *!* 21.設置底邊距為4厘米
oExcel.ActiveSheet.PageSetup.BottomMargin=4/0.035 *!* 22.設置左邊距為2厘米
oExcel.ActiveSheet.PageSetup.LeftMargin=2/0.035 *!* 23.設置右邊距為2厘米
oExcel.ActiveSheet.PageSetup.RightMargin=2/0.035 *!* 24.設置頁面水平居中
oExcel.ActiveSheet.PageSetup.CenterHorizontally=.T. *!* 25.設置頁面垂直居中
oExcel.ActiveSheet.PageSetup.CenterVertically=.T. *!* 26.設置頁面紙張大小(1-窄行8511 39-寬行1411 9:A4)
oExcel.ActiveSheet.PageSetup.Papersize=1 *!* 27.打印單元格網(wǎng)線
oExcel.ActiveSheet.PageSetup.PrintGridlines=.T. *!* 28.拷貝整個工作表
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.設置字體
oExcel.ActiveSheet.Cells(2,1).Font.Name="黑體" *!* 34.設置字體大小
oExcel.ActiveSheet.Cells(1,1).Font.Size=25 *!* 35.設置字體為斜體
oExcel.ActiveSheet.Cells(1,1).Font.Italic=.T. *!* 36.設置整列字體為粗體
oExcel.ActiveSheet.Columns(1).Font.Bold=.T. *!* 37.清除單元格公式
oExcel.ActiveSheet.Cells(1,4).ClearContents *!* 38.打印預覽工作表
oExcel.ActiveSheet.PrintPreview *!* 39.打印輸出工作表
oExcel.ActiveSheet.PrintOut *!* 40. oExcel.CommandBars(1).Controls(1).accChild(18).Execute &&打印(菜單序號18為Excel2003的‘打印’項)
&&不同版本Excel的菜單序號可以通過以下程序取得 *(需要在VFP7.0以上運行) 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") *檢測當前目錄是否有同名的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)保存對話框 oExcel.ActiveWorkbook.saved=.T. *!* 43.存盤
oExcel.ActiveWorkbook.Save *!* 44.關閉工作簿
oExcel.Workbooks.Close objexcel.activeworkbook.Close(.F.) *!* 45.退出Excel
oExcel.Quit Release oExcel &&只有釋放對象變量, EXCEL進程才會完全關閉 *!* 46.合并單元格
oExcel.ActiveSheet.Range("A4:B5").MergeCells=.T. *!* 47.下列設置大家自己理解
With crfole.ActiveSheet.PageSetup .LeftHeader = Chr(13)+"左頁眉" .CenterHeader = "中頁眉" .RightHeader = "右頁眉" .LeftFooter = "左頁腳" .CenterFooter = "中頁腳" .RightFooter = "右頁腳" .Orientation=1 &&1豎排,2橫排 Endwith With crfole.Range("A4:C4") .MergeCells = .T. .WrapText =.F. .Orientation = 0 .AddIndent =.F. .ShrinkToFit = .F. Endwith *!* 48.文本對齊
oExcel.Range("A4:c4").HorizontalAlignment =1 &&水平(1-默認,、2-靠左,、3-居中、4-靠右,、5-填充,、6=兩端對齊、7=跨列居中,、8=分散對齊) oExcel.Range("A4:c4").VerticalAlignment =2 &&垂直(1=靠上,、2=居中、3=靠下,、4=兩端對齊,、5=分散對齊) *!* 49.拷貝整個工作表(含格式)
oExcel.activesheet.cells.Copy &&拷貝 oExcel.sheets(1).Select &&選擇第一工作表 oExcel.ActiveSheet.Paste &&粘貼 oExcel.ActiveSheet.Cells(3,4).Value && ActiveSheet 為當前的Sheet工作薄名字,Cells(3,4).value 為第3行第4列的值 *以上控制調(diào)用語句在中文VFP5.0企業(yè)版下運行通過,,運行環(huán)境為Excel 97及中文Windows 98 *!* 50.顯示某個單元格的批注內(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" &&每頁都打印行標頭(每頁頂部出現(xiàn)的單元格的行)
*!* 52.保護工作表:
oExcel.ActiveSheet.Protect('密碼',.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.) *!* 53.保護工作薄
oExcel.ActiveWorkbook.Protect('密碼',.T.,.T.) 第一個.T.:保護工作簿結構 第二個.T.:保護工作簿窗口 *!* 54.設置允許用戶編輯區(qū)域
oExcel.ActiveSheet.Protection.AllowEditRanges.Add("區(qū)域3",oExcel.ActiveSheet.Range("A2:D5")) *!* 55.如果不想在宏運行時被無窮無盡的提示和警告消息所困擾,,就將本屬性設置為.F.
oExcel.DisplayAlerts = .F. 如果不想在宏運行時被無窮無盡的提示和警告消息所困擾,就將本屬性設置為 False,;這樣每次出現(xiàn)需用戶應答的消息時,,Microsoft Excel 將選擇默認應答。 如果將本屬性設置為 False,,那么宏運行結束后,, Microsoft Excel 并不自動將其設置回 True。故當宏運行結束后,,都應將本屬性設置回 True 值,。 *!* 56.將當前工作表中的已用區(qū)域(只讀)存入數(shù)組。
strPath='D:\TEST\123.xls' Local oExcel oExcel=Createobject("Excel.Application") oExcel.WorkBooks.Open(strPath) arrTableInfo=oExcel.ActiveSheet.UsedRange.Value &&將當前工作表中的已用區(qū)域(只讀)存入數(shù)組,。 oExcel.Quit Release oExcel Insert Into 表名 From arrTableInfo *!* 57.設置excel批注的字體(excel 2000實現(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 則出錯,不知為何,! *!* 58.如何取得當前EXCEL表中工作表的數(shù)目及各工作表的名稱,?
Clear Local lnSheetCount oExcel=Createobject("EXCEL.APPLICATION") &&創(chuàng)建Excel對象 oExcel.WORKBOOKS.Open("c:\111\321.xls") &&打開指定工作簿 With oExcel lnSheetCount=.WorkBooks(1).Sheets.Count &&統(tǒng)計工作表數(shù)量 Endwith '當前EXCEL表中工作表的數(shù)目為:'+Alltrim(Str(lnSheetCount)) For Each oMyVar In oExcel.sheets '當前EXCEL表中工作表的名稱分別為'+oMyVar.Name &&顯示Excel表中所有工作表 Next oMyVar oExcel.WORKBOOKS.Close &&關閉工作簿 oExcel.Quit &&退出Excel *!* 59.獲取工作表名稱
在以下示例中,創(chuàng)建了一個 microsoft excel 實例,,添加了一個新的工作簿,。使用 foreach 語句顯示工作簿中每個工作表的名稱。此示例要求在運行示例的機器上正確安裝 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可以更簡單的追加數(shù)據(jù),,但有時會導致程序非法錯誤退出(除非先另存為Excel 5.0)
*!* 61.VFP控制EXCL文件另存為DBF(EXCEL后臺運行)
fil=Thisform.List1.Value &&其值為一個包含路徑的文件名 oExcel=Createobject('Excel.application') oExcel.Workbooks.Open(fil) &&打開文件 oExcel.Selection.AutoFilter &&關閉(如果無則打開)自動篩選 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. &&不保存當前EXCEL表 oExcel.Workbooks.Close &&關閉表 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 = "@" &&把被選定的單元格設為文本格式 oExcel.Columns.AutoFit &&讓所有的列寬都自動調(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. &&不保存當前EXCEL表 oExcel.Workbooks.Close &&關閉表 oExcel.Quit &&退出EXCEL Release oExcel &&釋放變量 Messagebox('Excel文件:D:\TEST.XLS 另存為 D:\TEST.DBF 完成,!',64,'信息提示') ***********VB例子************* '功能:VB調(diào)用Excel,,將一個Excel文件另存為Dbf。' '前提:要安裝Excel' Dim oExcel As Object lcSFileName = "D:\test.xls" '源Excel文件名 lcDFileName = "D:\test1.dbf" '目標Dbf文件名 Set oExcel = Createobject("Excel.Application") '創(chuàng)建Excel對象 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 '讓所有的列寬都自動調(diào)整 oExcel.DisplayAlerts = Flase '不顯示提示框 oExcel.ActiveWorkbook.SaveAs FileName:=lcDFileName, FileFormat:=8 oExcel.ActiveWorkbook.saved = Ture '不保存當前EXCEL表 oExcel.Workbooks.Close '關閉表 oExcel.Quit '退出EXCEL Set oExcel = Nothing '釋放對象 MsgBox ("Excel文件: " & lcSFileName & " 另存為 " & lcDFileName & " 完成,!") *!* 62.VFP用ADO連接Excel,然后將Excel內(nèi)容導出DBF的方法
*--以下代碼是將123.XLS中的SHEET5中的內(nèi)容轉(zhuǎn)換成RR.DBF oConnection = Createobject("adodb.connection") &&建立連接對象 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ù):
用Excel做報表,,可打印時怎么選擇打印機,即.ActiveWindow.SelectedSheets.PrintOut的參數(shù)有哪些,? Expression.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName) Expression 必選,。該表達式返回“應用于”列表中的某個對象。 From Variant 類型,,可選,。打印的開始頁號。如果省略該參數(shù),,將從起始位置開始打印,。 To Variant 類型,可選,。打印的終止頁號,。如果省略該參數(shù),將打印至最后一頁,。 Copies Variant 類型,,可選。要打印的份數(shù),。如果省略該參數(shù),,將只打印一份。 Preview Variant 類型,,可選,。如果為 True 則 Microsoft Excel 打印指定對象之前進行打印預覽。如果為 False,,或者省略此參數(shù)則立即打印該對象,。 ActivePrinter Variant 類型,,可選。 設置活動打印機的名稱,。 PrintToFile Variant 類型,,可選。如果為 True 則打印輸出到文件,。如果沒有指定 PrToFileName,,則 Microsoft Excel 將提示用戶輸入要輸出文件的文件名。 Collate Variant 類型,,可選。如果為 True 則逐份打印每份副本,。 PrToFileName 可選,,Variant 類型。如果將 PrintToFile 設置為 True,,則本參數(shù)指定要打印到的文件名,。 說明 From 參數(shù)和 To 參數(shù)所描述的“頁”指的是要打印的頁,并非指定工作表或工作簿中的全部頁,。 *!* 64.如何用編程的方法打開有密碼的Excel文件,?
*Excel文件加了密碼,如何在VFP中用編程的方式把密碼輸入,,使Excel文件打開 oExcel=Createobject('Excel.application') oExcel.Workbooks.Open("d:\22.xls") 這樣還有一個密碼的對話框出來,,需要輸入密碼才能打開文件。 *!* 65.如何用編程的方法直接打開有密碼的Excel文件,?
oEle.Workbooks.Open("d:\22.xls",.F.,.F., ,"123","456") "123"表示打開權限的密碼, "456"表示修改權限的密碼. *!* 66.如何將一個已知路徑的圖片插入到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 中,,前面的零被自動去掉,例如“009877”變?yōu)?#8220;9877”,,怎么解決,?
1.在字符串前面加半角單引號“ ' ”, 例如: o.Cells(1,1).Value="'0123" 或用變量 cString="'"+"0123" &&其中0123可以取自表中一個字段 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 = "@" &&把被選定的單元格設為文本格式 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中如何在打開文件的同時自動執(zhí)行一個宏命令,。
只要將宏的命名為 AUTO_OPEN 即可,。 如果要在文件關閉時運行,則命名為auto_close ,。 *!* 72.在VFP中可以執(zhí)行EXCEL的選擇性粘貼嗎?
.Range("A2").PasteSpecial ("xlPasteValues") && 會出錯 .Range("A2").PasteSpecial (3) && 也會出錯 .Range("A2").PasteSpecial && 只好這樣了 *!* 73.如何才能只粘貼值呢?
xlPasteValues=-4163 oExcel.Range("A1").Select oExcel.Selection.Copy oExcel.Range("B1")._PasteSpecial(xlPasteValues) *注意:在Excel 中,,"xlPasteValues"是一個常量,它的值是一個數(shù)值型的:-4163 oExcel.Range("A1").Copy oExcel.Range("B3").PasteSpecial(8) &&粘貼行,、列寬 oExcel.Range("B3").PasteSpecial(-4122) &&粘貼格式 *!* 74.如何從excel讀取數(shù)據(jù)
*******建立一個excel對象******* Local hb1 As excel.Application csheetname=Trim(Thisform.text2.Value)&&讀取用戶要讀取excel的sheet名 ***讀取數(shù)據(jù)源所在的EXCEL文件名**** If Empty(Trim(Thisformset.filepath)) Messagebox("請先選擇要導入的excel文件,!",0,"提示") Return Endif If Empty(Trim(csheetname)) Messagebox("請先選擇要導入的工作表sheet名稱!",0,"提示") Return Endif Try hb1=Createobject("excel.application") Catch Messagebox("請檢查你是否已安裝microsoft excel應用程序,!",0,"提示") Endtry ***打開EXCEL對象,,開始讀取數(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,** ** 然后如果不是指定的類型,,還要進行轉(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.本程序通過將原dbf表拷成excel格式,然后導入并設置報表格式
Para tablename Local hb1 As excel.Application Wait "正在導出數(shù)據(jù),,請稍侯……" Window At 20,30 Timeout 1 bhaveerror=.F. &&定義一個變量判斷是否發(fā)生錯誤 Try hb1=Createobject("excel.application") Catch Messagebox("請檢查你是否已安裝microsoft excel應用程序,!",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文件未生成,報表生成被終止,!") 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 ****合并兩行作為報表標題************* HB1.Selection.HorizontalAlignment = 3 &&水平方向 2左對齊,,3居中,4右對齊 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 = "請輸入報表標題" HB1.Range(hbdygs).Characters.Font.Name = "隸書" HB1.Range(hbdygs).Characters.Font.FontStyle = "常規(guī)" HB1.Range(hbdygs).Characters.Font.ColorIndex = 1 &&字符顏色 ***根據(jù)數(shù)據(jù)源表結構的寬度設置列的寬度******** 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ù)據(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 &&自動保存數(shù)據(jù) * HB1.ACTIVEWORKBOOK.CLOSE &&關閉當前工作簿 * 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.復制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個工作表復制到第1個工作表之后 oExcel.SHEETS(2).Name='NewSheetName' &&設置第2個工作表名稱 *!*oExcel.SHEETS(1).COPY(oExcel.SHEETS(1),NULL) &&&&把第1個工作表復制到第1個工作表之前 *!*oExcel.SHEETS(1).NAME='NewSheetName' &&設置第1個工作表名稱 *!* 78.如何將DBF中內(nèi)容COPY到EXCEL的指定區(qū)域 例如我有一個DBF: Name_F Sl_f Mike 546 kyle 200 想將這個內(nèi)容轉(zhuǎn)到EXCEL里面的E1:F2區(qū)域! Use 表名 _vfp.DataToClip('表名',Reccount(),3) &&將一組記錄作為文本復制到剪貼板上,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)整此項中的'F2' .ActiveSheet.Paste Endwith *!* 79.VFP調(diào)用EXCEL查詢打印示例 EFILENAME='查詢打印.XLS' *LOCAL oExcel oExcel=Createobject("Excel.application") oExcel.Workbooks.Open("&EFILENAME") oExcel.Caption="VFP應用程序調(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-默認,、2-靠左、3-居中,、4-靠右,、5-填充、6=兩端對齊,、7=跨列居中,、8=分散對齊) oExcel.Range(oExcel.Cells(1,1),oExcel.Cells(nRows,nColumns)).VerticalAlignment=2 &&垂直(1=靠上、2=居中,、3=靠下,、4=兩端對齊、5=分散對齊) oExcel.ActiveSheet.PageSetup.RightFooter="第&P頁 / 共&N頁" oExcel.ActiveSheet.PageSetup.TopMargin=2/0.035 &&設置頂邊距為2厘米 oExcel.ActiveSheet.PageSetup.BottomMargin=2/0.035 &&設置左邊距為2厘米 oExcel.ActiveSheet.PageSetup.HeaderMargin=1/0.035 &&設置頁眉到頂端邊距為1厘米 oExcel.ActiveSheet.PageSetup.FooterMargin=1/0.035 &&設置頁腳到底邊距為1厘米 oExcel.ActiveSheet.PageSetup.LeftMargin=2/0.035 &&設置左邊距為2厘米 oExcel.ActiveSheet.PageSetup.RightMargin=2/0.035 &&設置右邊距為2厘米 oExcel.ActiveSheet.PageSetup.CenterHorizontally=.T. &&設置頁面水平居中 oExcel.ActiveSheet.PageSetup.CenterVertically=.T. &&設置頁面垂直居中 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)計月份:'+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) 計 表" oExcel.ActiveSheet.PageSetup.CenterFooter="單位領導:" oExcel.ActiveSheet.PageSetup.LeftFooter="打印時間:&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報表巧生成 巧讓FoxPro數(shù)據(jù)生成Excel報表 Visual FoxPro是應用廣泛的前臺數(shù)據(jù)庫開發(fā)平臺之一,,因此在我們?nèi)粘9ぷ髦袝r常會遇到DBF數(shù)據(jù)文件,。然而隨著辦公自動化的普及,越來越多的時候需要將DBF文件轉(zhuǎn)化為Excel電子文檔,。常用轉(zhuǎn)化方法是在FoxPro中用Copy命令進行格式轉(zhuǎn)化或直接用Excel打開DBF文件,。這兩種方式雖然都能達到目的,卻不能得到格式規(guī)范,、可以直接打印輸出的報表,,且輸出的Excel文件中,無法對數(shù)據(jù)類型進行有效轉(zhuǎn)換,,極易出現(xiàn)數(shù)據(jù)統(tǒng)計錯誤,。有沒有更好的方法呢,?這里有一個更加通用的方法,在VFP中調(diào)用Excel,,可以由DBF文件直接生成格式如下圖所示一樣復雜的Excel報表(如圖1),。 Excel報表 具體過程如下: 編輯推薦文章 ● 新鮮接觸Excel 2000 XP ● Excel 2000公式應用的幾條經(jīng)驗 ● Excel 2000函數(shù)應用之信息函數(shù) 假設我們要將表Agcallop.dbf文件輸出為Excel格式文檔,報表形如圖1所示,。為使通用性更強,,頁面采用A4紙橫向輸出,默認字體為宋體10號,,頁腳處添加頁號,。 部分程序代碼如下: m.outfilename=Putfile('輸出結果','agcallop','xls') &&取導出文件名稱 ef=Createobject('Excel.application') &&調(diào)用Excel程序 ef.Workbooks.Add &&添加工作簿 ef.Worksheets("sheet1").Activate &&激活第一個工作表 ef.Visible=.T. &&顯示Excel界面 ef.Cells.Select &&選擇整張表 ef.Selection.Font.Size = 10 &&設置整表默認字體大小為10 Select 0 Use agcallop &&選擇被導出的表 num=Reccount() &&求導出總記錄數(shù) Go Top i=5 ef.Range("F1:K1").Select &&選擇標題欄所在單元格 ef.Selection.Merge &&合并單元格 With ef.Range("F1 ") &&設置標題及字體屬性 .Value='客戶服務部業(yè)務代表工作量情況統(tǒng)計表' .Font.Name="黑體" .Font.Size=18 Endwith ef.Rows(2).RowHeight=1/0.035 &&設置第二行高度為1cm ef.Range("H2:O2").Select &&選定統(tǒng)計條件欄所在單元格 ef.Selection.Merge &&合并單元格 ef.Range("H2").Font.Size=10 ef.Range("H2").HorizontalAlignment=4 &&設置內(nèi)容對齊方式為右對齊,3為居中,4為右對齊 ef.Range("H2").Value='統(tǒng)計時間:'+Dtoc(Date())+' 打印日期:'+Dtoc(Date()) ef.Rows("3:4").Select With ef.Selection .HorizontalAlignment = 3 &&設置3,、4行為水平對齊 .VerticalAlignment = 2 &&垂直居中 .NumberFormatLocal = "@" &&設置3,、4行為字符型內(nèi)容 Endwith ef.Range("A3:A4").Select ef.Selection.Merge &&縱向合并第一列3、4行 ef.Range("A3").Value='工號' &&設置第一列標題內(nèi)容 ef.Columns("A").Select &&整列選擇 ef.Selection.HorizontalAlignment = 3 &&水平居中 ef.Columns("A:B").Select ef.Selection.NumberFormatLocal = "@" &&設置A,、B列為字符型內(nèi)容 ef.Range("B3:B4").Select ef.Selection.Merge &&縱向合并第二列3、4行 ef.Range("B3").Value='姓名' &&設置第二列標題內(nèi)容 ef.Columns("B").Select &&整列選擇 ef.Selection.HorizontalAlignment = 3 &&水平居中 ef.Range("C3:E3").Select &&橫向合并第三行C-E列 ef.Selection.Merge ef.Range("C3").Value='話務總量' &&第三行大標題為“話務總量”的列 ef.Range("C4").Value='電話呼入量' &&“話務總量”下第1個小標題“電話呼入量” ef.Range("D4").Value='電話呼出量' &&“話務總量”下第2個小標題“電話呼出量” ef.Range("E4").Value='合 計' &&“話務總量”下第3個小標題“合計” ef.Range("F3:H3").Select ef.Selection.Merge ef.Range("F3").Value='話務總時間' ef.Range("F4").Value='呼入時間' ef.Range("G4").Value='呼出時間' ef.Range("H4").Value='合 計' ef.Range("I3:K3").Select ef.Selection.Merge ef.Range("I3").Value='單個話務平均時間' ef.Range("I4").Value='呼入時間' ef.Range("J4").Value='呼出時間' ef.Range("K4").Value='合 計' ef.Range("L3:L4").Select ef.Selection.Merge ef.Range("L3").Value='累計工作時間' ef.Range("M3:M4").Select ef.Selection.Merge ef.Range("M3").Value='無效時間' ef.Range("N3:N4").Select ef.Selection.Merge ef.Range("N3").Value='錄入量' ef.Range("O3:O4").Select ef.Selection.Merge ef.Range("O3").Value='有效時間比' 接下來通過scan語句,,依次為每一行每一列單元格賦值,。為了獲得更好的打印效果,還需進行頁面設置,,如標題行,、頁面居中、橫向排版等,,還可以加邊框線,。 以上程序在VFP 6+Excel 2000+Windows 2000下調(diào)試通過。實際應用中可根據(jù)需要對各項參數(shù)設置進行相應調(diào)整,。 *!* 81.實用的VFP與EXCEL交互編程 摘要:本文介紹了幾種實用的VFP與EXCEL交互編程的方法與實例,,將VFP強大的數(shù)據(jù)處理功能與EXCEL優(yōu)異的制表功能有機地結合起來,大大增強了軟件的應用效果,。 關鍵詞: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)是一種關系型數(shù)據(jù)庫管理系統(tǒng),,由于其強大的數(shù)據(jù)處理能力及良好的兼容性,,使其成為數(shù)據(jù)庫應用程序開發(fā)人員的強有力工具,而EXECL則是一種優(yōu)秀的電子表格處理軟件,,在兼容性,、操作界面、公式運算,、圖表等方面有著獨到的優(yōu)勢,。上述兩種軟件在各自的應用領域均得到廣泛的應用,同時上述兩種軟件還具有良好的交互編程能力,,為兩者相輔相成,、取長補短奠定了良好的基礎。 本文將結合具體實例介紹幾種VFP與EXCEL交互編程的方法,,每種方法雖然實現(xiàn)手段各異,,但功能相仿。其功能可簡述如下:VFP數(shù)據(jù)表“學生成績表.DBF”中含“學生姓名”,、“語文”,、“數(shù)學”......等字段,示例程序?qū)腅XCEL工作簿“VFP交互.XLS”之工作表“查詢”中用書簽“課程名”指定的單元取得欲查詢的課程名稱,,然后在數(shù)據(jù)表“學生成績表.DBF”中自動搜索,,以找到該門課程不及格的同學名單,最后傳送至原EXCEL工作薄形成新的工作表單,,同時,,新工作表還將以該課程名命名。 下列程序均在VFP5.0與EXCEL97中調(diào)試通過,。因篇幅所限,,程序中的錯誤處理部分略去。 一,、EXECL驅(qū)動VFP EXECL內(nèi)置的VBA語言(Visual Basic For Application)為EXECL功能的擴展提供了便利的手段,,用戶可使用該語言直接驅(qū)動VFP完成數(shù)據(jù)檢索等功能。 程序首先生成一個VFP對象,,然后用VFP的DoCmd方法執(zhí)行VFP摸索命令串,,其摸索結果再借助于VFP的DateToClip方法拷貝至剪切板,最后VBA將其粘貼至工作表的正確位置,。 Sub FoxTest() Dim oFox As Object Dim SLesson As String Dim SCommand As String Set oFox = Createobject("VisualFoxPro.Application") '啟動VFP,,生成VFP對象 Sheets("查詢").Select SLesson = Range("課程名") '在名為“課程名”的單元格中得到欲查詢的課程名稱 Sheets.Add '產(chǎn)生新的工作表單 ActiveSheet.Name = Slesson '指定工作表單的名稱與課程名稱相同 SCommand = "SELECT 學號,語文,數(shù)學 FROM d:\vfp\學生成績表 WHERE "+ SLesson + "<60 INTO CURSOR TEMP" '形成VFP查詢命令串 oFox.DoCmd Scommand '執(zhí)行VFP命令串 oFox.DataToClip "temp", , 3 '將搜索結果以文本方式拷貝至剪切板 Range("a1:a1").Select '指向拷貝目標區(qū)域左上角單元 ActiveSheet.Paste '粘貼搜索結果 End Sub 為便于使用,作者在EXECL中自制了一名為“搜索”的工具欄及一名為“開始搜索”的按鈕,,并將上述宏程序段與自制按鈕相關聯(lián),,按下此按鈕即可運行程序并在EXCEL中得到要求的數(shù)據(jù)。 制作工具欄及按鈕的方法如下: 1. 選“工具”/“自定義”菜單,,出現(xiàn)自定義對話框,; 2. 選擇“工具欄”頁框,,然后按下“新建”按鈕; 3. 在工具欄對話框中輸入“搜索”作為新建工具欄的名稱,; 4. 選擇“命令”頁框,,在“類別”列表中選“宏”,在“命令”列表中選“自定義按鈕”并將其拖放至新建的“搜索”工具欄,; 5. 按下“更新所選內(nèi)容”按鈕,,首先在“命名”欄中填入按鈕名稱“開始搜索”,然后選擇“指定宏”,,在隨后出現(xiàn)的“指定宏”列表中選擇上述宏程序FoxTest()即可實現(xiàn)為該宏指定一個工具欄按鈕,。 二、VFP使用OLE功能驅(qū)動EXECL OLE(Object Linking and Embedding)對象鏈接與嵌入,,是WINDOWS應用程序間相互傳遞和共享數(shù)據(jù)的一種有效方法,。VFP借助于OLE不僅可共享其它應用程序的數(shù)據(jù),而且還能以對象方式直接控制其它應用程序的運行,,從而進一步擴展VFP的功能,。VFP支持直接在程序中創(chuàng)建、使用和控制OLE對象,,實現(xiàn)OLE自動化,。作為OLE客戶VFP與作為OLE服務器的EXCEL具有良好的編程接口,下述程序段用OLE方式實現(xiàn)所要求的功能,。 程序首先生成一個EXCEL的OLE對象OleApp以便對其進行操作,然后利用OLE功能從EXCEL表單中獲取欲查詢的課程名,,并控制EXCEL生成新的工作表,,VFP的查詢結果仍然使用剪切板的方式傳遞至EXCEL工作表。 OleApp=Createobject("Excel.Application") && 打開EXCEL,,產(chǎn)生OLE對象 OleApp.Application.Caption="VFP交互編程" && 指定標題欄名稱 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 學號,語文,數(shù)學 FROM d:\vfp\學生成績表 WHERE " +Alltrim(SLesson) + "<60 INTO CURSOR TEMP" && 形成VFP查詢命令串 &Scommand && 執(zhí)行VFP命令串 _vfp.DataToClip("TEMP",,3) && 將搜索結果以文本方式拷貝至剪切板 .Range("a1:a1").Select && 指向拷貝目標區(qū)域左上角單元 .ActiveSheet.Paste && 粘貼搜索結果 Endwith Enddo OleApp.Quit && 關閉EXCEL,,保存更新后的工作簿文件 *!* 82.在VFP中Disabled/Enabled EXCEL中的菜單項及按鈕 有時需要在VFP中控制EXCEL中的按鈕及菜單項,以達到由VFP控制XLS文檔的目的,??梢钥刂芚LS文 檔不能復制、不能另存,、不能打印,、不能以附檔的形式發(fā)郵件。結合陸老師的在通用字段中存放文檔 的思路,,完全可以用VFP開發(fā)文檔發(fā)布系統(tǒng),,可以發(fā)布公司的守則,、公告、管理辦法,、機密資料,、圖 片資料等而不用擔心用戶復制、打印,、以郵件傳播資料,。 XLS中各個菜單項或按鈕都有唯一的ID或序號,本例是利用序號來控制的(利用ID也可以控制),。 對象大多只有三層,,對應的控制方法是: 對象.CommandBars(第一層序號).Controls(第二層序號).accChild(第二層序號).屬性=值 本例僅列出菜單項的部分控制,其它菜單項或按鈕的序號可以程序取得,,此程序參考本文章開頭第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) &&禁用菜單中的“檔案”項 oXLS.commandbars(1).controls(1).enabled=.f. 12,、打印... (ID:4) &&禁用“檔案”菜單下的“打印”項 oXLS.CommandBars(1).Controls(1).accChild(18).Enabled=.F. 本文來自CSDN博客,,轉(zhuǎn)載請標明出處:http://blog.csdn.net/apple_8180/archive/2006/04/22/672913.aspx |
|