回 帖 发 新 帖 刷新版面

主题:[原创]经典实例系列:VF控制EXCEL作折线图的经典实例一

题目名称:根据表中液量,油量,含水三个字段作图
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                                        否

回复列表 (共10个回复)

沙发

     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

板凳

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 楼

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 楼


看了你的帖子,觉得很经典,我也用在了我的程序上,但是这个方式X轴的数据是自己自动的,如何把想要的那一列数据添加进去,
比如我要做 日油——液量的图该如何做?
日油是X轴,液量是Y轴?

5 楼


我改了图表的类型,可是它只是一闪而过,又变成了原来的那个了,这是怎么回事?[em10]

6 楼

日油是X轴,液量是Y轴?
---------------------------------
日油,液量有关吗?

7 楼


我只是打个比方,因为现在画出来的是X轴的没法控制,是自动的,如何控制X轴的数据输入?

8 楼

日油——液量的图该如何做?
我们仍然可以利用“自动”这个特性。

大家可以看到数据填充循环:
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 楼

我改了图表的类型,可是它只是一闪而过,又变成了原来的那个了,这是怎么回事?

需要查找生成图的代码。
OLEAPP.ActiveChart.ChartType = 73            
73只是折线图
如果我没记错的话,柱状图是10

一闪而过说明该图表类型不存在,请换一个。
单个试是不现实的,-4401可能是立体柱状图,我没试。
谁有请告知。

10 楼


[em18][em18][em18]
请问各位大侠,我通过VFP生成的EXCEL工作薄中有3个工作表,而要插入柱状图的表是SHEET2,数据源也在SHEET2中,但是我使用:
    EOL.Charts.Add
    Eol.ActiveChart.Location( 2, "Sheet2")
命令后,为什么生成的图总是插入到"Sheet1"中啊?
严重郁闷中~~~~~~~[em10]

我来回复

您尚未登录,请登录后再回复。点此登录或注册