1.创建Excel对象
3.设置第3个工作表为激活工作表
eole.Worksheets("sheet3").Activate
4.打开指定工作簿
eole.Workbooks.Open("c:\temp\ll.xls")
5.显示Excel窗口
eole.visible=.t.
6.更改Excel标题栏
eole.Caption="VFP应用程序调用Microsoft Excel"
7.给单元格赋值
eole.cells(1,4).value=XM(XM为数据库字段名)
8.设置指定列的宽度(单位:字符个数)
eole.ActiveSheet.Columns(1).ColumnWidth=5
9.设置指定行的高度(单位:磅)
eole.ActiveSheet.Rows(1).RowHeight=1
(设定行高为1磅,1磅=0.035厘米)
10.在第18行之前插入分页符
eole.Worksheets("Sheet1").Rows(18).PageBreak=1
11.在第4列之前删除分页符
eole.ActiveSheet.Columns(4).PageBreak=0
12.指定边框线宽度(Borders参数如下)
ole.ActiveSheet.Range("b3:d3").Borders(2).Weight=3
13.设置四个边框线条的类型
eole.ActiveSheet.Range("b3:d3").Borders(2).LineStyle=1
(其中Borders参数:1-左、2-右、3-顶、4-底、5-斜、6-斜/;LineStyle值:1与7-细实、2-细虚、4-点虚、9-双细实线)
14.设置页眉
eole.ActiveSheet.PageSetup.CenterHeader="报表1"
14.设置页眉(字体大小)
eole.ActiveSheet.PageSetup.CenterHeader="&50报表1" &&'&'后面的50可以自定义,表示字体的大小
15.设置页脚
eole.ActiveSheet.PageSetup.CenterFooter="第&P页"
15.设置页脚(字体大小)
eole.ActiveSheet.PageSetup.CenterFooter="&28第&P页" &&'&'后面的28可以自定义,表示字体的大小
16.设置页眉到顶端边距为2厘米
eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035
17.设置页脚到底边距为3厘米
eole.ActiveSheet.PageSetup.FooterMargin=3/0.035
18.设置顶边距为2厘米
eole.ActiveSheet.PageSetup.TopMargin=2/0.035
19.设置底边距为4厘米
eole.ActiveSheet.PageSetup.BottomMargin=4/0.035
20.设置左边距为2厘米
eole.ActiveSheet.PageSetup.LeftMargin=2/0.035
21.设置右边距为2厘米
eole.ActiveSheet.PageSetup.RightMargin=2/0.035
22.设置页面水平居中
eole.ActiveSheet.PageSetup.CenterHorizontally=.t.
23.设置页面垂直居中
eole.ActiveSheet.PageSetup.CenterVertically=.t.
24.设置页面纸张大小(1-窄行8511 39-宽行1411)
eole.ActiveSheet.PageSetup.PaperSize=1
25.打印单元格网线
eole.ActiveSheet.PageSetup.PrintGridlines=.t.
26.拷贝整个工作表
eole.ActiveSheet.UsedRange.Copy
27.拷贝指定区域
eole.ActiveSheet.Range("A1:E2").Copy
28.粘贴
eole.WorkSheet("Sheet2").Range("A1").PasteSpecial
29.在第2行之前插入一行
eole.ActiveSheet.Rows(2).Insert
30.在第2列之前插入一列
eole.ActiveSheet.Columns(2).Insert
31.设置字体
eole.ActiveSheet.Cells(2,1).Font.Name="黑体"
32.设置字体大小
eole.ActiveSheet.Cells(1,1).Font.Size=25
33.设置字体为斜体
eole.ActiveSheet.Cells(1,1).Font.Italic=.t.
34.设置整列字体为粗体
eole.ActiveSheet.Columns(1).Font.Bold=.t.
35.清除单元格公式
eole.ActiveSheet.Cells(1,4).ClearContents
36.打印预览工作表
eole.ActiveSheet.PrintPreview
37.打印输出工作表
eole.ActiveSheet.PrintOut
38. EOLE.CommandBars(1).Controls(1).accChild(18).Execute &&打印(菜单序号18为Excel2003的‘打印’项)
eole.ActiveWorkbook.SaveAs("c:\temp\22.xls")
40.放弃存盘
eole.ActiveWorkbook.saved=.t.
41.存盘
eole.ActiveWorkbook.save
42.关闭工作簿
eole.Workbooks.close
43.退出Excel
eole.quit
RELEASE eole &&只有释放对象变量, EXCEL进程才会完全关闭
44.合并单元格
eole.ActiveSheet.Range("A4:B5").MergeCells=.t.
45.下列设置大家自己理解(VFP代码)
46.文本对齐
eole.range("A4:c4").HorizontalAlignment =1 &&水平(1-默认、2-靠左、3-居中、4-靠右、5-填充、6=两端对齐、7=跨列居中、8=分散对齐)
eole.range("A4:c4").VerticalAlignment =2 &&垂直(1=靠上、2=居中、3=靠下、4=两端对齐、5=分散对齐)
47.拷贝整个工作表(含格式)
eole.activesheet.cells.copy &&拷贝
eole.sheets(1).select &&选择第一工作表
eole.ActiveSheet.Paste &&粘贴
eole.ActiveSheet.Cells(3,4).value && ActiveSheet 为当前的Sheet工作薄名字,Cells(3,4).value 为第3行第4列的值
以上控制调用语句在中文VFP5.0企业版下运行通过,运行环境为Excel 97及中文Windows 98
48. 显示某个单元格的批注内容
eole=CREATEOBJECT("Excel.application")
eole.Workbooks.OPEN("d:\TEST\testa.xls")
eole.VISIBLE=.T.
eole.Range("B5").Comment.Text &&显示B5单元格的批注内容
eole.Workbooks.CLOSE
eole.QUIT
RELEASE EOLE
49.EOLE.ActiveSheet.PageSetup.PrintTitleRows="$1:$1" &&每页都打印行标头(每页顶部出现的单元格的行)
50.保护工作表:
EOLE.ActiveSheet.PROTECT('密码',.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.)
51.保护工作薄
EOLE.ActiveWorkbook.PROTECT('密码',.T.,.T.)
第一个.T.:保护工作簿结构
第二个.T.:保护工作簿窗口
2.置允许用户编辑区域
EOLE.ActiveSheet.Protection.AllowEditRanges.Add("区域3",EOLE.ActiveSheet.Range("A2:D5"))
--------------------------------------------------------------
如何取得当前EXCEL表中工作表的数目及各工作表的名称?
CLEAR
LOCAL lnSheetCount
EOLE=CREATEOBJECT("EXCEL.APPLICATION") &&创建Excel对象
EOLE.WORKBOOKS.OPEN("c:\111\321.xls") &&打开指定工作簿
WITH EOLE
lnSheetCount=.WorkBooks(1).Sheets.Count &&统计工作表数量
ENDWITH
?'当前EXCEL表中工作表的数目为:'+ALLTRIM(STR(lnSheetCount))
FOR EACH oMyVar IN eole.sheets
?'当前EXCEL表中工作表的名称分别为'+oMyVar.name &&显示Excel表中所有工作表
NEXT oMyVar
EOLE.WORKBOOKS.CLOSE &&关闭工作簿
EOLE.QUIT &&退出Excel
--------------------------------------------------------------
获取工作表名称
在以下示例中,创建了一个 microsoft excel 实例,添加了一个新的工作簿。使用 foreach 语句显示工作簿中每个工作表的名称。此示例要求在运行示例的机器上正确安装 microsoft excel。
oExcel = CREATE("Excel.Application")
oExcel.Workbooks.ADD
FOR EACH oMyVar IN oExcel.sheets
? oMyVar.name
NEXT oMyVar
--------------------------------------------------------------
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
&&设置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("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下调试通过。实际应用中可根据需要对各项参数设置进行相应调整。
--------------------------------------------------------------
FOX控制EXCL文件另存为DBF(EXCL后台运行)
fil=Thisform.List1.Value &&其值为一个包含路径的文件名
eole=CREATEOBJECT('Excel.application')
eole.Workbooks.Open(fil) &&打开文件
eole.Selection.AutoFilter &&关闭(如果无则打开)自动筛选
eole.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
eole.ActiveWorkbook.SaveAs(asfil,8) &&另存为DBF
eole.ActiveWorkbook.saved=.t. &&不保存当前EXCL表
eole.Workbooks.close &&关闭表
eole.quit &&退出EXCL
RELEASE eole &&释放变量
*************例子******************
eole=CREATEOBJECT('Excel.application')
eole.Workbooks.Open('D:\TEST.XLS') &&打开文件
eole.Range("A1:B100").Select &&选中从第1行到1000行的前6列数据(另存后只有这些数据)
eole.Columns.AutoFit &&让所有的列宽都自动调整
IF FILE('D:\TEST.DBF')
DELETE FILE 'D:\TEST.DBF'
ENDIF
eole.ActiveWorkbook.SaveAs('D:\TEST.DBF',8) &&另存为DBF
eole.ActiveWorkbook.saved=.t. &&不保存当前EXCL表
eole.Workbooks.close &&关闭表
eole.quit &&退出EXCL
RELEASE eole &&释放变量
eole=CREATEOBJECT("Excel.application")
2.添加新工作簿
eole.Workbooks.add3.设置第3个工作表为激活工作表
eole.Worksheets("sheet3").Activate
4.打开指定工作簿
eole.Workbooks.Open("c:\temp\ll.xls")
5.显示Excel窗口
eole.visible=.t.
6.更改Excel标题栏
eole.Caption="VFP应用程序调用Microsoft Excel"
7.给单元格赋值
eole.cells(1,4).value=XM(XM为数据库字段名)
8.设置指定列的宽度(单位:字符个数)
eole.ActiveSheet.Columns(1).ColumnWidth=5
9.设置指定行的高度(单位:磅)
eole.ActiveSheet.Rows(1).RowHeight=1
(设定行高为1磅,1磅=0.035厘米)
10.在第18行之前插入分页符
eole.Worksheets("Sheet1").Rows(18).PageBreak=1
11.在第4列之前删除分页符
eole.ActiveSheet.Columns(4).PageBreak=0
12.指定边框线宽度(Borders参数如下)
ole.ActiveSheet.Range("b3:d3").Borders(2).Weight=3
13.设置四个边框线条的类型
eole.ActiveSheet.Range("b3:d3").Borders(2).LineStyle=1
(其中Borders参数:1-左、2-右、3-顶、4-底、5-斜、6-斜/;LineStyle值:1与7-细实、2-细虚、4-点虚、9-双细实线)
14.设置页眉
eole.ActiveSheet.PageSetup.CenterHeader="报表1"
14.设置页眉(字体大小)
eole.ActiveSheet.PageSetup.CenterHeader="&50报表1" &&'&'后面的50可以自定义,表示字体的大小
15.设置页脚
eole.ActiveSheet.PageSetup.CenterFooter="第&P页"
15.设置页脚(字体大小)
eole.ActiveSheet.PageSetup.CenterFooter="&28第&P页" &&'&'后面的28可以自定义,表示字体的大小
16.设置页眉到顶端边距为2厘米
eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035
17.设置页脚到底边距为3厘米
eole.ActiveSheet.PageSetup.FooterMargin=3/0.035
18.设置顶边距为2厘米
eole.ActiveSheet.PageSetup.TopMargin=2/0.035
19.设置底边距为4厘米
eole.ActiveSheet.PageSetup.BottomMargin=4/0.035
20.设置左边距为2厘米
eole.ActiveSheet.PageSetup.LeftMargin=2/0.035
21.设置右边距为2厘米
eole.ActiveSheet.PageSetup.RightMargin=2/0.035
22.设置页面水平居中
eole.ActiveSheet.PageSetup.CenterHorizontally=.t.
23.设置页面垂直居中
eole.ActiveSheet.PageSetup.CenterVertically=.t.
24.设置页面纸张大小(1-窄行8511 39-宽行1411)
eole.ActiveSheet.PageSetup.PaperSize=1
25.打印单元格网线
eole.ActiveSheet.PageSetup.PrintGridlines=.t.
26.拷贝整个工作表
eole.ActiveSheet.UsedRange.Copy
27.拷贝指定区域
eole.ActiveSheet.Range("A1:E2").Copy
28.粘贴
eole.WorkSheet("Sheet2").Range("A1").PasteSpecial
29.在第2行之前插入一行
eole.ActiveSheet.Rows(2).Insert
30.在第2列之前插入一列
eole.ActiveSheet.Columns(2).Insert
31.设置字体
eole.ActiveSheet.Cells(2,1).Font.Name="黑体"
32.设置字体大小
eole.ActiveSheet.Cells(1,1).Font.Size=25
33.设置字体为斜体
eole.ActiveSheet.Cells(1,1).Font.Italic=.t.
34.设置整列字体为粗体
eole.ActiveSheet.Columns(1).Font.Bold=.t.
35.清除单元格公式
eole.ActiveSheet.Cells(1,4).ClearContents
36.打印预览工作表
eole.ActiveSheet.PrintPreview
37.打印输出工作表
eole.ActiveSheet.PrintOut
38. EOLE.CommandBars(1).Controls(1).accChild(18).Execute &&打印(菜单序号18为Excel2003的‘打印’项)
&&不同版本Excel的菜单序号可以通过以下程序VFP代码取得 *(需要在VFP7.0以上运行)
oXls=GETOBJECT("","excel.sheet")
XlApp=oXLS.APPLICATION
XlSheet=XlApp.ActiveSheet
bars=xlapp.CommandBars.COUNT
STR=''
FOR i=1 TO bars
STR=STR+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)
STR=STR+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 )
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
WAIT WINDOWS ALLTRIM(STR(i))+' / '+ALLTRIM(STR(bars))+' '+STR(i/bars*100,10,2)+'%' NOWAIT
ENDFOR
SAVE TO XLS.txt ALL LIKE STR
MODIFY COMMAND XLS.txt
RETURN
39.工作表另存为
eole.ActiveWorkbook.SaveAs("c:\temp\22.xls")
40.放弃存盘
eole.ActiveWorkbook.saved=.t.
41.存盘
eole.ActiveWorkbook.save
42.关闭工作簿
eole.Workbooks.close
43.退出Excel
eole.quit
RELEASE eole &&只有释放对象变量, EXCEL进程才会完全关闭
44.合并单元格
eole.ActiveSheet.Range("A4:B5").MergeCells=.t.
45.下列设置大家自己理解(VFP代码)
46.文本对齐
eole.range("A4:c4").HorizontalAlignment =1 &&水平(1-默认、2-靠左、3-居中、4-靠右、5-填充、6=两端对齐、7=跨列居中、8=分散对齐)
eole.range("A4:c4").VerticalAlignment =2 &&垂直(1=靠上、2=居中、3=靠下、4=两端对齐、5=分散对齐)
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
47.拷贝整个工作表(含格式)
eole.activesheet.cells.copy &&拷贝
eole.sheets(1).select &&选择第一工作表
eole.ActiveSheet.Paste &&粘贴
eole.ActiveSheet.Cells(3,4).value && ActiveSheet 为当前的Sheet工作薄名字,Cells(3,4).value 为第3行第4列的值
以上控制调用语句在中文VFP5.0企业版下运行通过,运行环境为Excel 97及中文Windows 98
48. 显示某个单元格的批注内容
eole=CREATEOBJECT("Excel.application")
eole.Workbooks.OPEN("d:\TEST\testa.xls")
eole.VISIBLE=.T.
eole.Range("B5").Comment.Text &&显示B5单元格的批注内容
eole.Workbooks.CLOSE
eole.QUIT
RELEASE EOLE
49.EOLE.ActiveSheet.PageSetup.PrintTitleRows="$1:$1" &&每页都打印行标头(每页顶部出现的单元格的行)
50.保护工作表:
EOLE.ActiveSheet.PROTECT('密码',.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.,.T.)
51.保护工作薄
EOLE.ActiveWorkbook.PROTECT('密码',.T.,.T.)
第一个.T.:保护工作簿结构
第二个.T.:保护工作簿窗口
2.置允许用户编辑区域
EOLE.ActiveSheet.Protection.AllowEditRanges.Add("区域3",EOLE.ActiveSheet.Range("A2:D5"))
--------------------------------------------------------------
如何取得当前EXCEL表中工作表的数目及各工作表的名称?
CLEAR
LOCAL lnSheetCount
EOLE=CREATEOBJECT("EXCEL.APPLICATION") &&创建Excel对象
EOLE.WORKBOOKS.OPEN("c:\111\321.xls") &&打开指定工作簿
WITH EOLE
lnSheetCount=.WorkBooks(1).Sheets.Count &&统计工作表数量
ENDWITH
?'当前EXCEL表中工作表的数目为:'+ALLTRIM(STR(lnSheetCount))
FOR EACH oMyVar IN eole.sheets
?'当前EXCEL表中工作表的名称分别为'+oMyVar.name &&显示Excel表中所有工作表
NEXT oMyVar
EOLE.WORKBOOKS.CLOSE &&关闭工作簿
EOLE.QUIT &&退出Excel
--------------------------------------------------------------
获取工作表名称
在以下示例中,创建了一个 microsoft excel 实例,添加了一个新的工作簿。使用 foreach 语句显示工作簿中每个工作表的名称。此示例要求在运行示例的机器上正确安装 microsoft excel。
oExcel = CREATE("Excel.Application")
oExcel.Workbooks.ADD
FOR EACH oMyVar IN oExcel.sheets
? oMyVar.name
NEXT oMyVar
--------------------------------------------------------------
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
&&设置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("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下调试通过。实际应用中可根据需要对各项参数设置进行相应调整。
--------------------------------------------------------------
FOX控制EXCL文件另存为DBF(EXCL后台运行)
fil=Thisform.List1.Value &&其值为一个包含路径的文件名
eole=CREATEOBJECT('Excel.application')
eole.Workbooks.Open(fil) &&打开文件
eole.Selection.AutoFilter &&关闭(如果无则打开)自动筛选
eole.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
eole.ActiveWorkbook.SaveAs(asfil,8) &&另存为DBF
eole.ActiveWorkbook.saved=.t. &&不保存当前EXCL表
eole.Workbooks.close &&关闭表
eole.quit &&退出EXCL
RELEASE eole &&释放变量
*************例子******************
eole=CREATEOBJECT('Excel.application')
eole.Workbooks.Open('D:\TEST.XLS') &&打开文件
eole.Range("A1:B100").Select &&选中从第1行到1000行的前6列数据(另存后只有这些数据)
eole.Columns.AutoFit &&让所有的列宽都自动调整
IF FILE('D:\TEST.DBF')
DELETE FILE 'D:\TEST.DBF'
ENDIF
eole.ActiveWorkbook.SaveAs('D:\TEST.DBF',8) &&另存为DBF
eole.ActiveWorkbook.saved=.t. &&不保存当前EXCL表
eole.Workbooks.close &&关闭表
eole.quit &&退出EXCL
RELEASE eole &&释放变量