VFP数据导出到EXCEL技术
我们都知道在 EXCEL 中有很多很多的计算公式、灵活多变的计算方式、方
便快捷的图表处理、和功能强大的 VBA 语言,可以说 EXCEL 可能是最好用
的表格处理软件。我敢说:微软的产品中大概就 EXCEL 最好!
但是,怎样用 Foxpro 快速产生统计表,并将数据送到 Excel表格中,从
而代替 Foxpro 的报表工具呢?
我们大家都知道,在 Visual Foxpro 3.0及以后版本中提供了一个调用
Ole Automation 的plan的用法 函数 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
内容大概如下
---------------------------------
编号 部门 姓名 性别 出生日期 职务 文化程度
---------------------------------
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,o
define windows WaitWin at 0,0 size 10,60 system ;
font 'times new roman',12 ;
title '提示' clo float zoom &&用于处理提示信息的窗口
move windows waitWin center
acti windows waitwin
t color to w+/n
clear
excel=createobject('ation')
if type('excel')='U' &&未能产继往开来造句 生EXCEL对象
? '启动 EXCEL 失败...'
relea windows WaitWin
return
endif
ReportTitle='XXXX公司人员分布情况'
ExcelFile=""
n=ReportTitel
lect query1
if not file(ExcelFile)
export to (ExcelFile) type xls
endif
(ExcelFile)
o=sheet &&用对象代替这么长的一串字
(1,1).value=ReportTitle
*
* 第一行是标题,故从第二行开始
*
scan for recno()>1 &&每一行
?'正在将数据转换到 Excel 表格中...',recno()
for i=1 to fcount() &&每一列
fld=field(i)
if type(fld)='C'&&如果字段太宽,Excel可能不能正确接受数据
(recno()+3,i).value=trim(&fld)
el
(recno()+3,i).value=&fld
endif
endfor
endscan
(1,1).lect
state=2
()
e=.t.
clear
startTime=time()
t 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'
exit
endif
enddo
t cursor on
relea o,excel
relea FindWindow
'处理完毕...'
=inkey(0.5)
relea windows WaitWin
end note
VFP调用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 Application
Save 激活存储文件对话框
WorkBooks Add 新增一个工作簿
Charts Add 新增一个统计图
(c)所使用的Property
对象名称 Property 设定意义
Application Visible 是否现实再 SCREEN上 .T. , .F.
Value 传回或者设定存储文件的内容
ActiveSheet 回应Excel Application 执行工作表对象
实例说明:
启动Excel:
MyExcel=CreateObject('ation') &&建立Excel对象
e=.T. &&让Excel对象再屏幕上显示出来
如何增加工作簿:
&&在Excel对象中增加一份工作簿(WorkBook)
如何在工作簿中增加Sheet(工作表)
&&增加工作表(在当前工作簿中)
如何删除工作表
(1).Delete &&把工作簿中的BOOK(1) 删
除
向指定的工作簿中的工作表(Sheet)中存储数据
*ation Object
*WorkBook Property
*WorkBOoks Object
*WorkBOoks Object的Add Method.
*Sheets对象
*Sheets(Index)对象指定索引工作表
*ation对象的Cells Method结合Value属性
Example:
CLEAR ALL
SET PATH TO SYS(2004)+'SAMPLESDATE'
USE CUSTOMER
MYEXCEL=CREATEOBJEXT('ATION')
E=.T.
(1).CELLS(1,1).VALUE='客户编号'
(1).CELLS(1,2).VALUE='公司行号'
SELECT CUSTOMER
R=2
C=1
GOTO TOP
FOR I=1 TO 20
(1).CELLS(R,C).VALUE=_ID
(1).CELLS(R,C+1).VALUE=Y
R=R+1
SKIP
ENDFOR
调整单元格宽度:
(1).CELLS(1,1).columnwidth=30
调整单元格对齐方式:
(1).CELLS(1,1).horizontalalig=1
1为默认方式,2为左对齐,3为中对齐,4为右对齐。
如何将数据存储:
()
注:可以用Save(FileName)指定预存储文件名, 则可不用激活SAVE AS 窗口
如何打印表格:
ut &&默认打印增个Sheet
如何指定打印表格:
ut(1,1,1,.T.) &&默认打印增个Sheet
PrintOut有四个参数
A. 数值:,表示指定的工作簿中进行打印的Sheet 的开始编号
B. 数值:,表示指定的工作簿中进行打印的Sheet 的结束编号
C.打印分数.
D.是否进行 Preview, .T.,预览, .F.打印
如何产生统计图
CURROW=
RANGESTRING='A1:'+'B'+ALLTRIM(STR(CURROW))
(RANGESTRING).SELECT
结束EXCEL
review &&预览打印
("C:My ") &&另存为
&&关闭一个工作表,如果有修改则提示
(.t.) &&提示另存为
(.f.) &&关闭一个工作表不用提示是否存盘
本文发布于:2023-04-21 23:58:51,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/82/508379.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |