当前位置:文档之家› VFP数据导出到EXCEL技术.

VFP数据导出到EXCEL技术.

VFP数据导出到EXCEL技术我们都知道在 EXCEL 中有很多很多的计算公式、灵活多变的计算方式、方便快捷的图表处理、和功能强大的VBA 语言,可以说 EXCEL 可能是最好用的表格处理软件。

我敢说:微软的产品中大概就 EXCEL 最好!但是,怎样用 Foxpro 快速产生统计表,并将数据送到 Excel表格中,从而代替 Foxpro 的报表工具呢?我们大家都知道,在 Visual Foxpro 3.0及以后版本中提供了一个调用Ole Automation 的函数 CREATEOBJECT,用该函数可以让 Visual Foxpro 很方便的和其它可以提供 Ole Automation 服务的程序进行通讯。

而 Excel 更是一个标准的 Ole Automation 服务器程序,我们可以在前端将数据传送到后端的 Excel 服务程序,用后端服务程序进行表格处理,从而弥补 Visual Foxpro的不足。

由于历史原因,我们作报表都习惯用 Total、Count、Sum 或者直接在报表中工具中计算,速度最快的大概也就是 Total 了,但不知道还有多少人还在坚持使用 Total 命令进行计算,有没有更好的计算方法呢?当然有啦!我在实际使用中积累有一定的经验但愿能给各位起到小小的启发。

假设有一表:Table1 是一个人员档案,里面的表结构如下:-----字段名--类型及长度---------编号C,2部门C,10姓名C,10性别C,2出生日期 D职务C,10文化程度C,10内容大概如下TABLE1.DBF---------------------------------编号部门姓名性别出生日期职务文化程度---------------------------------1 工程部张三男1971-01-11 工程师大学本科2 销售部李四男1967-02-23 经理大学本科3 工程部王武1954-03-14 技术员大学专科4 总经理室赵洁雅女1975-04-05 秘书硕士研究生5 销售部..1977-05-09 销售经理高中6 工程部大文1969-03-30 总工程师大学专科7 销售部..1961-10-10 销售经理大学专科8 总经理室庄稼1961-10-10 总经理大学专科当然实际的数据应该比这里多很多,要不还用统计干吗,我不过是举例说明而已。

我不知道你们在使用 SQL 语句时有没有用使用函数的习惯,反正我是相当愿意在 SQL 中使用函数,我认为使用函数的 SQL 语句虽然语句长一点,但是可以让你的程序看起来更清晰、简洁。

说道这里我要感谢当初发明出 IIF 函数那位高人,要没有他(她)我也没有机会在这里罗嗦这么久,在后面提到的快速产生统计表中将大量的运用 IIF 函数。

也许你会觉得奇怪,你统计的时候用那么多 IIF 干吗?别急,下面就让我慢慢的告诉你。

看看我们前面描述的表,我们可能要统计各个部门的“性别|职务|文化程度”等的分布情况,简单一点我给画了一个表个出来,可能表格更能说明白:各部门人员分布情况表单位:人---------------------------------部门|男|女|本科|专科|技术人员|管理人员|秘书---------------------------------工程部|||||||销售部|||||||总经理室|||||||||||||||||||||---------------------------------上面这张表说复杂也不复杂,但是用常给的处理方法可能也要耗掉我们不少的时间,因为你不得不针对不同的项目进行单独反复的计算,可能还要生成一大堆的临时表真烦!下面的计算公司可让你轻松完成上面的表格,当然程序还是要写的不可能什么也不动不想就能达到的,立即输入下列程序:第一步:转换Select 部门,;iif(性别='男',1,0) as 男,;iif(性别='女',1,0) as 女,;iif(文化程度='大学本科',1,0) as 大学本科,;iif(文化程度='大学专科',1,0) as 大学专科,;iif(inlist(职务,'工程师','技术员','总工程师'),1,0) as 技术人员,;iif(inlist(职务,'总经理','经理','销售经理'),1,0) as 管理人员,;iif(inlist(职务,'总经理','经理','销售经理'),1,0) as 管理人员,;iif(inlist(职务,'秘书'),1,0) as 秘书;from table into cursor query1第二步:转换并计算Select 部门 as 部门,;sum(男) as 男,;sum(女) as 女,;sum(大学本科) as 大学本科,;sum(大学专科) as 大学专科,;sum(技术人员) as 技术人员,;sum(管理人员) as 管理人员,;sum(管理人员) as 管理人员,;sum(秘书) as 秘书;from query1 into cursor query1;group by 部门不要以为我把“from query1 into cursor query1”写错了,这样写的语句确实可以使用。

到这一步,统计表就计算出来了,不信用 BROWSE 看看。

往下面我们应该说说怎样把现在统计出的数据输出到 EXCEL 中了(当然什么样子的数据都可以)。

首先用 CreateObject 函数建立一个 Excel automation 对象,程序如下:local excel,odefine windows WaitWin at 0,0 size 10,60 system ;font 'times new roman',12 ;title '提示' close float zoom &&用于处理提示信息的窗口move windows waitWin centeracti windows waitwinset color to w+/nclearexcel=createobject('excel.application')if type('excel')='U' &&未能产生EXCEL对象? '启动 EXCEL 失败...'release windows WaitWinreturnendifReportTitle='XXXX公司人员分布情况'ExcelFile="xls1.xls"excel.caption=ReportTitelselect query1if not file(ExcelFile)export to (ExcelFile) type xlsendifexcel.workbooks.open(ExcelFile)o=excel.activeworkbook.activesheet &&用对象代替这么长的一串字o.cells(1,1).value=ReportTitle** 第一行是标题,故从第二行开始*scan for recno()>1 &&每一行?'正在将数据转换到 Excel 表格中...',recno()for i=1 to fcount() &&每一列fld=field(i)if type(fld)='C'&&如果字段太宽,Excel可能不能正确接受数据o.cells(recno()+3,i).value=trim(&fld)elseo.cells(recno()+3,i).value=&fldendifendforendscano.cells(1,1).selectexcel.ActiveWindow.windowstate=2excel.ActiveWorkbook.save()excel.visible=.t.clearstartTime=time()set cursor off** 等待 Excel 处理完毕后再继续*do while .t.@1,4 say '已启动后台 Excel 表格处理程序,处理中...'@2,4 say 'Ctrl+End 继续处理...'@4,4 say '开始时间:'??starttime@5,4 say '现在时间:'??time()&&VFP会在此等待,除非你从 EXCEL中退出或按下 Ctrl+End键if inkey(0.5)=23 or type('')='U'exitendifenddoset cursor onrelease o,excelrelease FindWindow?'处理完毕...'=inkey(0.5)release windows WaitWinend noteVFP调用EXCEL的补充方法佳帆网站工作室大文下面是我使用 VFP CALL EXCEL的部分例子:这是本人从书本上抄的片断和我的小小经验,可以让你很方便的在 VFP 中调用EXCEL,所有的例程我都试验过。

用Visual Foxpro 设计用Excel表格的程序利用OLE Automation 设计Excel 应用程序Excel支持的对象说明:(a) VBA 对象:对象名称意义Application Excel应用程序对象WorkBooks Excel活页薄对象(b)所使用的Method对象名称 Method 执行意义Application Cells 设定或传回来某个网格的内容Range 传回或设定某一个范围的网格Charts 传回或设定活页簿的单一统计表Quit 结束 Excel ApplicationSave 激活存储文件对话框WorkBooks Add 新增一个工作簿Charts Add 新增一个统计图(c)所使用的Property对象名称 Property 设定意义Application Visible 是否现实再 SCREEN上 .T. , .F.Value 传回或者设定存储文件的内容ActiveSheet 回应Excel Application 执行工作表对象实例说明:启动Excel:MyExcel=CreateObject('Excel.Application') &&建立Excel对象MyExcel.Visible=.T. &&让Excel对象再屏幕上显示出来如何增加工作簿:MyExcel.WorkBooks.Add &&在Excel对象中增加一份工作簿(WorkBook)如何在工作簿中增加Sheet(工作表)MyExcel.Sheets.Add &&增加工作表(在当前工作簿中)如何删除工作表MyExcel.ActiveWorkBooks.Sheets(1).Delete &&把工作簿中的BOOK(1)删除向指定的工作簿中的工作表(Sheet)中存储数据*Excel.application Object*Excel.application.ActiveWorkBook Property*WorkBOoks Object*WorkBOoks Object的Add Method.*Sheets对象*Sheets(Index)对象指定索引工作表*Excel.Application对象的Cells Method结合Value属性Example:CLEAR ALLSET PATH TO SYS(2004)+'SAMPLESDATE'USE CUSTOMERMYEXCEL=CREATEOBJEXT('EXCEL.APPLICATION')MYEXCEL.VISIBLE=.T.MYEXCEL.WORKBOOKS.ADDMYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,1).VALUE='客户编号' MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,2).VALUE='公司行号' SELECT CUSTOMERR=2C=1GOTO TOPFOR I=1 TO 20MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(R,C).VALUE=CUSTOMER.CUST_ID MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(R,C+1).VALUE=PANY R=R+1SKIPENDFOR调整单元格宽度:MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,1).columnwidth=30调整单元格对齐方式:MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,1).horizontalalig=11为默认方式,2为左对齐,3为中对齐,4为右对齐。

相关主题