您的位置:首页 > 编程语言 > C语言/C++

VC++ 操作EXCEL方法

2015-03-21 15:31 393 查看
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
plaincopy

在BOOL C***App::InitInstance()中的BOOL CMyApp::InitInstance()后加入以下代码:  

  

if (CoInitialize(NULL) != 0)  

  

       {  

  

              AfxMessageBox("初始化COM支持库失败!");  

  

              exit(1);  

  

       }  

释放COM

增加ExitInstance()虚函数

[cpp] view
plaincopy

int CMy5_7App::ExitInstance()   

  

{  

  

/////////////////////////////////////////////////  

  

       CoUninitialize();  

  

////////////////////////////////////////////////////释放COM支持库  

  

       returnCWinApp::ExitInstance();  

  

}   

定义变量:

[cpp] view
plaincopy

_Application app;   

  

Workbooks books;  

  

_Workbook book;  

  

Worksheets sheets;  

  

_Worksheet sheet;  

  

LPDISPATCH lpDisp;  //接口指针  

  

COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);   

打开已有的Excel文件

[cpp] view
plaincopy

 books.AttachDispatch(app.GetWorkbooks());     //得到books  

  

// 或者也可以    

  

// books = app.GetWorkbooks();    

  

lpDisp = books.Open("D:////1.xls", covOptional, covOptional,  covOptional,   covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional);    

得到book

 

[cpp] view
plaincopy

book.AttachDispatch( lpDisp );                          (方法一)//这是获取原有的book  

  

 book =books.Add(covOptional);     //得到Workbook     (方法二) //这是新建一个book  

  

objBook   =  objBooks.Open( "D:\\Excel\\demo.xls",           (方法三)  

   VOptional,   VOptional,  VOptional,   VOptional,     

   VOptional,   VOptional,  VOptional,   VOptional,     

   VOptional,   VOptional,  VOptional,   VOptional,  

   VOptional,   VOptional);  <span style="color:#333333;BACKGROUND: white">  

</span>  

 

得到sheets

[cpp] view
plaincopy

sheets = book.GetWorksheets();        //得到Worksheets  

得到sheet

[cpp] view
plaincopy

sheet = sheets.GetItem(COleVariant((short)1)); //得到Worksheet  

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

[cpp] view
plaincopy

     CApplication app;   

  

     CWorkbooks books;  

  

     CWorkbook book;  

  

     CWorksheets sheets;  

  

     CWorksheet sheet;  

  

     LPDISPATCH lpDisp;  

  

     COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  

  

         if(!app.CreateDispatch(L"Excel.Application"))  

  

         {  

  

              AfxMessageBox(L"无法创建Excel应用!");  

  

              return false;  

  

         }  

  

         books=app.get_Workbooks();  

  

         book = books.Open(L"D:////1.xls",covOptional, covOptional, covOptional,covOptional,covOptional, covOptional, covOptional, covOptional,covOptional,covOptional,covOptional, covOptional, covOptional,covOptional);  

  

sheets=book.get_Sheets();  

  

sheet=sheets.get_Item(COleVariant((short)0));  

  

Crange temp_range=sheet.get_Range(COleVariant(L”A1”),covOptional);  

  

COleVarianttemp_Value=COleVariant(temp_range.get_Value(covOptional));     

记得在退出时

[cpp] view
plaincopy

books.Close();  

  

app.Quit();  

心得:

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

如:

[cpp] view
plaincopy

Rangerange=sheet.GetRange(COleVariant("D8"),covOptional);  

  

COleVariantrValue;  

  

rValue=COleDateTime(range.GetValue(covOptional)); //  单元格中的数据为:0:01:15    

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: