在
EXCEL
中手动能够执行的操作,在
VC
下,都能通过
COM
提供的技术来实现,下面是我在工作中使用智能指针对
EXCEL
的
CHART
操作的一点肤浅的认识。如果对
VC
操作
EXCEL
一点都不了解的话,建议先看看我写的上一篇日志,了解一下
EXCEL
的结构,因为下面很多内容都是基于上一篇文章。
要想生成一张图表,首先要了解图表由哪些元素组成,才能准确的操作这些元素,通过下图来说明:
首先,图表的形态是由图表类型和数据决定的,相同的数据不同的类型,会表现出不同样式的图表,例如柱形图、饼图、折线图等等,上图是一个
XY
散点图;相同的类型不同的数据产生不同形状的图表。
以上图为例,
XY
散点图主要由图表区、数据系列、坐标轴组成,左侧的
Y
称作做“(主)数值(
Y
)轴”,右侧的
Y
轴称作“次数值(
Y
)轴”,同样的
X
轴也分为“(主)数值(
X
)轴”和“次数值(
X
)轴”。
在上图中看到两条曲线,表明此图有两个数据系列,数据系列可以被理解为一组相同属性的数据点组成的折线,用
EXCEL
帮助的解释是:每个
数据标志
(数据标记:图表中的条形、面积、圆点、扇面或其他符号,代表源于数据表单元格的单个数据点或值。图表中的相关数据标记构成了数据系列。)
都代表来自于工作表中的一个数字。具有相同样式的数据标志代表一个
数据系列
。一个数据系列通常由标题、数据(
X
)轴、数据(
Y
)轴组成。
创建这样一个图标的一般步骤是:
1.
创建一个图表;
2.
创建数据系列,为数据系列选择数据集;
3.
为数据系列选择坐标轴;
4.
设置各个元素的属性,包括标题,颜色,字体,样式等等。
简单的介绍了图表的组成之后,我们来看
VC
的操作。我们假定生成图表的数据来源于名为“
DataSheet
”的工作表。
第一步,创建一个图表。
_ChartPtr
pChart = pBook->Charts->
Add
();
pChart->
PutChartType
(
xlXYScatterLinesNoMarkers
);
和工作表集合一样,在一个工作薄中包含一个图表集合
Charts
,通过图表集合的
Add
()函数插入一个空的图表到工作簿中,
pChart
智能指针对象代表新插入的图表,然后设置图标的类型,参数
xlXYScatterLinesNoMarkers
是一个常量,表示“无数据点折线散点图”,更多的图表类型可以查阅
EXCEL
的帮助。
第二步,创建数据系列,为每个数据系列添加数据。
SeriesCollectionPtr
pSeriesCollection ;
//
数据系列集合指针
SeriesPtr
pSeries ;
//
数据系列指针
RangePtr
pRange ;
//
数据集合指针
_
WorksheetPtr
pSheet ;
//
数据工作表指针
pSheet = m_pSheets->
GetItem
("DataSheet");
//
得到数据工作表指针
pSeriesCollection = pChart->
SeriesCollection
();
//
得到数据系列集合指针
pSeries = pSeriesCollection->
NewSeries
();
//
新建一个数据系列
pRange = pSheet->Range["E2"]["E50"];
//
得到数据集合
pSeries->
PutValues
((Range*)pRange);
//
设置数据系列
Y
轴的数据
pRange = pSheet->Range["F2"]["F50"];
//
得到数据集合
pSeries->
PutXValues
((Range*)pRange);
//
设置数据系列
X
轴的数据
主要是三个方法的应用,在数据系列集合中创建一个数据系列,设置数据系列的
Y
轴和
X
轴的数据集合。新创建的数据系列默认是(主)数值(
Y
)和(主)数值(
X
)轴组成,就像例图中的电流数据系列那样,创建例图中的电压数据系列只需要比在上面的代码中添加一句:
pSeries->AxisGroup =
xlSecondary
;
//
当前数据系列属于次数值轴
第三步,设置各个元素的属性
数据系列
Series
有很多的属性和方法。
1.
AxisPtr
表示坐标轴。
AxisPtr
pAxis = pChart->Axes(
xlCategory
,
xlPrimary
);
pAxis->PutHasTitle(TRUE);
//
设置坐标轴的标题可见
pAxis->AxisTitle->PutText(“
相对时间
”);
//
设置坐标轴的标题文本
通过
pChart
的
Axes
获得相应的坐标轴,第一个参数指定返回
X
轴,如果设为
xlValue
则返回
Y
轴;第二个参数表示返回坐标轴组,
xlPrimary
表示主坐标轴,
xlSecondary
表示返回次坐标轴。
下面代码比较简单,设置网格线的样式:
pAxis->MajorGridlines->Border->LineStyle =
xlDot
;
pAxis->MajorGridlines->Border->ColorIndex = 57;
pAxis->MajorGridlines->Border->Weight =
xlHairline
;
2.
PlotAreaPtr
表示图表区域。
PlotAreaPtr
pPA = pChart->
GetPlotArea
();
//
获得图表区域指针
pPA->Interior->ColorIndex =
xlNone
;
//
图表区域的底色设置为空,即为默认的白色
最后
pChart->
Location
(
xlLocationAsNewSheet
,
"NewChart")
将刚才创建的图表作为一个新的工作表并命名为
NewChart
。
一张还算有点复杂的图表通过上面提到的方法基本可以实现。其他更多的操作,可以通过下面的方式了解如何操作。
开启
EXCEL
的“录制新宏”功能,操作
EXCEL
生成需要的图表,然后停止录制。打开
Visual Basic
编辑器
,在“模块”中可以看到
VB
代码,在
VC
中可以找到相对应的操作。