VFP全面控制EXCEL 收藏
VFP和Excel均可以用來進行處理數據庫表格,若是巧妙地將兩者的優勢結合起來,將會大大方便咱們的工做。好比咱們能夠利用VFP進行處理數據,而利用Excel的預覽打印功能進行報表打印。這就須要咱們在VFP中直接來控制Excel。下面就在開發VFP應用項目時對Excel的控制做一下介紹:數據庫
*!* 1.建立Excel對象
oExcel=Createobject("Excel.application")編程
*!* 2.添加新工做簿
oExcel.Workbooks.Add
windows
*!* 3.設置第3個工做表爲激活工做表
oExcel.Worksheets("sheet3").Activate
數組
*!* 4.打開指定工做簿
oExcel.Workbooks.Open("c:/temp/ll.xls")
服務器
*!* 5.顯示Excel窗口
oExcel.Visible=.T.
app
*!* 6.更改Excel標題欄
oExcel.Caption="VFP應用程序調用Microsoft Excel"
less
*!* 7.給單元格賦值
oExcel.cells(1,4).Value=XM(XM爲數據庫字段名)
ide
*!* 8.設置指定列的寬度(單位:字符個數)
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參數以下)
ole.ActiveSheet.Range("b3:d3").BorderS(2).Weight=3
*!* 13.設置四個邊框線條的類型
oExcel.ActiveSheet.Range("b3:d3").BorderS(2).LineStyle=1
(其中Borders參數: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.打印單元格網線
oExcel.ActiveSheet.PageSetup.PrintGridlines=.T.
*!* 28.拷貝整個工做表
oExcel.ActiveSheet.UsedRange.Copy
*!* 29.拷貝指定區域
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.放棄存盤 && 避免出現保存對話框
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列的值
*以上控制調用語句在中文VFP5.0企業版下運行經過,運行環境爲Excel 97及中文Windows 98
*!* 50.顯示某個單元格的批註內容
oExcel=Createobject("Excel.application")
oExcel.Workbooks.Open("d:/TEST/testa.xls")
oExcel.Visible=.T.
?oExcel.Range("B5").Comment.Text &&顯示B5單元格的批註內容
oExcel.Workbooks.Close
oExcel.Quit
Release oExcel
*!* 51.oExcel.ActiveSheet.PageSetup.PrintTitleRows="$1:$1" &&每頁都打印行標頭(每頁頂部出現的單元格的行)
*!* 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.設置容許用戶編輯區域
oExcel.ActiveSheet.Protection.AllowEditRanges.Add("區域3",oExcel.ActiveSheet.Range("A2:D5"))
*!* 55.若是不想在宏運行時被無窮無盡的提示和警告消息所困擾,就將本屬性設置爲.F.
oExcel.DisplayAlerts = .F.
若是不想在宏運行時被無窮無盡的提示和警告消息所困擾,就將本屬性設置爲 False;這樣每次出現需用戶應答的消息時,Microsoft Excel 將選擇默認應答。
若是將本屬性設置爲 False,那麼宏運行結束後, Microsoft Excel 並不自動將其設置回 True。故當宏運行結束後,都應將本屬性設置回 True 值。
*!* 56.將當前工做表中的已用區域(只讀)存入數組。
strPath='D:/TEST/123.xls'
Local oExcel
oExcel=Createobject("Excel.Application")
oExcel.WorkBooks.Open(strPath)
arrTableInfo=oExcel.ActiveSheet.UsedRange.Value &&將當前工做表中的已用區域(只讀)存入數組。
oExcel.Quit
Release oExcel
Insert Into 表名 From arrTableInfo
*!* 57.設置excel批註的字體(excel 2000實現了,以下:)
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表中工做表的數目及各工做表的名稱?
Clear
Local lnSheetCount
oExcel=Createobject("EXCEL.APPLICATION") &&建立Excel對象
oExcel.WORKBOOKS.Open("c:/111/321.xls") &&打開指定工做簿
With oExcel
lnSheetCount=.WorkBooks(1).Sheets.Count &&統計工做表數量
Endwith
?'當前EXCEL表中工做表的數目爲:'+Alltrim(Str(lnSheetCount))
For Each oMyVar In oExcel.sheets
?'當前EXCEL表中工做表的名稱分別爲'+oMyVar.Name &&顯示Excel表中全部工做表
Next oMyVar
oExcel.WORKBOOKS.Close &&關閉工做簿
oExcel.Quit &&退出Excel
*!* 59.獲取工做表名稱
在如下示例中,建立了一個 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能夠更簡單的追加數據,但有時會致使程序非法錯誤退出(除非先另存爲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列數據(另存後只有這些數據)
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 &&有數據的總行數
C=oExcel.SHEETS(1).UsedRange.Columns.Count &&有數據的總列數
oExcel.Cells(R,C).Select &&選中數據
oExcel.Selection.NumberFormatLocal = "@" &&把被選定的單元格設爲文本格式
oExcel.Columns.AutoFit &&讓全部的列寬都自動調整
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調用Excel,將一個Excel文件另存爲Dbf。'
'前提:要安裝Excel'
Dim oExcel As Object
lcSFileName = "D:/test.xls" '源Excel文件名
lcDFileName = "D:/test1.dbf" '目標Dbf文件名
Set oExcel = Createobject("Excel.Application") '建立Excel對象
oExcel.Workbooks.Open (lcSFileName) '打開Excel表
*R = oExcel.SHEETS(1).UsedRange.ROWS.Count '有數據的總行數
*C = oExcel.SHEETS(1).UsedRange.Columns.Count '有數據的總列數
*oExcel.Cells(R, C).Select '選中數據
*oExcel.Columns.AutoFit '讓全部的列寬都自動調整
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內容導出DBF的方法
*--如下代碼是將123.XLS中的SHEET5中的內容轉換成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.設置打印參數:
用Excel作報表,可打印時怎麼選擇打印機,即.ActiveWindow.SelectedSheets.PrintOut的參數有哪些?
Expression.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName)
Expression 必選。該表達式返回「應用於」列表中的某個對象。
From Variant 類型,可選。打印的開始頁號。若是省略該參數,將從起始位置開始打印。
To Variant 類型,可選。打印的終止頁號。若是省略該參數,將打印至最後一頁。
Copies Variant 類型,可選。要打印的份數。若是省略該參數,將只打印一份。
Preview Variant 類型,可選。若是爲 True 則 Microsoft Excel 打印指定對象以前進行打印預覽。若是爲 False,或者省略此參數則當即打印該對象。
ActivePrinter Variant 類型,可選。 設置活動打印機的名稱。
PrintToFile Variant 類型,可選。若是爲 True 則打印輸出到文件。若是沒有指定 PrToFileName,則 Microsoft Excel 將提示用戶輸入要輸出文件的文件名。
Collate Variant 類型,可選。若是爲 True 則逐份打印每份副本。
PrToFileName 可選,Variant 類型。若是將 PrintToFile 設置爲 True,則本參數指定要打印到的文件名。
說明
From 參數和 To 參數所描述的「頁」指的是要打印的頁,並不是指定工做表或工做簿中的所有頁。
*!* 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.能不能指定在某一位置或區域放置圖片並控制圖片顯示大小呢?
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」變爲「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 記錄數
loXls = Createobject("excel.application")
bookExcel = loXls.Application.Workbooks.Open("f:/pz.xls")
nrows=bookExcel.Worksheets('pz')
UsedRange =nrows.UsedRange
r=UsedRange.Rows.Count &&有數據的總行數
c=UsedRange.Columns.Count &&有數據的總列數
loXls.Workbooks.Close
loXls.Quit
*!* 71.在EXCEL中如何在打開文件的同時自動執行一個宏命令。
只要將宏的命名爲 AUTO_OPEN 便可。
若是要在文件關閉時運行,則命名爲auto_close 。
*!* 72.在VFP中能夠執行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"是一個常量,它的值是一個數值型的:-4163
oExcel.Range("A1").Copy
oExcel.Range("B3").PasteSpecial(8) &&粘貼行、列寬
oExcel.Range("B3").PasteSpecial(-4122) &&粘貼格式
*!* 74.如何從excel讀取數據
*******創建一個excel對象*******
Local hb1 As excel.Application
csheetname=Trim(Thisform.text2.Value)&&讀取用戶要讀取excel的sheet名
***讀取數據源所在的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對象,開始讀取數據********
HB1.workbooks.Open(Trim(Thisformset.filepath))
hb1.Sheets(csheetname).Select
Sele Store&&這是要讀取的數據存放的表
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
**用於判斷數據類型,數據類型必定要判斷是否爲NULL,**
** 而後若是不是指定的類型,還要進行轉換*************
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 "共轉換獲得"+Alltrim(Str(Reccount()))+"條記錄!" Window Timeout 2
hb1.Quit
*!* 75.本程序經過將原dbf表拷成excel格式,而後導入並設置報表格式
Para tablename
Local hb1 As excel.Application
Wait "正在導出數據,請稍侯……" Window At 20,30 Timeout 1
bhaveerror=.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("數據源的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 = "常規"
HB1.Range(hbdygs).Characters.Font.ColorIndex = 1 &&字符顏色
***根據數據源表結構的寬度設置列的寬度********
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))
*************設置數據區域的字體格式***************
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 &&自動保存數據
* 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中內容COPY到EXCEL的指定區域
例如我有一個DBF:
Name_F Sl_f
Mike 546
kyle 200
想將這個內容轉到EXCEL裏面的E1:F2區域!
Use 表名
_vfp.DataToClip('表名',Reccount(),3) &&將一組記錄做爲文本複製到剪貼板上,3使用製表符分隔字段。
oexl=Createobject('excel.application') &&建立電子表格
oexl.Visible=.T. &&使電子表格可見
oexl.workbooks.Add &&建立工做簿
With oexl
.Range("E1:F2").Select &&根據你的表中的記錄數和字段數調整此項中的'F2'
.ActiveSheet.Paste
Endwith
*!* 79.VFP調用EXCEL查詢打印示例
EFILENAME='查詢打印.XLS'
*LOCAL oExcel
oExcel=Createobject("Excel.application")
oExcel.Workbooks.Open("&EFILENAME")
oExcel.Caption="VFP應用程序調用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='統計月份:'+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部 門 出 勤 統 計 表"
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數據生成Excel報表
Visual FoxPro是應用普遍的前臺數據庫開發平臺之一,所以在咱們平常工做中時常會遇到DBF數據文件。然而隨着辦公自動化的普及,愈來愈多的時候須要將DBF文件轉化爲Excel電子文檔。經常使用轉化方法是在FoxPro中用Copy命令進行格式轉化或直接用Excel打開DBF文件。這兩種方式雖然都能達到目的,卻不能獲得格式規範、能夠直接打印輸出的報表,且輸出的Excel文件中,沒法對數據類型進行有效轉換,極易出現數據統計錯誤。有沒有更好的方法呢?這裏有一個更加通用的方法,在VFP中調用Excel,能夠由DBF文件直接生成格式以下圖所示同樣複雜的Excel報表(如圖1)。 Excel報表
具體過程以下:
編輯推薦文章
● 新鮮接觸Excel 2000 XP
● Excel 2000公式應用的幾條經驗
● Excel 2000函數應用之信息函數
假設咱們要將表Agcallop.dbf文件輸出爲Excel格式文檔,報表形如圖1所示。爲使通用性更強,頁面採用A4紙橫向輸出,默認字體爲宋體10號,頁腳處添加頁號。
部分程序代碼以下:
m.outfilename=Putfile('輸出結果','agcallop','xls')
&&取導出文件名稱
ef=Createobject('Excel.application')
&&調用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()
&&求導出總記錄數
Go Top
i=5
ef.Range("F1:K1").Select
&&選擇標題欄所在單元格
ef.Selection.Merge
&&合併單元格
With ef.Range("F1 ")
&&設置標題及字體屬性
.Value='客戶服務部業務表明工做量狀況統計表'
.Font.Name="黑體"
.Font.Size=18
Endwith
ef.Rows(2).RowHeight=1/0.035
&&設置第二行高度爲1cm
ef.Range("H2:O2").Select
&&選定統計條件欄所在單元格
ef.Selection.Merge
&&合併單元格
ef.Range("H2").Font.Size=10
ef.Range("H2").HorizontalAlignment=4
&&設置內容對齊方式爲右對齊,3爲居中,4爲右對齊
ef.Range("H2").Value='統計時間:'+Dtoc(Date())+' 打印日期:'+Dtoc(Date())
ef.Rows("3:4").Select
With ef.Selection
.HorizontalAlignment = 3
&&設置三、4行爲水平對齊
.VerticalAlignment = 2
&&垂直居中
.NumberFormatLocal = "@"
&&設置三、4行爲字符型內容
Endwith
ef.Range("A3:A4").Select
ef.Selection.Merge
&&縱向合併第一列三、4行
ef.Range("A3").Value='工號'
&&設置第一列標題內容
ef.Columns("A").Select
&&整列選擇
ef.Selection.HorizontalAlignment = 3
&&水平居中
ef.Columns("A:B").Select
ef.Selection.NumberFormatLocal = "@"
&&設置A、B列爲字符型內容
ef.Range("B3:B4").Select
ef.Selection.Merge
&&縱向合併第二列三、4行
ef.Range("B3").Value='姓名'
&&設置第二列標題內容
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下調試經過。實際應用中可根據須要對各項參數設置進行相應調整。
*!* 81.實用的VFP與EXCEL交互編程
摘要:本文介紹了幾種實用的VFP與EXCEL交互編程的方法與實例,將VFP強大的數據處理功能與EXCEL優異的製表功能有機地結合起來,大大加強了軟件的應用效果。
關鍵詞: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)是一種關係型數據庫管理系統,因爲其強大的數據處理能力及良好的兼容性,使其成爲數據庫應用程序開發人員的強有力工具,而EXECL則是一種優秀的電子表格處理軟件,在兼容性、操做界面、公式運算、圖表等方面有着獨到的優點。上述兩種軟件在各自的應用領域均獲得普遍的應用,同時上述兩種軟件還具備良好的交互編程能力,爲二者相輔相成、取長補短奠基了良好的基礎。
本文將結合具體實例介紹幾種VFP與EXCEL交互編程的方法,每種方法雖然實現手段各異,但功能相仿。其功能可簡述以下:VFP數據表「學生成績表.DBF」中含「學生姓名」、「語文」、「數學」......等字段,示例程序將從EXCEL工做簿「VFP交互.XLS」之工做表「查詢」中用書籤「課程名」指定的單元取得欲查詢的課程名稱,而後在數據表「學生成績表.DBF」中自動搜索,以找到該門課程不及格的同窗名單,最後傳送至原EXCEL工做薄造成新的工做表單,同時,新工做表還將以該課程名命名。
下列程序均在VFP5.0與EXCEL97中調試經過。因篇幅所限,程序中的錯誤處理部分略去。
1、EXECL驅動VFP
EXECL內置的VBA語言(Visual Basic For Application)爲EXECL功能的擴展提供了便利的手段,用戶可以使用該語言直接驅動VFP完成數據檢索等功能。
程序首先生成一個VFP對象,而後用VFP的DoCmd方法執行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 '產生新的工做表單
ActiveSheet.Name = Slesson '指定工做表單的名稱與課程名稱相同
SCommand = "SELECT 學號,語文,數學 FROM d:/vfp/學生成績表 WHERE "+ SLesson + "<60 INTO CURSOR TEMP" '造成VFP查詢命令串
oFox.DoCmd Scommand '執行VFP命令串
oFox.DataToClip "temp", , 3 '將搜索結果以文本方式拷貝至剪切板
Range("a1:a1").Select '指向拷貝目標區域左上角單元
ActiveSheet.Paste '粘貼搜索結果
End Sub
爲便於使用,做者在EXECL中自制了一名爲「搜索」的工具欄及一名爲「開始搜索」的按鈕,並將上述宏程序段與自制按鈕相關聯,按下此按鈕便可運行程序並在EXCEL中獲得要求的數據。
製做工具欄及按鈕的方法以下:
1. 選「工具」/「自定義」菜單,出現自定義對話框;
2. 選擇「工具欄」頁框,而後按下「新建」按鈕;
3. 在工具欄對話框中輸入「搜索」做爲新建工具欄的名稱;
4. 選擇「命令」頁框,在「類別」列表中選「宏」,在「命令」列表中選「自定義按鈕」並將其拖放至新建的「搜索」工具欄;
5. 按下「更新所選內容」按鈕,首先在「命名」欄中填入按鈕名稱「開始搜索」,而後選擇「指定宏」,在隨後出現的「指定宏」列表中選擇上述宏程序FoxTest()便可實現爲該宏指定一個工具欄按鈕。
2、VFP使用OLE功能驅動EXECL
OLE(Object Linking and Embedding)對象連接與嵌入,是WINDOWS應用程序間相互傳遞和共享數據的一種有效方法。VFP藉助於OLE不只可共享其它應用程序的數據,並且還能以對象方式直接控制其它應用程序的運行,從而進一步擴展VFP的功能。VFP支持直接在程序中建立、使用和控制OLE對象,實現OLE自動化。做爲OLE客戶VFP與做爲OLE服務器的EXCEL具備良好的編程接口,下述程序段用OLE方式實現所要求的功能。
程序首先生成一個EXCEL的OLE對象OleApp以便對其進行操做,而後利用OLE功能從EXCEL表單中獲取欲查詢的課程名,並控制EXCEL生成新的工做表,VFP的查詢結果仍然使用剪切板的方式傳遞至EXCEL工做表。
OleApp=Createobject("Excel.Application") && 打開EXCEL,產生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, "搜索指定數據") &&產生信息框
If (.Not.(nAnswer=6)) && 如按下「Yes"按鈕,則開始搜索,反之退出
Exit
Endif
.Sheets("查詢").Select && 選擇「查詢」工做表單
SLesson = OleApp.Application.Range("課程名").Value && 獲得欲查詢的課程名稱
.Sheets.Add && 新建一工做表單
.ActiveSheet.Name = Slesson && 指定工做表單的名稱
SCommand = "SELECT 學號,語文,數學 FROM d:/vfp/學生成績表 WHERE " +Alltrim(SLesson) + "<60 INTO CURSOR TEMP" && 造成VFP查詢命令串
&Scommand && 執行VFP命令串
_vfp.DataToClip("TEMP",,3) && 將搜索結果以文本方式拷貝至剪切板
.Range("a1:a1").Select && 指向拷貝目標區域左上角單元
.ActiveSheet.Paste && 粘貼搜索結果
Endwith
Enddo
OleApp.Quit && 關閉EXCEL,保存更新後的工做簿文件
*!* 82.在VFP中Disabled/Enabled EXCEL中的菜單項及按鈕有時須要在VFP中控制EXCEL中的按鈕及菜單項,以達到由VFP控制XLS文檔的目的。能夠控制XLS文檔不能複製、不能另存、不能打印、不能以附檔的形式發郵件。結合陸老師的在通用字段中存放文檔的思路,徹底能夠用VFP開發文檔發佈系統,能夠發佈公司的守則、公告、管理辦法、機密資料、圖片資料等而不用擔憂用戶複製、打印、以郵件傳播資料。XLS中各個菜單項或按鈕都有惟一的ID或序號,本例是利用序號來控制的(利用ID也能夠控制)。對象大多隻有三層,對應的控制方法是:對象.CommandBars(第一層序號).Controls(第二層序號).accChild(第二層序號).屬性=值本例僅列出菜單項的部分控制,其它菜單項或按鈕的序號能夠程序取得,此程序參考本文章開頭第40條oXLS=Createobject('excel.application')oXLS.Workbooks.AddoXLS.Visible=.T.一、工做表功能表列(Name:Worksheet Menu Bar Id:1) &&禁用/不可見系統菜單oxls.commandbars(1).Enabled=.F.一、檔案(Id:30002) &&禁用菜單中的「檔案」項 oXLS.commandbars(1).controls(1).enabled=.f.十二、打印... (ID:4) &&禁用「檔案」菜單下的「打印」項oXLS.CommandBars(1).Controls(1).accChild(18).Enabled=.F.