1、VFP全面控制EXCEL 收藏VFP和Excel都可以用来进行处理数据库表格,如果巧妙地将二者的优点结合起来,将会大大方便我们的工作。比如我们可以利用VFP进行处理数据,而利用Excel的预览打印功能进行报表打印。这就需要我们在VFP中直接来控制Excel。下面就在开发VFP应用项目时对Excel的控制作一下介绍:*!* 1创建Excel对象oExcel=Createobject(Excel.application)*!* 2添加新工作簿oExcel.Workbooks.Add*!* 3设置第3个工作表为激活工作表oExcel.Worksheets(sheet3).Activate*!* 4打
2、开指定工作簿oExcel.Workbooks.Open(c:templl.xls)*!* 5显示Excel窗口oExcel.Visible=.T.*!* 6更改Excel标题栏oExcel.Caption=VFP应用程序调用Microsoft Excel*!* 7给单元格赋值oExcel.cells(1,4).Value=XM(XM为数据库字段名)*!* 8设置指定列的宽度(单位:字符个数)oExcel.ActiveSheet.Columns(1).ColumnWidth=5*!* 9设置指定行的高度(单位:磅)oExcel.ActiveSheet.Rows(1).RowHeight=1(设定
3、行高为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.Acti
4、veSheet.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
5、页*!* 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厘米oE
6、xcel.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.
7、*!* 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行之前插入
8、一行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
9、.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.s
10、heet)XlApp=oXLS.ApplicationXlSheet=XlApp.ActiveSheetbars=xlapp.CommandBars.CountStr1=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=mandbars(i).accChildCount For j=1 To bars2 Try
11、 obj=mandbars(i).Controls(j) Str1=Str1+Chr(13)+ +Alltrim(Str(j)+、+mandbars(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:+ Alltri
12、m(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)+% NowaitEndforSave To Xls.txt All Like Str1Modify Command Xls.txtReturn*!* 41工作表另存为oExcel.ActiveWorkbook.SaveAs(c:temp22.xls)*检测当前目录是否有同名的EXCEL
13、表,如果有先删除,再另存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)
14、 EndifEndif*!* 42放弃存盘 & 避免出现保存对话框oExcel.ActiveWorkbook.saved=.T.*!* 43存盘oExcel.ActiveWorkbook.Save*!* 44关闭工作簿oExcel.Workbooks.Closeobjexcel.activeworkbook.Close(.F.)*!* 45退出ExceloExcel.QuitRelease oExcel &只有释放对象变量, EXCEL进程才会完全关闭*!* 46合并单元格oExcel.ActiveSheet.Range(A4:B5).MergeCells=.T.*!* 47下列设置大家自己理
15、解With crfole.ActiveSheet.PageSetup .LeftHeader = Chr(13)+左页眉 .CenterHeader = 中页眉 .RightHeader = 右页眉 .LeftFooter = 左页脚 .CenterFooter = 中页脚 .RightFooter = 右页脚 .Orientation=1 &1竖排,2横排EndwithWith crfole.Range(A4:C4) .MergeCells = .T. .WrapText =.F. .Orientation = 0 .AddIndent =.F. .ShrinkToFit = .F.Endw
16、ith*!* 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.Ac
17、tiveSheet.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:TESTtesta.xls)oExcel.Visible=.T.?oExcel.Range(B5).Comment.Text &显示B5单元格的批注内容oExcel.Wo
18、rkbooks.CloseoExcel.QuitRelease oExcel*!* 51oExcel.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.:保护工作簿窗口*
19、!* 54设置允许用户编辑区域oExcel.ActiveSheet.Protection.AllowEditRanges.Add(区域3,oExcel.ActiveSheet.Range(A2:D5)*!* 55如果不想在宏运行时被无穷无尽的提示和警告消息所困扰,就将本属性设置为.F.oExcel.DisplayAlerts = .F.如果不想在宏运行时被无穷无尽的提示和警告消息所困扰,就将本属性设置为 False;这样每次出现需用户应答的消息时,Microsoft Excel 将选择默认应答。如果将本属性设置为 False,那么宏运行结束后, Microsoft Excel 并不自动将其设置
20、回 True。故当宏运行结束后,都应将本属性设置回 True 值。*!* 56将当前工作表中的已用区域(只读)存入数组。strPath=D:TEST123.xlsLocal oExceloExcel=Createobject(Excel.Application)oExcel.WorkBooks.Open(strPath)arrTableInfo=oExcel.ActiveSheet.UsedRange.Value &将当前工作表中的已用区域(只读)存入数组。oExcel.QuitRelease oExcelInsert Into 表名 From arrTableInfo*!* 57设置exce
21、l批注的字体(excel 2000实现了,如下:)ole.Range(a3).Comment.Shape.Select & 此命令要求批注的 Visible=.t.ole.Selection.Font.Size=9ole.Selection.Font.Name=黑体ole.Selection.Font.bold=.F.注:该组命令要求先选中批注框,否则写成 ole.Range(a3).Comment.Shape.Font.Size=9 则出错,不知为何!*!* 58如何取得当前EXCEL表中工作表的数目及各工作表的名称?ClearLocal lnSheetCountoExcel=Createo
22、bject(EXCEL.APPLICATION) &创建Excel对象oExcel.WORKBOOKS.Open(c:111321.xls) &打开指定工作簿With oExcel lnSheetCount=.WorkBooks(1).Sheets.Count &统计工作表数量Endwith?当前EXCEL表中工作表的数目为:+Alltrim(Str(lnSheetCount)For Each oMyVar In oExcel.sheets ?当前EXCEL表中工作表的名称分别为+oMyVar.Name &显示Excel表中所有工作表Next oMyVaroExcel.WORKBOOKS.Cl
23、ose &关闭工作簿oExcel.Quit &退出Excel*!* 59获取工作表名称在以下示例中,创建了一个 microsoft excel 实例,添加了一个新的工作簿。使用 foreach 语句显示工作簿中每个工作表的名称。此示例要求在运行示例的机器上正确安装 microsoft excel。oExcel = Create(Excel.Application)oExcel.Workbooks.AddFor Each oMyVar In oExcel.sheets ? oMyVar.NameNext oMyVar*!* 60虽然用APPEND From tx.Xls Type XL8可以更简
24、单的追加数据,但有时会导致程序非法错误退出(除非先另存为Excel 5.0)*!* 61VFP控制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(Up
25、per(Strtran(fil,Substr(fil,1,Rat(,fil),c:windowsdesktopcphz),.XLS,.dbf) &要保存的文件名If File(asfil) Delete File &asfilEndifoExcel.ActiveWorkbook.SaveAs(asfil,8) &另存为DBFoExcel.ActiveWorkbook.saved=.T. &不保存当前EXCEL表oExcel.Workbooks.Close &关闭表oExcel.Quit &退出EXCELRelease oExcel &释放变量*VFP中例子*lcFileName=D:TEST.
26、XLSoExcel=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 &让所有的列宽都自动调整oEx
27、cel.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 &退出EXCELRelease oExcel &释放变量Messagebox(Excel文件:D:TEST.XLS 另存为 D:TEST.DB
28、F 完成!,64,信息提示)*VB例子*功能:VB调用Excel,将一个Excel文件另存为Dbf。前提:要安装ExcelDim oExcel As ObjectlcSFileName = 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
29、= oExcel.SHEETS(1).UsedRange.Columns.Count 有数据的总列数*oExcel.Cells(R, C).Select 选中数据*oExcel.Columns.AutoFit 让所有的列宽都自动调整oExcel.DisplayAlerts = Flase 不显示提示框oExcel.ActiveWorkbook.SaveAs FileName:=lcDFileName, FileFormat:=8oExcel.ActiveWorkbook.saved = Ture 不保存当前EXCEL表oExcel.Workbooks.Close 关闭表oExcel.Quit
30、退出EXCELSet oExcel = Nothing 释放对象MsgBox (Excel文件: & lcSFileName & 另存为 & lcDFileName & 完成!)*!* 62VFP用ADO连接Excel,然后将Excel内容导出DBF的方法*-以下代码是将123.XLS中的SHEET5中的内容转换成RR.DBFoConnection = Createobject(adodb.connection) &建立连接对象With oConnection .ConnectionString = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:
31、temp123.xls;Extended Properties=excel 8.0;HDR=YES;IMEX=1;Persist Security Info=False .OpenEndwithoConnection.EXECUTE(select * into dBase III;DataBase=d:temp.rr from sheet5$)oConnection.Close*!* 63设置打印参数:用Excel做报表,可打印时怎么选择打印机,即.ActiveWindow.SelectedSheets.PrintOut的参数有哪些? Expression.PrintOut(From, To,
32、 Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName)Expression 必选。该表达式返回“应用于”列表中的某个对象。From Variant 类型,可选。打印的开始页号。如果省略该参数,将从起始位置开始打印。To Variant 类型,可选。打印的终止页号。如果省略该参数,将打印至最后一页。Copies Variant 类型,可选。要打印的份数。如果省略该参数,将只打印一份。Preview Variant 类型,可选。如果为 True 则 Microsoft Excel 打印指定对象之前进行打印预览。如果为
33、 False,或者省略此参数则立即打印该对象。ActivePrinter Variant 类型,可选。 设置活动打印机的名称。PrintToFile Variant 类型,可选。如果为 True 则打印输出到文件。如果没有指定 PrToFileName,则 Microsoft Excel 将提示用户输入要输出文件的文件名。Collate Variant 类型,可选。如果为 True 则逐份打印每份副本。PrToFileName 可选,Variant 类型。如果将 PrintToFile 设置为 True,则本参数指定要打印到的文件名。说明From 参数和 To 参数所描述的“页”指的是要打印的
34、页,并非指定工作表或工作簿中的全部页。*!* 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如何将一个
35、已知路径的图片插入到excel中.oexcel1.ActiveSheet.PictureS.Insert(图片文件名)*!* 67能不能指定在某一位置或区域放置图片并控制图片显示大小呢?OLEAPP.SHEETS(1).Selectoleapp.Range(位置).Selectoleapp.ActiveSheet.PictureS.Insert(图片文件名).Selectoleapp.Selection.ShapeRange.LockAspectRatio =.T.oleapp.Selection.ShapeRange.Height = 57*!* 68类型为字符型的字段输出到excel 中,
36、前面的零被自动去掉,例如“009877”变为“9877”,怎么解决?1.在字符串前面加半角单引号“ ”,例如:o.Cells(1,1).Value=0123或用变量cString=+0123 &其中0123可以取自表中一个字段o.Cells(1,1).Value=cString &o.Range(A1:A1).value=cString2.oExcel.CELLS(1,1).Select &或eole.Range(A1:E1).SelectoExcel.Selection.NumberFormatLocal = &把被选定的单元格设为文本格式oExcel.Cells(1,1).Value=01
37、23 &给所选单元格覆值*!* 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.UsedRanger=UsedRange.Rows.Count
38、 &有数据的总行数c=UsedRange.Columns.Count &有数据的总列数loXls.Workbooks.CloseloXls.Quit*!* 71在EXCEL中如何在打开文件的同时自动执行一个宏命令。只要将宏的命名为 AUTO_OPEN 即可。如果要在文件关闭时运行,则命名为auto_close 。*!* 72在VFP中可以执行EXCEL的选择性粘贴吗?.Range(A2).PasteSpecial (xlPasteValues) & 会出错.Range(A2).PasteSpecial (3) & 也会出错.Range(A2).PasteSpecial & 只好这样了*!* 7
39、3如何才能只粘贴值呢?xlPasteValues=-4163oExcel.Range(A1).SelectoExcel.Selection.CopyoExcel.Range(B1)._PasteSpecial(xlPasteValues)*注意:在Excel 中,xlPasteValues是一个常量,它的值是一个数值型的:-4163oExcel.Range(A1).CopyoExcel.Range(B3).PasteSpecial(8) &粘贴行、列宽oExcel.Range(B3).PasteSpecial(-4122) &粘贴格式*!* 74如何从excel读取数据*建立一个excel对象
40、*Local hb1 As excel.Applicationcsheetname=Trim(Thisform.text2.Value)&读取用户要读取excel的sheet名*读取数据源所在的EXCEL文件名*If Empty(Trim(Thisformset.filepath) Messagebox(请先选择要导入的excel文件!,0,提示) ReturnEndifIf Empty(Trim(csheetname) Messagebox(请先选择要导入的工作表sheet名称!,0,提示) ReturnEndifTry hb1=Createobject(excel.application)
41、Catch Messagebox(请检查你是否已安装microsoft excel应用程序!,0,提示)Endtry*打开EXCEL对象,开始读取数据*HB1.workbooks.Open(Trim(Thisformset.filepath)hb1.Sheets(csheetname).SelectSele Store&这是要读取的数据存放的表Zapisend=.F. &用于判断是否记录已到底i=1Do While isend=.F. Append Blank crq=Dtoc(drq) cdh=hb1.Cells(i,1).Value If Isnull(cdh) cdh= Endif *用
42、于判断数据类型,数据类型一定要判断是否为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