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).V ALUE='客户编号'MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,2).V ALUE='公司行号' SELECT CUSTOMERR=2C=1GOTO TOPFOR I=1 TO 20MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(R,C). V ALUE=CUSTOMER.CUST_IDMYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(R,C+ 1).V ALUE=PANY R=R+1SKIPENDFOR调整单元格宽度:MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,1).columnwidth=30调整单元格对齐方式:MYEXCEL.ACTIVEWORKBOOK.SHEETS(1).CELLS(1,1).h orizontalalig=1 1为默认方式,2为左对齐,3为中对齐,4为右对齐。