VFP全面控制EXCEL(转自十豆三老师)
2019-04-14 19:56发布
生成海报
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.打开指定工作簿
oExcel.Workbooks.Open("c:/temp/ll.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
(设定行高为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=''
Fori=1Tobars
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
Forj=1Tobars2
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))+')'
Fork=1Toobj.accChildCount
Try
IfNotEmpty(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.txtAll LikeStr1
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
ReleaseoExcel&&只有释放对象变量, EXCEL进程才会完全关闭
*!* 46.合并单元格
oExcel.ActiveSheet.Range("A4:B5").MergeCells=.T.
*!* 47.下列设置大家自己理解
Withcrfole.ActiveSheet.PageSetup
.LeftHeader =Chr(13)+"左页眉"
.CenterHeader = "中页眉"
.RightHeader = "右页眉"
.LeftFooter = "左页脚"
.CenterFooter = "中页脚"
.RightFooter = "右页脚"
.Orientation=1&&1竖排,2横排
Endwith
Withcrfole.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
ReleaseoExcel
*!* 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'
LocaloExcel
oExcel=Createobject("Excel.Application")
oExcel.WorkBooks.Open(strPath)
arrTableInfo=oExcel.ActiveSheet.UsedRange.Value&&将当前工作表中的已用区域(只读)存入数组。
oExcel.Quit
ReleaseoExcel
Insert Into表名FromarrTableInfo
*!* 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
LocallnSheetCount
oExcel=Createobject("EXCEL.APPLICATION")&&创建Excel对象
oExcel.WORKBOOKS.Open("c:/111/321.xls")&&打开指定工作簿
WithoExcel
lnSheetCount=.WorkBooks(1).Sheets.Count&&统计工作表数量
Endwith
?'当前EXCEL表中工作表的数目为:'+Alltrim(Str(lnSheetCount))
For EachoMyVarInoExcel.sheets
?'当前EXCEL表中工作表的名称分别为'+oMyVar.Name&&显示Excel表中所有工作表
NextoMyVar
oExcel.WORKBOOKS.Close&&关闭工作簿
oExcel.Quit&&退出Excel
*!* 59.获取工作表名称
在以下示例中,创建了一个 microsoft excel 实例,添加了一个新的工作簿。使用 foreach 语句显示工作簿中每个工作表的名称。此示例要求在运行示例的机器上正确安装 microsoft excel。
oExcel =Create("Excel.Application")
oExcel.Workbooks.Add
For EachoMyVarInoExcel.sheets
? oMyVar.Name
NextoMyVar
*!* 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
ReleaseoExcel&&释放变量
*************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
ReleaseoExcel&&释放变量
Messagebox('Excel文件:D:/TEST.XLS 另存为 D:/TEST.DBF 完成!',64,'信息提示')
***********VB例子*************
'功能:VB调用Excel,将一个Excel文件另存为Dbf。'
'前提:要安装Excel'
Dim oExcelAs Object
lcSFileName = "D:/test.xls"'源Excel文件名
lcDFileName = "D:/test1.dbf"'目标Dbf文件名
SetoExcel =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.SaveAsFileName:=lcDFileName, FileFormat:=8
oExcel.ActiveWorkbook.saved = Ture'不保存当前EXCEL表
oExcel.Workbooks.Close'关闭表
oExcel.Quit'退出EXCEL
SetoExcel = Nothing'释放对象
MsgBox ("Excel文件: " & lcSFileName & " 另存为 " & lcDFileName & " 完成!")
*!* 62.VFP用ADO连接Excel,然后将Excel内容导出DBF的方法
*--以下代码是将123.XLS中的SHEET5中的内容转换成RR.DBF
oConnection =Createobject("adodb.connection")&&建立连接对象
WithoConnection
.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必选。该表达式返回“应用于”列表中的某个对象。
FromVariant 类型,可选。打印的开始页号。如果省略该参数,将从起始位置开始打印。
ToVariant 类型,可选。打印的终止页号。如果省略该参数,将打印至最后一页。
Copies Variant 类型,可选。要打印的份数。如果省略该参数,将只打印一份。
PreviewVariant 类型,可选。如果为 True 则 Microsoft Excel 打印指定对象之前进行打印预览。如果为 False,或者省略此参数则立即打印该对象。
ActivePrinter Variant 类型,可选。 设置活动打印机的名称。
PrintToFile Variant 类型,可选。如果为 True 则打印输出到文件。如果没有指定 PrToFileName,则 Microsoft Excel 将提示用户输入要输出文件的文件名。
CollateVariant 类型,可选。如果为 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对象*******
Localhb1Asexcel.Application
csheetname=Trim(Thisform
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮