VC++ 操作EXCEL方法

from:http://blog.csdn.net/harvic880925/article/details/7674441

一、Excel的对象模型

    在对Excel编程之前首先要了解微软Excel对象(Object)模型。(Parent-Child关系)

 

其中:                图 1 Office应用程序对象模型(Excel)From msdn

 Application 对象:Application 对象表示 Excel 应用程序本身。Application 对象提供了大量有关正在运行的应用程序、应用于该实例的选项以及在该实例中打开的当前用户的对象的信息。
Workbook 对象:Workbook 类表示 Excel 应用程序内的单个工作簿。Application 类的许多成员同时也是 Workbook 类的成员。在这种情况下,属性应用于特定的工作簿(而非应用于活动工作簿)。
Worksheet 对象:虽然 Worksheet 类提供了大量成员,但大部分属性、方法和事件都与Application 和/或 Workbook 类提供的成员相同或相似。Excel 提供 Sheets 集合作为Workbook 对象的属性,但 Excel 中没有Sheet 类。实际上,Sheets 集合的每个成员不是Worksheet 对象就是 Chart 对象。
Range 对象:Range 对象是 Excel 应用程序中最常用的对象。在能够处理 Excel 内的任何范围之前,必须将它表示为 Range 对象,并处理该对象的方法和属性。Range 对象表示一个单元格、一行、一列、包含一个或多个单元格块(可以连续,也可以不连续)的单元格选定范围,甚至多个工作表中的一组单元格。
特殊函数说明:
COleVariant类: 实现对VARIANT数据类型的封装,主要用于实现其它数据类型与VARIANT类型的转换

增加类

1、在一个已有的MFC工程按Ctrl + W 弹出ClassWizard对话框。
2、AddClass...\From a type Library... 在 Office 目录中,找到你想使用的Excel类型库(Offce2000下,此目录在C:\Program Files\MicrosoftOffice\Office\EXCEL9.OLB)。选择EXCEL9.OLB此类型文件。(在2003版本中选择excel.exe)
3、在弹出的对话框中选择要添加的类,具体选那些类要根据实际情况而定。当然你也可以全选。

_Application    Workbooks    _Workbook     Worksheets      _Worksheet        Range  (常用的类)

 

初始化Com

[cpp]  view plain copy
  1. BOOL C***App::InitInstance()中的BOOL CMyApp::InitInstance()后加入以下代码:  
  2.   
  3. if (CoInitialize(NULL) != 0)  
  4.   
  5.        {  
  6.   
  7.               AfxMessageBox("初始化COM支持库失败!");  
  8.   
  9.               exit(1);  
  10.   
  11.        }  

释放COM

增加ExitInstance()虚函数

[cpp]  view plain copy
  1. int CMy5_7App::ExitInstance()   
  2.   
  3. {  
  4.   
  5. /  
  6.   
  7.        CoUninitialize();  
  8.   
  9. 释放COM支持库  
  10.   
  11.        returnCWinApp::ExitInstance();  
  12.   
  13. }   

定义变量:

[cpp]  view plain copy
  1. _Application app;   
  2.   
  3. Workbooks books;  
  4.   
  5. _Workbook book;  
  6.   
  7. Worksheets sheets;  
  8.   
  9. _Worksheet sheet;  
  10.   
  11. LPDISPATCH lpDisp;  //接口指针  
  12.   
  13. COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);   

打开已有的Excel文件

[cpp]  view plain copy
  1.  books.AttachDispatch(app.GetWorkbooks());     //得到books  
  2.   
  3. // 或者也可以    
  4.   
  5. // books = app.GetWorkbooks();    
  6.   
  7. lpDisp = books.Open("D:1.xls", covOptional, covOptional,  covOptional,   covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional);    

得到book

 

[cpp]  view plain copy
  1. book.AttachDispatch( lpDisp );                          (方法一)//这是获取原有的book  
  2.   
  3.  book =books.Add(covOptional);     //得到Workbook     (方法二) //这是新建一个book  
  4.   
  5. objBook   =  objBooks.Open( "D:\\Excel\\demo.xls",           (方法三)  
  6.    VOptional,   VOptional,  VOptional,   VOptional,     
  7.    VOptional,   VOptional,  VOptional,   VOptional,     
  8.    VOptional,   VOptional,  VOptional,   VOptional,  
  9.    VOptional,   VOptional);  <span style="color:#333333;BACKGROUND: white">  
  10. </span>  

 

得到sheets

[cpp]  view plain copy
  1. sheets = book.GetWorksheets();        //得到Worksheets  

得到sheet

[cpp]  view plain copy
  1. sheet = sheets.GetItem(COleVariant((short)1)); //得到Worksheet  

上面虽然写了一般的方法,我但一般不用AttachDispatch()的方法,因为这种方法常常要调用Release Dispatch()来释放,常常会因为忘记释放出现各种错误,所以我一般采用下面的方法

[cpp]  view plain copy
  1.      CApplication app;   
  2.   
  3.      CWorkbooks books;  
  4.   
  5.      CWorkbook book;  
  6.   
  7.      CWorksheets sheets;  
  8.   
  9.      CWorksheet sheet;  
  10.   
  11.      LPDISPATCH lpDisp;  
  12.   
  13.      COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
  14.   
  15.          if(!app.CreateDispatch(L"Excel.Application"))  
  16.   
  17.          {  
  18.   
  19.               AfxMessageBox(L"无法创建Excel应用!");  
  20.   
  21.               return false;  
  22.   
  23.          }  
  24.   
  25.          books=app.get_Workbooks();  
  26.   
  27.          book = books.Open(L"D:1.xls",covOptional, covOptional, covOptional,covOptional,covOptional, covOptional, covOptional, covOptional,covOptional,covOptional,covOptional, covOptional, covOptional,covOptional);  
  28.   
  29. sheets=book.get_Sheets();  
  30.   
  31. sheet=sheets.get_Item(COleVariant((short)0));  
  32.   
  33. Crange temp_range=sheet.get_Range(COleVariant(L”A1”),covOptional);  
  34.   
  35. COleVarianttemp_Value=COleVariant(temp_range.get_Value(covOptional));     

记得在退出时

[cpp]  view plain copy
  1. books.Close();  
  2.   
  3. app.Quit();  

心得:

1、在获取range范围内的值时,要根据不同的单元格格式,调用不同的转换函数,转换函数有ColeCurrency,ColeDateTime,ColeVariant,当单元格是时间或日期属性时,要用ColeDateTime转换

如:

[cpp]  view plain copy
  1. Rangerange=sheet.GetRange(COleVariant("D8"),covOptional);  
  2.   
  3. COleVariantrValue;  
  4.   
  5. rValue=COleDateTime(range.GetValue(covOptional)); //  单元格中的数据为:0:01:15    
  6.   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值