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
- 在BOOL C***App::InitInstance()中的BOOL CMyApp::InitInstance()后加入以下代码:
- if (CoInitialize(NULL) != 0)
- {
- AfxMessageBox("初始化COM支持库失败!");
- exit(1);
- }
释放COM
增加ExitInstance()虚函数
- int CMy5_7App::ExitInstance()
- {
- /
- CoUninitialize();
- 释放COM支持库
- returnCWinApp::ExitInstance();
- }
定义变量:
- _Application app;
- Workbooks books;
- _Workbook book;
- Worksheets sheets;
- _Worksheet sheet;
- LPDISPATCH lpDisp; //接口指针
- COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
打开已有的Excel文件
- 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
- 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
- sheets = book.GetWorksheets(); //得到Worksheets
得到sheet
- sheet = sheets.GetItem(COleVariant((short)1)); //得到Worksheet
上面虽然写了一般的方法,我但一般不用AttachDispatch()的方法,因为这种方法常常要调用Release Dispatch()来释放,常常会因为忘记释放出现各种错误,所以我一般采用下面的方法
- 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));
记得在退出时
- books.Close();
- app.Quit();
心得:
1、在获取range范围内的值时,要根据不同的单元格格式,调用不同的转换函数,转换函数有ColeCurrency,ColeDateTime,ColeVariant,当单元格是时间或日期属性时,要用ColeDateTime转换
如:
- Rangerange=sheet.GetRange(COleVariant("D8"),covOptional);
- COleVariantrValue;
- rValue=COleDateTime(range.GetValue(covOptional)); // 单元格中的数据为:0:01:15