演示一下如何通过VC操作Excel生成下面这样的一个图表,它有两个系列,每个系列都拥有自己的X轴数据和Y轴数据,同时显示其线性的渐近线(TrendLine)以及获取其渐近线公式,因为在项目当中有时候需要其渐近线公式进行分析。
具体的代码演示如下:
// 变量的定义 _Application app; Workbooks books; _Workbook book; Worksheets sheets; _Worksheet sheet; Range range; LPDISPATCH lpDisp; COleVariant vResult; _Chart chart; ChartObjects chartobjects; ChartObject chartobject; SeriesCollection serc; Series sercies; ChartTitle charttitle; AxisTitle axistitle; Axis axis; Trendlines trendlines; Trendline trendline; DataLabel dataLabel; Font ft; VARIANT var; CString str; COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //创建Excel 2003服务器(启动Excel) if (!app.CreateDispatch("Excel.Application",NULL)) { AfxMessageBox("Create Excel service failure!"); return; } // 设置为FALSE时,后面的app.Quit();注释要打开 // 否则EXCEL.EXE进程会一直存在,并且每操作一次就会多开一个进程 app.SetVisible(TRUE); books.AttachDispatch(app.GetWorkbooks(),true); book = books.Add(covOptional); // 添加一个工作簿,这里没有open操作,在最后调用SaveCopyAs另存为 // 得到Worksheets sheets.AttachDispatch(book.GetWorksheets(),true); // 得到Worksheet sheet.AttachDispatch(sheets.GetItem(_variant_t((short)(1)))); // 得到全部Cells range.AttachDispatch(sheet.GetCells(),true); range.SetItem(_variant_t((LONG)1),_variant_t((LONG)1),_variant_t("X1")); range.SetItem(_variant_t((LONG)1),_variant_t((LONG)2),_variant_t("X2")); range.SetItem(_variant_t((LONG)1),_variant_t((LONG)4),_variant_t("Y1")); range.SetItem(_variant_t((LONG)1),_variant_t((LONG)5),_variant_t("Y2")); // 将数据填入Excel表格 for (int i = 0; i < 8; i++) { range.SetItem(_variant_t((LONG)(2+i)),_variant_t((LONG)1),_variant_t((long)(i+1))); range.SetItem(_variant_t((LONG)(2+i)),_variant_t((LONG)2),_variant_t((long)(i+3))); range.SetItem(_variant_t((LONG)(2+i)),_variant_t((LONG)4),_variant_t((long)((i+1)*(i+1)))); range.SetItem(_variant_t((LONG)(2+i)),_variant_t((LONG)5),_variant_t((long)((i+1)*(i+2)))); } // 图表(chart) /****************************************************************************************************/ double left = 200, top = 160, width = 450, height = 260; lpDisp = sheet.ChartObjects(covOptional); ASSERT(lpDisp); chartobjects.AttachDispatch(lpDisp); chartobject = chartobjects.Add(left, top, width, height); chart.AttachDispatch(chartobject.GetChart()); chart.SetChartType(74); // xlXYScatterLines = 74 var.vt = VT_DISPATCH; // 系列1 A /*********************************************************************************/ serc = chart.SeriesCollection(covOptional); sercies = serc.NewSeries(); lpDisp = sheet.GetRange(_variant_t("A2"), _variant_t("A9")); var.pdispVal = lpDisp; sercies.SetXValues(var); // 设置X轴的数据 lpDisp = sheet.GetRange(_variant_t("D2"), _variant_t("D9")); var.pdispVal = lpDisp; sercies.SetValues(var); // 设置Y轴的数据 sercies.SetName("A"); // 添加趋势线 trendlines = sercies.Trendlines(covOptional); trendline = trendlines.Add(-4132, covOptional, covOptional, covOptional, covOptional, covOptional, _variant_t((long)1), _variant_t((long)0), covOptional); // xlDataSeriesLinear = -4132 dataLabel = trendline.GetDataLabel(); ft = dataLabel.GetFont(); ft.SetColorIndex(_variant_t((long)5)); // blue str = dataLabel.GetText(); // 获取趋势线的公式 // 系列2 B /*********************************************************************************/ serc = chart.SeriesCollection(covOptional); sercies = serc.NewSeries(); lpDisp = sheet.GetRange(_variant_t("B2"), _variant_t("B9")); var.pdispVal = lpDisp; sercies.SetXValues(var); // 设置X轴的数据 lpDisp = sheet.GetRange(_variant_t("E2"), _variant_t("E9")); var.pdispVal = lpDisp; sercies.SetValues(var); // 设置Y轴的数据 sercies.SetName("B"); // 添加趋势线 trendlines = sercies.Trendlines(covOptional); trendline = trendlines.Add(-4132, covOptional, covOptional, covOptional, covOptional, covOptional, _variant_t((long)1), _variant_t((long)0), covOptional); // xlDataSeriesLinear = -4132 dataLabel = trendline.GetDataLabel(); ft = dataLabel.GetFont(); ft.SetColor(_variant_t((long)0xEE00EE)); str = dataLabel.GetText(); // 获取趋势线的公式 chart.Location(2, _variant_t("Sheet1")); chart.SetHasTitle(TRUE); // 设置图表标题 charttitle = chart.GetChartTitle(); charttitle.SetText("图表标题"); // 设置X坐标轴 axis = chart.Axes(_variant_t((long)1), 1); axis.SetHasTitle(TRUE); // 设置坐标轴的标题可见 axistitle = axis.GetAxisTitle(); axistitle.SetText("X轴标题"); // 设置X坐标轴的标题文本 // 设置Y坐标轴 axis = chart.Axes(_variant_t((long)2), 1); axis.SetHasTitle(TRUE); // 设置坐标轴的标题可见 axistitle = axis.GetAxisTitle(); axistitle.SetText("Y轴标题"); // 设置Y坐标轴的标题文本 book.SaveCopyAs(_variant_t("E://test.xls")); app.SetDisplayAlerts(false); // 不弹出对话框询问是否保存 // app.Quit(); // 退出 //释放对象 range.ReleaseDispatch(); sheet.ReleaseDispatch(); sheets.ReleaseDispatch(); book.ReleaseDispatch(); books.ReleaseDispatch(); app.ReleaseDispatch();
