在 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 中可以找到相对应的操作。