主题:[原创]经典实例系列:VF控制EXCEL作折线图的经典实例一
梦江南123
[专家分:680] 发布于 2007-05-26 10:15:00
题目名称:根据表中液量,油量,含水三个字段作图
1.准备:建立表单,上有CHECK1和CHECK2两个按钮,用于选择是否是折线图和散点图,CHECK1和CHECK2设选中时值为1,选中一个CHECK时将另一个CHECK设成0,防止多选。
2.利用tempyj表作图,其实只用到3个字段,但为完整起见,全部列出。
tempyj.dbf表结构
1 JH 字符型 16 否
2 NY 字符型 6 否
3 SCTS 数值型 7 2 否
4 BJ 数值型 5 否
5 BJ1 数值型 5 否
6 BS 数值型 9 2 否
7 CC 数值型 7 2 否
8 CC1 数值型 6 1 否
9 SCJDDS1 数值型 9 2 否
10 SCJDDS2 数值型 9 2 否
11 YXHD 数值型 7 1 否
12 DYM 数值型 9 2 否
13 JYM 数值型 9 2 否
14 YCYL 数值型 7 否
最后更新于:2007-05-26 10:22:00
回复列表 (共10个回复)
沙发
梦江南123 [专家分:680] 发布于 2007-05-26 10:17:00
15 TY 数值型 7 2 否
16 BX 数值型 7 1 否
17 QJLJCYL 数值型 10 4 否
18 QJLJCSL 数值型 11 4 否
19 HS1 数值型 6 2 否
20 YCSL 数值型 8 否
21 BZ 字符型
*********程序开始
ERASE temp.xls
err_fnd=.F. && 默认启动Excel应用不发生错误
ON ERROR err_fnd=.T. && 出错捕捉,若有错令err_fnd变量值为真
OLEAPP=CreateObject("excel.application") && 启动一个Excel应用程序,相当于点击Excel启动它,并用OLEAPP这个变量来代表它
IF err_fnd && 若发生意外,如用户微机上未安装MS Excel软件则err_fnd值为真
?? CHR(7)
=MESSAGEBOX("本机尚未安装MS Excel,请先安装该软件!") && 提示信息
RETURN && 不绘图,返回
ENDIF
OLEAPP.VISIBLE = .T. &&处理过程中使工作表可见,为.F.则后台处理
OLEAPP.Workbooks.Add && 相当于我们启动Excel后按了\'新建\'快捷键,新建了一个空的工作簿(默认含有Sheet1、Sheet2和Sheet3三个工作表)
xlsheet=OLEAPP.Sheets(1) && 用xlsheet变量代表Sheet1工作表,这样省事否则你还得用OLEAPP.workbook1.sheet1那样的写法
if used("tempyj") &&不管什么情况,都打开tempyj表
SELECT tempyj
else
use d:\lzb\cyrb\tempyj.dbf
endif
板凳
梦江南123 [专家分:680] 发布于 2007-05-26 10:17:00
total_num=RECCOUNT() && 计算表中有多少条记录
GO top
row1=2
DO while .not.eof()
column1=1
xlsheet.Cells(row1,column1).value=rq && Cells(行,列),这里开始向Excel表格填数
column1=column1+1 && 列号加1
xlsheet.Cells(row1,column1).value=rcyl1 && 在同行下一列填数
column1=column1+1
xlsheet.Cells(row1,column1).value=pl
column1=column1+1
xlsheet.Cells(row1,column1).value=hy
SKIP
row1=row1+1 && 行号加1
enddo
use
OLEAPP.cells(1,1).value="" &&修改单元格内显示的字符(表头)
OLEAPP.cells(1,2).value="日液"
OLEAPP.cells(1,3).value="日油"
OLEAPP.cells(1,4).value="含水"
first1="A1"
last1="D"+ALLTRIM(STR(total_num+1))
fanwei=first1+":"+last1
xlsheet.Range(fanwei).select && Range对象代表工作表(Sheet)格子的一个范围,其形式为Range(x:y)。本例所填数范围在A1:B5,select表示选中指定范围
OLEAPP.Charts.Add && 添加一个图形对象,准备绘图
OLEAPP.ActiveChart.Location(1,"Sheet1") && 生成的图形内嵌于指定工作表。2:表示内嵌;1:表示图形单列不内嵌
OLEAPP.ActiveChart.SetSourceData(xlsheet.Range(fanwei),2) && 指定绘图数据源。其中的2表示数据是按列摆放;2表示按行摆放
*-------------------------------------------------------------------------------------------------
if thisform.check1.value=1
OLEAPP.ActiveChart.ChartType = 73 && 非立体折线图
endif
*-------------------------------------------------------------------------------------------------
OLEAPP.ActiveChart.HasLegend=.T. && 不显示图例
With OLEAPP.ActiveChart &&以下关于图表标题操作,自定义名,颜色,字体大小,粗体。
.IncrementLeft="-48.75"
.HasTitle = .T.
.ChartTitle.Characters.Text =myjh+"日生产曲线图"
.ChartTitle.Characters.font.ColorIndex = 10
.ChartTitle.Characters.font.size=32
.ChartTitle.Characters.font.Name = "黑体"
* .ChartTitle.Characters.font.FontStyle = "加粗"
* .Axes(1,1).HasTitle = .T. &&以下对横坐标轴操作,设名称,颜色,字体。
* .Axes(1,1).AxisTitle.Characters.Text = "日期"
* .Axes(1,1).AxisTitle.Characters.font.ColorIndex = 15
.Axes(1,1).AxisTitle.Characters.font.size=12
.Axes(2,1).HasTitle = .T. &&以下对纵坐标轴操作
.Axes(2,1).AxisTitle.Characters.Text = "液/油/含水"
.Axes(2,1).AxisTitle.Characters.font.size=16
.Axes(2,1).TickLabels = .T.
.Axes(2,1).TickLabels.font.size=12
.Axes(1,1).TickLabels = .T.
.Axes(1,1).TickLabels.font.size=12
EndWith
3 楼
梦江南123 [专家分:680] 发布于 2007-05-26 10:21:00
OLEAPP.ActiveChart.PlotArea.Select && 选中图形区
With OLEAPP.Selection.Interior
.ColorIndex = 2 && 设置图形区背景墙颜色(换成15再试试)
EndWith
With OLEAPP.ActiveChart.Axes(1)
.HasMajorGridlines = .F. && 要显示X轴方向主格线
.HasMinorGridlines = .F. && 不显示X轴方向副格线
EndWith
With OLEAPP.ActiveChart.Axes(2)
.HasMajorGridlines = .T. && 要显示Y轴方向主格线
.HasMinorGridlines = .F. && 不显示Y轴方向副格线
EndWith
OLEAPP.ActiveChart.Axes(2).MajorGridlines.Select &&设置画线类型
With OLEAPP.Selection.Border
.LineStyle = 6
EndWith
OLEAPP.ActiveChart.SeriesCollection(1).Select &&对已作出的图样式进行修改
With OLEAPP.Selection
.MarkerBackgroundColorIndex = 2
.MarkerForegroundColorIndex = 1
.MarkerStyle = 4
.Smooth = .T.
.MarkerSize = 3
.Shadow = .F.
EndWith
OLEAPP.ActiveChart.SeriesCollection(3).Select
With OLEAPP.Selection.Border
.ColorIndex = 9
endwith
xlsheet.Cells(1,8).select && 把焦点移至工作表头一个格子
OLEAPP.DisplayAlerts=.F. && 存盘时若文件重名不要向用户提示信息
fname="d:\temp\temp.xls" && 采用用户指定的文件名
OLEAPP.Application.CommandBars.Visible =.T.
OLEAPP.ActiveWorkbook.Saveas(fname) && 按指定的文件名存盘(本例为将abc.xls保存在C盘的根目录)
OLEAPP.visible=.T. && 显示文件内容
rele OLEAPP && 释放变量
return && 结束,返回VF命令窗口
---------------------------
本程序经使用,没有问题,可以直接拿来就用,体现了互联网共享的原则。
欢迎交流,希望我抛砖引玉,大家多发些好东西。
---------------------------
版主能否将此整理一下放到一个里面,我因字数限制将程序分割了好几部分,看着不舒服。
4 楼
zhangxia03 [专家分:120] 发布于 2007-05-27 14:52:00
看了你的帖子,觉得很经典,我也用在了我的程序上,但是这个方式X轴的数据是自己自动的,如何把想要的那一列数据添加进去,
比如我要做 日油——液量的图该如何做?
日油是X轴,液量是Y轴?
5 楼
zhangxia03 [专家分:120] 发布于 2007-05-27 15:46:00
我改了图表的类型,可是它只是一闪而过,又变成了原来的那个了,这是怎么回事?[em10]
6 楼
jinlonggao [专家分:17130] 发布于 2007-05-27 16:59:00
日油是X轴,液量是Y轴?
---------------------------------
日油,液量有关吗?
7 楼
zhangxia03 [专家分:120] 发布于 2007-05-27 17:42:00
我只是打个比方,因为现在画出来的是X轴的没法控制,是自动的,如何控制X轴的数据输入?
8 楼
梦江南123 [专家分:680] 发布于 2007-05-28 11:36:00
日油——液量的图该如何做?
我们仍然可以利用“自动”这个特性。
大家可以看到数据填充循环:
DO while .not.eof()
column1=1
xlsheet.Cells(row1,column1).value=rq && Cells(行,列),这里开始向Excel表格填数
column1=column1+1 && 列号加1
xlsheet.Cells(row1,column1).value=rcyl1 && 在同行下一列填数
column1=column1+1
xlsheet.Cells(row1,column1).value=pl
column1=column1+1
xlsheet.Cells(row1,column1).value=hy
SKIP
row1=row1+1 && 行号加1
enddo
此处需要增加或减少你所需的数据字段
比如去掉:
xlsheet.Cells(row1,column1).value=rq
xlsheet.Cells(row1,column1).value=hy
循环改为
DO while .not.eof()
column1=1
xlsheet.Cells(row1,column1).value=rcyl1 && 在同行下一列填数-日液
column1=column1+1
xlsheet.Cells(row1,column1).value=pl &&日油
SKIP
row1=row1+1 && 行号加1
enddo
还要注意
OLEAPP.cells(1,1).value="" &&修改单元格内显示的字符(表头)
OLEAPP.cells(1,2).value="日液"
OLEAPP.cells(1,3).value="日油"
OLEAPP.cells(1,4).value="含水"
语句。
要达到目的必须改为
OLEAPP.cells(1,1).value="" &&就看你想哪个当纵坐标了-日液
OLEAPP.cells(1,2).value="日油"
还要将
first1="A1"
last1="D"+ALLTRIM(STR(total_num+1))
改为
first1="A1"
last1="B"+ALLTRIM(STR(total_num+1))
只选两列就可以了!
再看看是不是按日液/日油横纵坐标生成了?
这就是利用了自动特性。
在EXCEL作图中,两列都有标题不能按作者要求做出图,但删除一个标头
OLEAPP.cells(1,1).value=""即可达到目的。这是EXCEL技巧,放在这里就扯远了。
你可以在EXCEL表中先操作一遍,生成图符合你的要求后,查看数据怎么填充,然后改动上述循环将数据放在合适的列。
9 楼
梦江南123 [专家分:680] 发布于 2007-05-28 11:41:00
我改了图表的类型,可是它只是一闪而过,又变成了原来的那个了,这是怎么回事?
需要查找生成图的代码。
OLEAPP.ActiveChart.ChartType = 73
73只是折线图
如果我没记错的话,柱状图是10
一闪而过说明该图表类型不存在,请换一个。
单个试是不现实的,-4401可能是立体柱状图,我没试。
谁有请告知。
10 楼
Malefox [专家分:0] 发布于 2007-07-04 08:12:00
[em18][em18][em18]
请问各位大侠,我通过VFP生成的EXCEL工作薄中有3个工作表,而要插入柱状图的表是SHEET2,数据源也在SHEET2中,但是我使用:
EOL.Charts.Add
Eol.ActiveChart.Location( 2, "Sheet2")
命令后,为什么生成的图总是插入到"Sheet1"中啊?
严重郁闷中~~~~~~~[em10]
我来回复