Visual Foxpro中如何实现对EXCEL表格的操作.docx
《Visual Foxpro中如何实现对EXCEL表格的操作.docx》由会员分享,可在线阅读,更多相关《Visual Foxpro中如何实现对EXCEL表格的操作.docx(209页珍藏版)》请在冰豆网上搜索。
![Visual Foxpro中如何实现对EXCEL表格的操作.docx](https://file1.bdocx.com/fileroot1/2023-2/1/ceaabac2-e6b5-437f-8697-652ea135c8ae/ceaabac2-e6b5-437f-8697-652ea135c8ae1.gif)
VisualFoxpro中如何实现对EXCEL表格的操作
VisualFoxpro中如何实现对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.打开指定工作簿
oExcel.Workbooks.Open("c:
\temp\ll.xls")
5.显示Excel窗口
oExcel.visible=.t.
6.更改Excel标题栏
oExcel.Caption="VFP应用程序调用MicrosoftExcel"
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"
14.设置页眉(字体大小)
oExcel.ActiveSheet.PageSetup.CenterHeader="&50报表1"&&'&'后面的50可以自定义,表示字体的大小
15.设置页脚
oExcel.ActiveSheet.PageSetup.CenterFooter="第&P页"
15.设置页脚(字体大小)
oExcel.ActiveSheet.PageSetup.CenterFooter="&28第&P页"&&'&'后面的28可以自定义,表示字体的大小
16.设置页眉到顶端边距为2厘米
oExcel.ActiveSheet.PageSetup.HeaderMargin=2/0.035
17.设置页脚到底边距为3厘米
oExcel.ActiveSheet.PageSetup.FooterMargin=3/0.035
18.设置顶边距为2厘米
oExcel.ActiveSheet.PageSetup.TopMargin=2/0.035
19.设置底边距为4厘米
oExcel.ActiveSheet.PageSetup.BottomMargin=4/0.035
20.设置左边距为2厘米
oExcel.ActiveSheet.PageSetup.LeftMargin=2/0.035
21.设置右边距为2厘米
oExcel.ActiveSheet.PageSetup.RightMargin=2/0.035
22.设置页面水平居中
oExcel.ActiveSheet.PageSetup.CenterHorizontally=.t.
23.设置页面垂直居中
oExcel.ActiveSheet.PageSetup.CenterVertically=.t.
24.设置页面纸张大小(1-窄行851139-宽行14119:
A4)
oExcel.ActiveSheet.PageSetup.PaperSize=1
25.打印单元格网线
oExcel.ActiveSheet.PageSetup.PrintGridlines=.t.
26.拷贝整个工作表
oExcel.ActiveSheet.UsedRange.Copy
27.拷贝指定区域
oExcel.ActiveSheet.Range("A1:
E2").Copy
28.粘贴
oExcel.WorkSheet("Sheet2").Range("A1").PasteSpecial
29.在第2行之前插入一行
oExcel.ActiveSheet.Rows
(2).Insert
30.在第2列之前插入一列
oExcel.ActiveSheet.Columns
(2).Insert
31.设置字体
oExcel.ActiveSheet.Cells(2,1).Font.Name="黑体"
32.设置字体大小
oExcel.ActiveSheet.Cells(1,1).Font.Size=25
33.设置字体为斜体
oExcel.ActiveSheet.Cells(1,1).Font.Italic=.t.
34.设置整列字体为粗体
oExcel.ActiveSheet.Columns
(1).Font.Bold=.t.
35.清除单元格公式
oExcel.ActiveSheet.Cells(1,4).ClearContents
36.打印预览工作表
oExcel.ActiveSheet.PrintPreview
37.打印输出工作表
oExcel.ActiveSheet.PrintOut
38.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
STR=''
FORi=1TObars
STR=STR+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
FORj=1TObars2
TRY
obj=mandbars(i).CONTROLS(j)
STR=STR+CHR(13)+''+ALLTRIM(STR(j))+'、'+mandbars(i).CONTROLS(j).accname+'(ID:
'+ALLTRIM(STR(xlapp.CommandBars(i).CONTROLS(j).ID))+')'
FORk=1TOobj.accChildCount
TRY
IFNOTEMPTY(obj.CONTROLS(k).accname)
STR=STR+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
WAITWINDOWSALLTRIM(STR(i))+'/'+ALLTRIM(STR(bars))+''+STR(i/bars*100,10,2)+'%'NOWAIT
ENDFOR
SAVETOXLS.txtALLLIKESTR
MODIFYCOMMANDXLS.txt
RETURN
39.工作表另存为
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)
IFFILE(lcFileName)
DELETEFILE(lcFileName)
ENDIFoExcel.ActiveWorkbook.SaveAs(lcFileName)
ENDIF
ENDIF
40.放弃存盘&&避免出现保存对话框
oExcel.ActiveWorkbook.saved=.t.
41.存盘
oExcel.ActiveWorkbook.save
42.关闭工作簿
oExcel.Workbooks.close
43.退出Excel
oExcel.quit
RELEASEoExcel&&只有释放对象变量,EXCEL进程才会完全关闭
44.合并单元格
oExcel.ActiveSheet.Range("A4:
B5").MergeCells=.t.
45.下列设置大家自己理解
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
46.文本对齐
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=分散对齐)
47.拷贝整个工作表(含格式)
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企业版下运行通过,运行环境为Excel97及中文Windows98
48.显示某个单元格的批注内容
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
49.oExcel.ActiveSheet.PageSetup.PrintTitleRows="$1:
$1"&&每页都打印行标头(每页顶部出现的单元格的行)
50.保护工作表:
oExcel.ActiveSheet.PROTECT('密码',.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.)
51.保护工作薄
oExcel.ActiveWorkbook.PROTECT('密码',.T.,.T.)
第一个.T.:
保护工作簿结构
第二个.T.:
保护工作簿窗口
52.设置允许用户编辑区域
oExcel.ActiveSheet.Protection.AllowEditRanges.Add("区域3",oExcel.ActiveSheet.Range("A2:
D5"))
53.如果不想在宏运行时被无穷无尽的提示和警告消息所困扰,就将本属性设置为.F.
oExcel.DisplayAlerts=.F.
如果不想在宏运行时被无穷无尽的提示和警告消息所困扰,就将本属性设置为False;这样每次出现需用户应答的消息时,MicrosoftExcel将选择默认应答。
如果将本属性设置为False,那么宏运行结束后,MicrosoftExcel并不自动将其设置回True。
故当宏运行结束后,都应将本属性设置回True值。
54.将当前工作表中的已用区域(只读)存入数组。
strPath='D:
\TEST\123.xls'
LOCALoExcel
oExcel=CREATEOBJECT("Excel.Application")
oExcel.WorkBooks.OPEN(strPath)
arrTableInfo=oExcel.ActiveSheet.UsedRange.VALUE&&将当前工作表中的已用区域(只读)存入数组。
oExcel.QUIT
RELEASEoExcel
INSERTINTO表名FROMarrTableInfo
55.设置excel批注的字体(excel2000实现了,如下:
)
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则出错,不知为何!
--------------------------------------------------------------
如何取得当前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))
FOREACHoMyVarINoExcel.sheets
?
'当前EXCEL表中工作表的名称分别为'+oMyVar.name&&显示Excel表中所有工作表
NEXToMyVar
oExcel.WORKBOOKS.CLOSE&&关闭工作簿
oExcel.QUIT&&退出Excel
--------------------------------------------------------------
获取工作表名称
在以下示例中,创建了一个microsoftexcel实例,添加了一个新的工作簿。
使用foreach语句显示工作簿中每个工作表的名称。
此示例要求在运行示例的机器上正确安装microsoftexcel。
oExcel=CREATE("Excel.Application")
oExcel.Workbooks.ADD
FOREACHoMyVarINoExcel.sheets
?
oMyVar.name
NEXToMyVar
--------------------------------------------------------------
Excel报表巧生成
巧让FoxPro数据生成Excel报表
VisualFoxPro是应用广泛的前台数据库开发平台之一,因此在我们日常工作中时常会遇到DBF数据文件。
然而随着办公自动化的普及,越来越多的时候需要将DBF文件转化为Excel电子文档。
常用转化方法是在FoxPro中用Copy命令进行格式转化或直接用Excel打开DBF文件。
这两种方式虽然都能达到目的,却不能得到格式规范、可以直接打印输出的报表,且输出的Excel文件中,无法对数据类型进行有效转换,极易出现数据统计错误。
有没有更好的方法呢?
这里有一个更加通用的方法,在VFP中调用Excel,可以由DBF文件直接生成格式如下图所示一样复杂的Excel报表(如图1)。
Excel报表
具体过程如下:
编辑推荐文章
●新鲜接触Excel2000XP
●Excel2000公式应用的几条经验
●Excel2000函数应用之信息函数
假设我们要将表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
select0
useagcallop
&&选择被导出的表
num=reccount()
&&求导出总记录数
gotop
i=5
ef.range("F1:
K1").Select
&&选择标题栏所在单元格
ef.Selection.Merge
&&合并单元格
withef.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
withef.Selection
.HorizontalAlignment=3
&&设置3、4行为水平对齐
.VerticalAlignment=2
&&垂直居中
.NumberFormatLocal="@"
&&设置3、4行为字符型内容
endwith
ef.Range("A3:
A4").Select
ef.Selection.Merge
&&纵向合并第一列3、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
&&纵向合并第二列3、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("I