1、MSChart生成图表保存图片导入到ExcelMSChart生成图表保存图片导入到Excel少将 第 1 页 2018-9-211设计思路 12实现步骤 12.1使用MSChart生成图表 12.1.1注册控件 12.1.2添加控件到工程 22.1.3导入头文件 22.1.4编写代码 22.2将图表保存到剪贴板中 62.3将剪贴板的图片保存为文件 72.3.1剪贴板操作 72.3.2保存图文为文件的方法 72.4导出图片到Excel 92.4.1添加Excel支持库 92.4.2添加头文件 92.4.3编写代码 91设计思路1 使用MSChart控件设计图表2 生成图表后调用其EditCopy
2、()方法将图片保存到剪贴版中3 打开剪贴板获取图片并将其保存为文件4 打开Excel将图片插入到Excel当中并插入统计数据2实现步骤2.1使用MSChart生成图表2.1.1注册控件使用regsvr32命令注册控件2.1.2添加控件到工程工程增加到工程组件和控件选择控件Insert2.1.3导入头文件1在对话框头文件中加入:#include mschart.h2在对话框源文件中加入:#include VcPlot.h#include VcAxis.h#include VcValueScale.h#include VcSeriesCollection.h#include VcSeries.h#
3、include VcPen.h#include VcCategoryScale.h#include VcColor.h#include VcDataGrid.h#include VcBackdrop.h#include VcFill.h#include VcBrush.h#include VcDataPoints.h#include VcDataPoint.h#include VcDataPointLabel.h#include VcAxisTitle.h#include math.h#include VcAxisGrid.h#include VcAxisScale.h2.1.4编写代码 1变
4、量和函数定义: void DrawChart(); void initmschart(); void OnChartLine(); void OnChartCombi(); void OnChartPie();CMSChart m_Chart;2初始化和函数的实现:TestMSChartDlg:OnInitDialog():/创建图表CRect rc;GetClientRect(&rc);rc.bottom-=50;m_Chart.Create(mschart, WS_CHILD| WS_VISIBLE, rc, this, 10);initmschart();DrawChart();init
5、mschart():/初始化图表void CTestMSChartDlg:initmschart() / 设置标题 m_Chart.SetTitleText(mschart 示例); / 下面两句改变背景色 m_Chart.GetBackdrop().GetFill().SetStyle(1); m_Chart.GetBackdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255); / 显示图例 m_Chart.SetShowLegend(TRUE); m_Chart.SetColumn(1); m_Chart.SetColu
6、mnLabel(LPCTSTR)1号机); m_Chart.SetColumn(2); m_Chart.SetColumnLabel(LPCTSTR)2号机); m_Chart.SetColumn(3); m_Chart.SetColumnLabel(LPCTSTR)3号机); / 栈模式 /m_Chart.SetStacking(TRUE); /X轴设置 m_Chart.SetRowCount(6); char buf32; for(int row=1;row=6;+row) m_Chart.SetRow(row); sprintf(buf, %d号, row); m_Chart.SetRo
7、wLabel(LPCTSTR)buf); VARIANT varX; / 不自动标注X轴刻度 m_Chart.GetPlot().GetAxis(0,varX).GetCategoryScale().SetAuto(FALSE); / 每刻度一个标注 m_Chart.GetPlot().GetAxis(0,varX).GetCategoryScale().SetDivisionsPerLabel(1); / 每刻度一个刻度线 m_Chart.GetPlot().GetAxis(0,varX).GetCategoryScale().SetDivisionsPerTick(1); / X轴名称 m
8、_Chart.GetPlot().GetAxis(0,varX).GetAxisTitle().SetText(日期); / Y轴设置 VARIANT varY; m_Chart.GetPlot().GetAxis(1,varY).GetValueScale().SetAuto(FALSE); / 不自动标注Y轴刻度 m_Chart.GetPlot().GetAxis(1,varY).GetValueScale().SetMaximum(100); / Y轴最大刻度 m_Chart.GetPlot().GetAxis(1,varY).GetValueScale().SetMinimum(0);
9、 / Y轴最小刻度 m_Chart.GetPlot().GetAxis(1,varY).GetValueScale().SetMajorDivision(5); / Y轴刻度5等分 m_Chart.GetPlot().GetAxis(1,varY).GetValueScale().SetMinorDivision(1); / 每刻度一个刻度线 m_Chart.GetPlot().GetAxis(1,varY).GetAxisTitle().SetText(小时); / Y轴名称 / 3条曲线 m_Chart.SetColumnCount(3); / 线色 m_Chart.GetPlot().G
10、etSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255); m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().GetVtColor().Set(255, 0, 0); m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetPen().GetVtColor().Set(0, 255, 0); / 线宽(对点线图有效) m_Chart.GetPlot().GetSeriesCollection()
11、.GetItem(1).GetPen().SetWidth(50); m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().SetWidth(100); m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetPen().SetWidth(2); / 数据点类型显示数据值的模式(对柱柱状图和点线图有效) / 0: 不显示 1: 显示在柱状图外 / 2: 显示在柱状图内上方 3: 显示在柱状图内中间 4: 显示在柱状图内下方 m_Chart.GetPlot().GetSeries
12、Collection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); m_Chart.GetPlot().GetSeriesCollection().GetItem(3).GetDataPoints().GetItem(-1).GetDataPoi
13、ntLabel().SetLocationType(1); /不要与x轴垂直的表格线 m_Chart.GetPlot().GetAxis(0,varX).GetAxisGrid().GetMajorPen().SetStyle(0);/ no x grids /隐藏第二y轴,即右边的y轴 m_Chart.GetPlot().GetAxis(2,varY).GetAxisScale().SetHide(TRUE);DrawChart():/设置数据void CTestMSChartDlg:DrawChart() /*int nRowCount = 6; char buf32; srand( (u
14、nsigned)time( NULL ) ); for(int row = 1; row = nRowCount; +row) m_Chart.SetRow(row); sprintf(buf, %d号, row); m_Chart.SetRowLabel(LPCTSTR)buf); m_Chart.GetDataGrid().SetData(row, 1, rand() * 100 / RAND_MAX, 0); m_Chart.GetDataGrid().SetData(row, 2, rand() * 100 / RAND_MAX, 0); m_Chart.GetDataGrid().S
15、etData(row, 3, rand() * 100 / RAND_MAX, 0); */ for(int row=1;row=6;+row) m_Chart.GetDataGrid().SetData(row, 1, 11*row, 0); m_Chart.GetDataGrid().SetData(row, 2, 22*row, 0); m_Chart.GetDataGrid().SetData(row, 3, 33*row, 0); m_Chart.Refresh(); /复制到剪贴板 m_Chart.EditCopy(); OnBtnsave(); 设置图例类型/* 3:曲线型;1:
16、条形;14:饼图,0:三维显示,1:二维显示 m_Chart.SetChartType(1|0) /2D柱(条)形, m_Chart.SetChartType(0|0) /3D柱(条)形 m_Chart.SetChartType(1|2) /2D线条型 m_Chart.SetChartType(0|2) /3D线条型 m_Chart.SetChartType(1|4) /2D区域型 m_Chart.SetChartType(0|4) /3D区域型 m_Chart.SetChartType(1|6) /2D阶梯型 m_Chart.SetChartType(0|6) /3D阶梯型 m_Chart.
17、SetChartType(1|8) /2D复(混)合型 m_Chart.SetChartType(0|8) /3D复(混)合型 另外,在2D方式中,还有两类:饼型和XY型 m_Chart.SetChartType(14) /2D 饼型 m_Chart.SetChartType(16) /2DXY型*/ 折线图void CTestMSChartDlg:OnChartLine() m_Chart.SetChartType(3); DrawChart();/ 柱状图 void CTestMSChartDlg:OnChartCombi() m_Chart.SetChartType(1); DrawCh
18、art();/ 饼状图void CTestMSChartDlg:OnChartPie() m_Chart.SetChartType(14); DrawChart();2.2将图表保存到剪贴板中 调用m_Chart.EditCopy()方法实现2.3将剪贴板的图片保存为文件2.3.1剪贴板操作 /从剪贴板获得图片并保存到文件中 if(OpenClipboard() HBITMAP handle=(HBITMAP)GetClipboardData(CF_BITMAP); MySaveBmpTofile(handle,C:a.bmp); CloseClipboard(); 2.3.2保存图文为文件的
19、方法/参数说明: hbmp :需保存的图象的句柄,path :保存路径void CTestMSChartDlg:MySaveBmpTofile(HBITMAP hbmp,CString path) /定义文件头结构 BITMAPFILEHEADER fileHead; int fileHeadLen = sizeof( BITMAPFILEHEADER ); /定义图象信息结构 BITMAPINFOHEADER bmpHead; int bmpHeadLen =sizeof( BITMAPINFOHEADER ); /获取位图对象 BITMAP bmpObj; GetObject( hbmp,
20、 sizeof(BITMAP), &bmpObj ); /文件总的字节大小 DWORD fileSizeInByte; /获取系统颜色深度,即每个象素用多少位表示 DWORD PixelSizeInBit; /系统屏幕设备描述表 CDC srcDC; srcDC.CreateDC( DISPLAY, NULL, NULL, NULL); /获取每个像素所占位 PixelSizeInBit=srcDC.GetDeviceCaps( BITSPIXEL ) * srcDC.GetDeviceCaps( PLANES ); /获取总的字节大小 fileSizeInByte = fileHeadLen
21、 + bmpHeadLen + bmpObj.bmWidth*bmpObj.bmHeight*PixelSizeInBit/8; /初始化文件头结构 fileHead.bfOffBits = fileHeadLen + bmpHeadLen; fileHead.bfReserved1=0; fileHead.bfReserved2=0; fileHead.bfSize = fileSizeInByte; fileHead.bfType = 0x4D42; /初始图像信息结构 bmpHead.biBitCount = PixelSizeInBit; bmpHead.biCompression =
22、 BI_RGB; bmpHead.biPlanes = 1; bmpHead.biHeight = bmpObj.bmHeight; bmpHead.biWidth = bmpObj.bmWidth; bmpHead.biSize = bmpHeadLen; /为文件分配空间 PBYTE pFile=new byte fileSizeInByte ; memset( pFile, 0, fileSizeInByte ); /填充文件头部 memcpy( pFile, (PBYTE)&fileHead, fileHeadLen); /填充文件信息头部结构 memcpy( pFile+fileHe
23、adLen, (PBYTE)&bmpHead, bmpHeadLen); /填充象素部分 GetDIBits( srcDC.m_hDC, hbmp, 0, bmpObj.bmHeight, pFile+fileHeadLen+bmpHeadLen, (LPBITMAPINFO)(pFile+fileHeadLen), DIB_RGB_COLORS); /打开文件并写入数据 HANDLE hFile; hFile=CreateFile( path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_S
24、EQUENTIAL_SCAN, NULL); if( hFile=INVALID_HANDLE_VALUE ) MessageBox( 创建文件失败 ); return; DWORD nByteTransfered; WriteFile( hFile, pFile, fileSizeInByte, &nByteTransfered, NULL); CloseHandle( hFile ); /清理 delete pFile; srcDC.DeleteDC();2.4导出图片到Excel2.4.1添加Excel支持库查看建立类向导AutomationAdd ClassFrom a type li
25、baray找到Excel.exe添加所有支持类2.4.2添加头文件#include excel.h#include comdef.h/使用COM变量时需要使用2.4.3编写代码void CTestMSChartDlg:OnBtnexcel() / TODO: Add your control notification handler code here _Application app; Workbooks books; _Workbook newBook; Worksheets sheets; _Worksheet newSheet; Shapes m_oShapes; Range rang
26、e; COleVariant vOpt(long)DISP_E_PARAMNOTFOUND, VT_ERROR); /启动应用程序 if(!app.CreateDispatch(Excel.Application) AfxMessageBox(Cant start Excel server!); return; /设置应用程序可见 app.SetVisible(true); /获取工作薄集合 books = app.GetWorkbooks(); /打开一个工作薄 /*newBook=books.Open(C:mynew.xls,vOpt, vOpt, vOpt, vOpt, vOpt, vO
27、pt, vOpt, vOpt, vOpt, vOpt,vOpt, vOpt,vOpt,vOpt); */ newBook=books.Add(vOpt); /获取Sheets sheets = newBook.GetSheets(); /打开一个Sheet newSheet = sheets.GetItem(COleVariant(short)1); /获取形状Shape m_oShapes.AttachDispatch(newSheet.GetShapes(); /加载一幅图片到指定的位置 m_oShapes.AddPicture(_T(C:a.bmp),false,true,0,0,500
28、,300); /设置数据 range.AttachDispatch(newSheet.GetCells(),true); range.SetItem(_variant_t(long)23),_variant_t(long)1),_variant_t(周悦芬); newBook.SetSaved(true); app.ReleaseDispatch(); books.ReleaseDispatch(); newBook.ReleaseDispatch(); sheets.ReleaseDispatch(); newSheet.ReleaseDispatch(); m_oShapes.ReleaseDispatch(); range.ReleaseDispatch();