1.引言

通过VC实现对Excel表格的操作的方法有多种,如:通过ODBC数据库实现,通过解析Excel表格文件,通过OLE/COM的实现。本文主要研究通过OLE/COM实现对Excel表格的操作。

本文源码的应用环境说明:

Windows7 X64

Microsoft Visual Studio 2010

Microsoft Office Excel 2010

2.准备工作

1.导入并封装Excel的接口

Excel作为OLE/COM库插件,定义好了各类交互的接口,这些接口是跨语言的接口。VC可以通过导入这些接口,并通过接口来对Excel的操作。由于本文只关心对Excel表格中的数据的读取,主要关注几个_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range等几个接口。Excel的各类接口的属性、方法可以通过MSDN的Office Development进行查询。VS2010导入OLE/COM组件的接口的步骤为:Project->ClassWizard->Add Class->MFC Class From TypeLib,先选择要导入的组件所在的路径,即Excel.exe所在的路径,然后再选择要导入的Excel类型库中的接口。具体操作如图所示:

在完成接口导入后,VS2010将自动为导入的接口创建相应的实现类,用于对接口属性和方法的实现。由于标准的C++没有属性访问器,只能添加一个两个存取函数来实现对属性的访问,通过在属性名称前加上get_和put_前缀分别实现对属性的读写操作。即,由VC自动完成C++类对接口的封装。

本文所导入的接口对应的类和头文件的说明如下所示:

Application

CApplicaton

Application.h

Excel应用程序。

Workbooks

CWorkbooks

Workbooks.h

工作簿的容器,里面包括了Excel应用程序打开的所有工作簿。

_Workbook

CWorkbook

Workbook.h

单个工作簿。

Worksheets

CWorksheets

Worksheets.h

单个工作簿中的Sheet表格的容器,包括该工作簿中的所有Sheet。

_Worksheet

CWorksheet

Worksheet.h

单个Sheet表格。

Range

CRange

Range.h

一定数量的单元格,可对单元格进行单个或多个单元格进行操作。

备注:1.导入接口类后,将CApplication、CWorkbooks、CWorkbook、CWorksheet、CWorksheets、CRange类头文件中的#import语句屏蔽。如下所示:

2.在stafx.h文件中加入以下头文件包含语句:

#include <afxdisp.h>        // MFCAutomation classes

#include "CApplication.h"

#include "CRange.h"

#include "CWorkbook.h"

#include "CWorkbooks.h"

#include "CWorksheet.h"

#include "CWorksheets.h"

2. 添加OLE/COM支持

应用程序必须添加对OLE/COM的支持,才能导入OLE/COM组件。本文使用的是MFC对话框程序,在创建工程的向导中选中Automation选项即可为程序自动添加相应的头文件和OLE库初始化代码。在App类中的InitInstance()加入如下语句:

if (CoInitialize(NULL)!= 0)

{

AfxMessageBox(_T("初始化失败"));

exit(1);

}

用ClassWizard给App类添加虚函数ExitInstance(),在ExitInstance()中加入如下语句,进行com库资源释放.

CoUninitialize();  //释放com资源

现在运行程序会出现一个错误,双击错误提示,定位在错误行,

VARIANT DialogBox()

{

VARIANT result;

InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);

return result;

}

将该函数名“DialogBox()”前面加“_”下划线,即“_DialogBox()”,这样就可以编译成功了。

3.操作Excel

1.原理

Excel操作原理图

其中Application是Excel应用程序,每个Application都有一个工作薄容器Workbooks,工作薄容器中存放着所有的工作簿Workbook,我们平常打开的Excel都是一个工作簿;而每个工作簿中都有一个工作表容器Worksheets,工作表容器中存放着所有的工作表Worksheet;每个工作表中都许多有单元格Range。往Excel单元格中写入内容的过程就是这样一层层往下遍历。

2.操作Excel

操作Excel的主要步骤如下:

(1)创建一个Excel应用程序。

(2)得到Workbook的容器。

(3)打开一个Workbook或者创建一个Workbook。

(4)得到Workbook中的Worksheet的容器。

(5)打开一个Worksheet或者创建一个WorkSheet。

(6)通过Range对WorkSheet中的单元格进行读写操作。

(7)保存Excel。

(8)释放资源。

具体代码如下所示:

 CApplication ExcelApp;CWorkbooks wbsMyBooks;CWorkbook wbMyBook;CWorksheets wsMySheets;CWorksheet wsMySheet; CRange rgMyRge;CChart chart;CChartObjects chartObjects;     //图表容器对象CChartObject chartObject;       //图表对象COleVariantcovTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);LPDISPATCH lpDisp = NULL;//创建一个EXCEL应用程序实例if (!ExcelApp.CreateDispatch(_T("Excel.Application"), NULL)){AfxMessageBox(_T("创建Excel程序失败"));exit(1);}ExcelApp.put_Visible(TRUE);   //使程序可见ExcelApp.put_UserControl(FALSE);//将工作簿容器对象与应用程序工作簿关联wbsMyBooks.AttachDispatch(ExcelApp.get_Workbooks());//打开一个工作簿,如果不存在,则新增一个工作簿CString strFile = _T("C:\\Users\\Administrator\\Desktop\\123.xlsx");try{//打开一个工作簿lpDisp = wbsMyBooks.Open(strFile, vtMissing, vtMissing, vtMissing, vtMissing,vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);//将工作簿对象和打开的工作簿关联wbMyBook.AttachDispatch(lpDisp);}catch (...){//增加一个新的工作簿lpDisp = wbsMyBooks.Add(vtMissing);wbMyBook.AttachDispatch(lpDisp);}//获得工作表容器对象实例wsMySheets.AttachDispatch(wbMyBook.get_Sheets());//打开一个工作表,如果不存在则新增一个CString strSheetName = _T("NewSheet");try{//打开一个已有的工作表(wooksheet)lpDisp = wsMySheets.get_Item(_variant_t(strSheetName));wsMySheet.AttachDispatch(lpDisp);}catch(...){lpDisp = wsMySheets.Add(vtMissing, vtMissing, _variant_t((long)1), vtMissing);wsMySheet.AttachDispatch(lpDisp);wsMySheet.put_Name(strSheetName);     //创建工作表名}system("pause");/************************************************************************//* 添加单元格数据之方法二                                                                     *//************************************************************************///设置单元格的范围为全部区域lpDisp = wsMySheet.get_Cells();rgMyRge.AttachDispatch(lpDisp);//插入标题rgMyRge.put_Item(_variant_t((LONG)1),_variant_t((LONG)1),_variant_t("X"));rgMyRge.put_Item(_variant_t((LONG)1),_variant_t((LONG)2),_variant_t("Y1"));rgMyRge.put_Item(_variant_t((LONG)1),_variant_t((LONG)3),_variant_t("Y2"));// 将数据填入Excel表格for (int i = 0; i < 8; i++){rgMyRge.put_Item(_variant_t((LONG)(2+i)),_variant_t((LONG)1),_variant_t((long)(i+1)));rgMyRge.put_Item(_variant_t((LONG)(2+i)),_variant_t((LONG)2),_variant_t((long)((i+1)*(i+1))));rgMyRge.put_Item(_variant_t((LONG)(2+i)),_variant_t((LONG)3),_variant_t((long)((i+1)*2)));}//图表操作////图表chartdouble left = 200;double top = 160;double width = 450;double height = 260;//关联图表容器对象lpDisp = wsMySheet.ChartObjects(covOptional);ASSERT(lpDisp);chartObjects.AttachDispatch(lpDisp);//新建一个图表对象chartObject = chartObjects.Add(left, top, width, height);//关联图表对象lpDisp = chartObject.get_Chart();chart.AttachDispatch(lpDisp);chart.put_ChartType(72);   //设置图表类型//设置数据的有效区域lpDisp = wsMySheet.get_Range(COleVariant(_T("B1")), COleVariant(_T("C9")));ASSERT(lpDisp);VARIANT var;var.vt = VT_DISPATCH;var.pdispVal = lpDisp;chart.ChartWizard(var,                // Source.covOptional,  // GallerycovOptional,   // Format: 1~6.COleVariant((short)2),   // PlotBy: 指定系列中的数据是来自行(1)还是来自列(2).COleVariant((short)0),   // CategoryLabels.COleVariant((short)1),   // SeriesLabels.COleVariant((short)TRUE),  // HasLegend.COleVariant(_T("chart title")),  // Title.COleVariant(_T("XXX")),    // CategoryTitle.COleVariant(_T("YYY")),  // ValueTitles.covOptional              // ExtraTitle.);system("pause");/*根据文件的后缀名选择保存文件的格式*/CString strSaveAsName = _T("C:\\new.xlsx");wbMyBook.SaveCopyAs(_variant_t(strSaveAsName));wbMyBook.put_Saved(TRUE);ExcelApp.put_Visible(TRUE);system("pause");//释放资源chart.ReleaseDispatch();chartObject.ReleaseDispatch();chartObjects.ReleaseDispatch();rgMyRge.ReleaseDispatch();wsMySheet.ReleaseDispatch();wsMySheets.ReleaseDispatch();wbMyBook.ReleaseDispatch();wbsMyBooks.ReleaseDispatch(); ExcelApp.ReleaseDispatch();ExcelApp.Quit();

4.参考文献

1.http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html

2.http://www.cnblogs.com/yaowen/archive/2013/01/22/2870762.html

3.http://blog.csdn.net/stephen_kong/article/details/1362469

VS2010对Excel2010进行操作相关推荐

  1. VS2010 对Excel读写操作

    VS2010对Excel读写操作 一.开发环境 编程环境 VS2010 office版本 office 2010 注意 :这里office版本号不一定非得和vs版本号一致. 二.基本实现功能 基本实现 ...

  2. 计算机应用2010综合测试8,计算机应用基础excel2010综合测试操作步骤参考自测题步骤.docx...

    计算机应用基础excel2010综合测试操作步骤参考自测题步骤.docx 还剩 51页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价 ...

  3. 计算机应用2010操作题,计算机应用基础Excel2010综合测试操作步骤参考自测题步骤.doc...

    文档介绍: 开放教育大专计算机应用基础Excel2010综合测试操作步骤参考(请大家在安装光盘前务必把家里电脑装win7,word2010,excel2010)任务:打开考生文件夹中的EXCEL-2- ...

  4. VS2010 对Excel读写操作

    https://blog.csdn.net/ywx123_/article/details/77074038 VS2010对Excel读写操作 一.开发环境 编程环境 VS2010 office版本 ...

  5. 计算机excel2010操作题,计算机应用基础Excel2010综合测试操作步骤参考自测题步骤...

    仅供参考 完成以上操作后,原名保存到考生文件夹中. 解题步骤: 1.打开考生文件夹,双击打开EXCEL-5-17.xlsx→单击E4单元格,输入"商务出版社" 2.选中所有内容,单 ...

  6. VS2010测试功能之旅:编码的“.NET研究”UI测试(2)-操作动作的录制原理(上)...

    回顾  在之前我们介绍了如何用VS2010的UI测试功能创建一个简单的示例,大致描述了如何使用编码的UI测试进行录制和回放,在这章会着重描述VS2010是如何录制操作,并且生成代码,以及初步介绍如何通 ...

  7. 【转】VS2010测试功能之旅:编码的UI测试(2)-操作动作的录制原理(上)

    VS2010测试功能之旅 --编码的UI测试系列之二:操作动作的录制原理(上) RealZhao,2011年2月18日 回顾 在之前我们介绍了如何用VS2010的UI测试功能创建一个简单的示例,大致描 ...

  8. VS2010插件编写学习总结

    VS2010 Addins 外接程序(插件)开发 http://www.cnblogs.com/Leo_wl/archive/2013/03/21/2973886.html 简单做了一个添加文件头注视 ...

  9. 计算机应用基础电子表格操作题答案,国家开放大学《计算机应用基础》考试与答案形考任务模块3模块3Excel2010电子表格系统—客观题答案.docx...

    文档介绍: Excel2010上机操作题(共5题,4分/题)创建如下工作表,并保存为EXLT1.xlsx文件.接着完成以下操作:1)用填充柄自动填充"值日时间",从"星期 ...

最新文章

  1. linux 雷电接口,Intel完全开放雷电技术:底层融合USB 4
  2. linux系统加硬盘容量,Linux系统扩展硬盘空间
  3. python金融工程的工具包_金融工程及其Python应用
  4. linux系统ll历史,Linux操作系统原理笔记
  5. 【转】谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
  6. 老齐python-基础7(文件操作、迭代)
  7. 转载-C#委托之多播委托( 二)
  8. 5g网络架构_【5G网络架构】系列之五:5G核心网向to B演进
  9. 锤击测试使用指数窗会引起什么问题吗?
  10. 10.企业安全建设入门(基于开源软件打造企业网络安全) --- 数据库安全
  11. Linux和Docker常用命令
  12. 构建之法阅读笔记三—结对编程
  13. 量化交易 均线、金叉死叉计算与交易策略
  14. 瞬时问题与波粒二象性
  15. 苹果手机上网速度慢_手机4G上网慢、卡吗?几种设置让你的网速飞起来
  16. 波士顿房价预测python_多元线性回归—波士顿房价预测(版本一)
  17. 诚之和:各业务不断爆出裁员,字节跳动如何“过冬”?
  18. 关于Ubuntu18.04双系统安装后无法连接WiFi问题解决方法
  19. 修改.lnk文件的后缀
  20. 分支类1 7-3 根据输入的空气污染指数,输出相应的信息。 (5 分)

热门文章

  1. PyQt(Python+Qt)学习随笔:复选框checkBox的tristate属性
  2. 【Linux踩坑日记】:ubuntu环境下Linux系统没有网络连接,ifconfig查看发现只有lo,没有以太网eth0连接解决方法
  3. 港科夜闻|香港科大与中国联通成立联合实验室,推动智慧社会研究发展
  4. 大唐高鸿公安联网监控系统解决方案
  5. 干干净净的卸载Oracle
  6. 堆优化prim算法C语言,最小生成树(二)--prim算法实现以及堆优化
  7. 朗润国际期货:2022年财料人物、机构、商品
  8. LeedCode 69. Sqrt(x)
  9. 贴片按键开关_一键控制全屋家居产品?想实现全屋智能,先安装一套智能开关吧...
  10. 1. 网页、B/S架构