VC用OLE方式读写Excel

   (转自:http://blog.csdn.net/qinghezhen/article/details/9906023)

  前几天要做一个项目,需要读取Excel中的数据。从网上查资料发现,主要是有两种方式。一是把Excel表当成数据库使用ODBC读写,这样操作起来就跟操作Access数据库似的。但这种方式效率比较低。另一种方法是OLE技术(Object Linking and Embedding,对象连接与嵌入)。OLE是一种面向对象的技术,利用这种技术可开发可重复使用的软件组件(COM)。本文主要介绍使用OLE技术对Excel读写的方法。

本文中使用的环境是Windows XP,VS2008,Excel2007。

1) 在你建立的VC工程中点击“项目”->“添加类”->“TypeLib中的MFC类”->点击“确定”

2) 这时会出现一个“从类型库添加类向导”对话框,选中“文件”选项,然后选择文件位置:C:\Program Files\Microsoft Office\Office12\EXCEL.EXE 将接口列表中的_Application,_Workbook,_Worksheet,Range,Ranges,Workbooks,Worksheets等接口添加到右侧。点击“完成”。

 3) 给VC工程添加一个新的C++类,命名为CExcel。在excel.h文件中添加以下头文件:

#include "CApplication.h"

#include "CRange.h"

#include "CRanges.h"

#include "CWorkbook.h"

#include "CWorkbooks.h"

#include "CWorksheet.h"

#include "CWorksheets.h"

4)依次打开以上添加的7个头文件,把每个文件中的#import "C:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" no_namespace 这一行注释掉(否则后面会报错)。另外要把CRange.h文件中第335行VARIANT DialogBox()中的DialogBox换个名字,例如可以换成ExcelDialogBox()。

至此准备工作完毕,剩下的就是把对Excel的操作封装成一个类了。首先创建一个Excel服务器,然后就是根据各个头文件中提供的函数,打开Excel,获取workbook,获取worksheet,选择某个单元格,获取该单元格的值。或者是选择某一片区域(Range)然后将该区域内的值输出在一个二维数组里。

[cpp]  view plain copy
  1. #include "CApplication.h"  
  2. #include "CRange.h"  
  3. #include "CRanges.h"  
  4. #include "CWorkbook.h"  
  5. #include "CWorkbooks.h"  
  6. #include "CWorksheet.h"  
  7. #include "CWorksheets.h"  
  8.   
  9. #pragma once  
  10. class CExcel  
  11. {  
  12. public:  
  13.     CExcel(void);  
  14.     ~CExcel(void);  
  15.     void OpenExcel(CString path);  
  16.     void OpenSheet(CString SheetName);  
  17.     CString GetCellValue(long row,long col);  
  18.     CString GetCellValueByName(CString rowName,CString colName);  
  19. private:  
  20.     CApplication app;  
  21.     CWorkbooks books;  
  22.     CWorkbook book;  
  23.     CWorksheets sheets;  
  24.     CWorksheet sheet;  
  25.     CRange range;  
  26.     LPDISPATCH lpDisp;  
  27. };  


[cpp]  view plain copy
  1. #include "StdAfx.h"  
  2. #include "Excel.h"  
  3.   
  4.   
  5. CExcel::CExcel(void)  
  6. {  
  7.     if(!app.CreateDispatch(_T("Excel.Application"),NULL))  
  8.     {  
  9.         AfxMessageBox(_T("启动Excel服务器失败!"));  
  10.     }  
  11.     lpDisp = NULL;  
  12. }  
  13. CExcel::~CExcel(void)  
  14. {  
  15.     app.ReleaseDispatch();  
  16.     books.ReleaseDispatch();  
  17.     book.ReleaseDispatch();  
  18.     sheets.ReleaseDispatch();  
  19.     sheet.ReleaseDispatch();  
  20.     range.ReleaseDispatch();  
  21. }  
  22. void CExcel::OpenExcel(CString path)  
  23. {  
  24.       books.AttachDispatch(app.get_Workbooks(),1);  
  25.       COleVariant varPath(path);  
  26.       book.AttachDispatch(books.Add(varPath));  
  27. }  
  28. void CExcel::OpenSheet(CString SheetName)  
  29. {  
  30.     sheets.AttachDispatch(book.get_Sheets(),TRUE);  
  31.     COleVariant var2(SheetName);  
  32.     sheet.AttachDispatch(sheets.get_Item(var2),TRUE);  
  33. }  
  34. CString CExcel::GetCellValue(long row,long col)  
  35. {  
  36.     _variant_t varRow(row);  
  37.     _variant_t varCol(col);  
  38.     COleVariant value;  
  39.   
  40.     range.AttachDispatch(sheet.get_Cells(),TRUE);  
  41.     value=range.get_Item(varRow,varCol);                    //返回的类型是VT_DISPATCH 这是一个指针  
  42.     range.AttachDispatch(value.pdispVal,TRUE);  
  43.     VARIANT value2=range.get_Text();  
  44.     CString strValue=value2.bstrVal;  
  45.     return strValue;  
  46. }  
  47. CString CExcel::GetCellValueByName(CString rowName,CString colName)  
  48. {  
  49.     COleVariant value;  
  50.     CString strValue;  
  51.     long row=0,col=0;  
  52.     long re_row=0,re_col=0;  
  53.     range.AttachDispatch(sheet.get_Cells(),TRUE);  
  54.     for (row=1,col=1;col<range.get_Column();col++)  
  55.     {  
  56.         value=range.get_Item(_variant_t(row),_variant_t(col));                  //返回的类型是VT_DISPATCH 这是一个指针  
  57.         range.AttachDispatch(value.pdispVal,TRUE);  
  58.         VARIANT value2=range.get_Text();  
  59.         CString strValue=value2.bstrVal;  
  60.         if (strValue==colName)  
  61.             break;  
  62.     }  
  63.     re_col=col;  
  64.     for (row=1,row=1;row<range.get_Row();row++)  
  65.     {  
  66.         value=range.get_Item(_variant_t(row),_variant_t(col));                  //返回的类型是VT_DISPATCH 这是一个指针  
  67.         range.AttachDispatch(value.pdispVal,TRUE);  
  68.         VARIANT value2=range.get_Text();  
  69.         CString strValue=value2.bstrVal;  
  70.         if (strValue==rowName)        
  71.             break;  
  72.     }  
  73.     re_row=row;  
  74.     return GetCellValue(re_row,re_col);  
  75. }  

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值