zoukankan      html  css  js  c++  java
  • VC用OLE方式读写Excel

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

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

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

    2) 这时会出现一个“从类型库添加类向导”对话框,选中“文件”选项,然后选择文件位置:C:Program FilesMicrosoft OfficeOffice12EXCEL.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)然后将该区域内的值输出在一个二维数组里。

     

    #include "CApplication.h"
    #include "CRange.h"
    #include "CRanges.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    
    #pragma once
    class CExcel
    {
    public:
    	CExcel(void);
    	~CExcel(void);
    	void OpenExcel(CString path);
    	void OpenSheet(CString SheetName);
    	CString GetCellValue(long row,long col);
    	CString GetCellValueByName(CString rowName,CString colName);
    private:
    	CApplication app;
    	CWorkbooks books;
    	CWorkbook book;
    	CWorksheets sheets;
    	CWorksheet sheet;
    	CRange range;
    	LPDISPATCH lpDisp;
    };


     

    #include "StdAfx.h"
    #include "Excel.h"
    
    
    CExcel::CExcel(void)
    {
    	if(!app.CreateDispatch(_T("Excel.Application"),NULL))
    	{
    		AfxMessageBox(_T("启动Excel服务器失败!"));
    	}
    	lpDisp = NULL;
    }
    CExcel::~CExcel(void)
    {
    	app.ReleaseDispatch();
    	books.ReleaseDispatch();
    	book.ReleaseDispatch();
    	sheets.ReleaseDispatch();
    	sheet.ReleaseDispatch();
    	range.ReleaseDispatch();
    }
    void CExcel::OpenExcel(CString path)
    {
    	  books.AttachDispatch(app.get_Workbooks(),1);
    	  COleVariant varPath(path);
    	  book.AttachDispatch(books.Add(varPath));
    }
    void CExcel::OpenSheet(CString SheetName)
    {
    	sheets.AttachDispatch(book.get_Sheets(),TRUE);
    	COleVariant var2(SheetName);
    	sheet.AttachDispatch(sheets.get_Item(var2),TRUE);
    }
    CString CExcel::GetCellValue(long row,long col)
    {
    	_variant_t varRow(row);
    	_variant_t varCol(col);
    	COleVariant value;
    
    	range.AttachDispatch(sheet.get_Cells(),TRUE);
    	value=range.get_Item(varRow,varCol);					//返回的类型是VT_DISPATCH 这是一个指针
    	range.AttachDispatch(value.pdispVal,TRUE);
    	VARIANT value2=range.get_Text();
    	CString strValue=value2.bstrVal;
    	return strValue;
    }
    CString CExcel::GetCellValueByName(CString rowName,CString colName)
    {
    	COleVariant value;
    	CString strValue;
    	long row=0,col=0;
    	long re_row=0,re_col=0;
    	range.AttachDispatch(sheet.get_Cells(),TRUE);
    	for (row=1,col=1;col<range.get_Column();col++)
    	{
    		value=range.get_Item(_variant_t(row),_variant_t(col));					//返回的类型是VT_DISPATCH 这是一个指针
    		range.AttachDispatch(value.pdispVal,TRUE);
    		VARIANT value2=range.get_Text();
    		CString strValue=value2.bstrVal;
    		if (strValue==colName)
    			break;
    	}
    	re_col=col;
    	for (row=1,row=1;row<range.get_Row();row++)
    	{
    		value=range.get_Item(_variant_t(row),_variant_t(col));					//返回的类型是VT_DISPATCH 这是一个指针
    		range.AttachDispatch(value.pdispVal,TRUE);
    		VARIANT value2=range.get_Text();
    		CString strValue=value2.bstrVal;
    		if (strValue==rowName)		
    			break;
    	}
    	re_row=row;
    	return GetCellValue(re_row,re_col);
    }
    


  • 相关阅读:
    UVa 12716 GCD XOR (简单证明)
    2.12 运行计划并取得数据行
    nyoj 628 小媛在努力 【搜索】
    ArcGIS Server 10.2 公布Oracle11g数据源的 Feature Service
    项目复习期总结3:CSS引入方式,凝视,命名规范,背景,行高,文本属性
    Android使用有道翻译API实如今线翻译功能
    _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)
    夜&#183; 启程
    你不知道的JavaScript(六)Box&Unbox
    pugixml读取unicode编码的xml文件的做法
  • 原文地址:https://www.cnblogs.com/pangblog/p/3265238.html
Copyright © 2011-2022 走看看