VC读EXCLE数据

来源:互联网 发布:剑灵捏脸数据 灵女 萌 编辑:程序博客网 时间:2024/06/06 08:25

方案一:excel.cpp


首先需要在你的VC上添加EXCLE.h和.cpp

1.初始化COM支持库

在你的.app的InitInstance()函数AfxEnableControlContainer();语句之后加入

1 if (CoInitialize(NULL) != 0)2 {3        AfxMessageBox(“初始化COM支持库失败!”);4        exit(1);5 }

假如这个条件不通过就不能运行起程序。在程序的出口处CSolarApp:: ExitInstance()函数return语句之前加入下面这句话:

1 CoUninitialize();

来释放COM支持库,这样对COM库的支持就已完成。


2.导入EXCLE.CPP和EXCEL.H

下面要从Office的安装目录中找到对VC操作excel文件的动态库,在某些版本下这个文件是Excel8.olb或Excel9.olb,在我的版本中是excel.exe这个exe也是动态库的形式,是微软公司主要的文件结果之一。选择VC的View(查看)菜单里面的类向导ClassWizad命令,会弹出一个对话框;然后点击Add Class…按钮选择From a type library,会弹出一个打开对话框,从这里打开Office安装目录下D:\Program Files\Microsoft Office\Office12\EXCEL.EXE文件,从里面选择几个要用到的类:_Application, Workbooks, _Wrokbook, Worksheets, _WorkSheet, Range,点击OK按钮。会在程序中生成一个excel.h和excel.cpp文件,这些文件中包含了刚才我们选择的几个类的代码。下面介绍一下这几个类:

  在VC操纵excel的exe动态库里面有好多个对象模型,就是刚才在创建过程中看到的那个列表,但是经常用到的有这么几个:_Application, Workbooks, _Wrokbook, Worksheets, _WorkSheet, Range,Charts和_Chart,最后面的两个是用来操作图表的,这里没有用到所以这里也就不记录了。

  1>_Application:这里的Application就是Excel本身,众所周知,一个Excel可以包含多个工作簿,每个工作簿又可以包含多个工作表,而每个工作表又可以包含多个区域或者图表,所以这里他们是树型的结构关系,而application最基本的一个功能就是找到它的子项工作簿。果然,我们在引入我们程序的Application类中看到了这样的成员函数:GetWorkbooks()。

  2> Workbooks:这个对象是一个容器对象,它里面存放着所有打开的工作簿。因此,我们可以猜测它一定有添加,查找,打开/关闭工作簿的功能。(本程序中使用excel的一个xlt模板来生成一个xls文件就是使用了这个容器对象的添加功能。)

  3> _Workbook:这是一个工作簿,也就相当于一个xls文件。Excel可以同时打开多个工作簿,所以工作簿之间必定能够互相切换,每个工作簿可以关联工作表容器并获得工作表的索引。

  4> Worksheets:也是一个容器对象,和Workbooks类似。

  5> _Worksheet:这个就是我们看到的工作表,比如Sheet1,sheet2等等。

  6> Rang:就是我们看到的能选中的方框的大小。而我们所要作的操作基本上是以区域为单位进行的。


接下来就可以实现EXCEL的读取了


_Application app;

Workbooks books;  
_Workbook book;  

Worksheets sheets;  

_Worksheet sheet;  

Range range;  

LPDISPATCH lpDisp;      

COleVariant vResult;


COleVariant  
covTrue((short)TRUE),  

covFalse((short)FALSE),  

covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);



if(!app.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("Create Excel service failure!");
return -1;
}
app.SetVisible(FALSE);
books.AttachDispatch(app.GetWorkbooks(),true);

    CString FilePath;
    GetModuleFileName(NULL,FilePath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
    FilePath.ReleaseBuffer();
    int iPosIndex;
    iPosIndex = FilePath.ReverseFind('\\');
    FilePath = FilePath.Left(iPosIndex);
CString Message;
Message.Format("%s\\未发现'动力环境监控量.xls'",FilePath);
    FilePath +="\\动力环境监控量.xls";


if(-1 == _access(FilePath,0))
{
AfxMessageBox(Message);
return FALSE;
}

//打开一个工作簿
else
{
lpDisp = books.Open(FilePath,  
        covOptional, covOptional, covOptional, covOptional,  
        covOptional, covOptional, covOptional, covOptional,  
        covOptional, covOptional, covOptional, covOptional,  
        covOptional, covOptional);
    ASSERT(lpDisp);
}

book.AttachDispatch(lpDisp);


int n = 4;
CString str;
while(1)
{
// 得到Worksheets    
sheets.AttachDispatch(book.GetWorksheets(),true);   
      
// 得到Worksheet  
sheet.AttachDispatch(sheets.GetItem(_variant_t((short)(1))));//工作区间


// 得到全部Cells   
range.AttachDispatch(sheet.GetCells(),true);
range.AttachDispatch(range.GetItem(_variant_t((long)(n)),_variant_t((long)(1))).pdispVal );//1参数是行,2参数是列
vResult = range.GetValue(covOptional);
switch (vResult.vt)  
    {  
    case VT_BSTR:       // 字符串  
        str=vResult.bstrVal;  
        break;  
    case VT_R8:         // 8字节的数字  
        str.Format("%f",vResult.dblVal); 
        break;  
    case VT_DATE:       // 时间格式  
        SYSTEMTIME st;  
        VariantTimeToSystemTime(vResult.date, &st);  
        break;  
    case VT_EMPTY:      // 单元格空的  
        str="";  
        break;
    }
if(str=="")
break;


string sStr(str.GetBuffer(0));
//str即是我们从EXCLE中提取出的数据

n++;
}




方案二:ADO读取Excel(好处是不需要电脑安装Excel也可以完成操作,速度快)

ADO_EXCEL.H:


#ifndef _ADO_EXCEL_H_
#define _ADO_EXCEL_H_

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")


#include "tchar.h"

class ADO_Excel  
{
public:
ADO_Excel();
void Init();//初始化Com对象,用于读取xls文件
void Release();//释放对象


void OpenExcel(const char *szFilePath,char *SheetName);//打开EXCEL文件,参数一是文件的路径名,参数二是sheet的名称


void CloseExcel();//关闭EXCLE文件


int GetCount(); //返回纪录集的行数
CString ReaderCell(int rowindex,int cellindex);读EXCEL参数一是行数,参数二是列数


bool IsFinish();
void MoveNext();
virtual ~ADO_Excel();
private:
void OnConnection(const char *path);//用ADO链接xls
void ExitConnection();


private:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;


};
#endif


ADO_EXCEL.CPP:

void ADO_Excel::Init()
{
::CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
}


void ADO_Excel::Release()
{
m_pConnection.Release();


m_pRecordset.Release();


::CoUninitialize();


}


void ADO_Excel::OnConnection(const char *path)
{
try
{
_bstr_t strConnect = "";
strConnect=_T("Provider=Microsoft.Jet.OLEDB.4.0;");
strConnect+=_T("Data Source=");
strConnect+=path;
strConnect+=_T(";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"");


m_pConnection->Open(strConnect,"","",adModeUnknown);


}
catch (_com_error &e)
{
printf("please make your Excel is integrity.");
}

}


void ADO_Excel::ExitConnection()
{
if(m_pConnection!=NULL)
{
m_pConnection->Close();
}
}


void ADO_Excel::OpenExcel(const char *szFilePath,char *SheetName)
{
OnConnection(szFilePath);
_variant_t SQL;
CString str;
str.Format("SELECT * FROM [%s$]",SheetName);
    SQL=_variant_t(_T(str));

try{
m_pRecordset->Open(SQL,_variant_t((IDispatch*)m_pConnection,true),
            adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error &e)
{
printf("请确保输入的xls是SheetName类型,列明是由没有空格的单词组成");
return;
}
}


CString ADO_Excel::ReaderCell(int rowindex,int cellindex)
{
m_pRecordset->MoveFirst();
if(rowindex>m_pRecordset->GetRecordCount())
return "";
CString result("");
int i = 0;
while(!IsFinish())
{
if(m_pRecordset->adoEOF)
break;
if( i == rowindex)
{
if(cellindex < m_pRecordset->Fields->Count )
{
_variant_t t = _variant_t(long(cellindex));
_variant_t var;
var =m_pRecordset->GetCollect(t);
if(var.vt  !=  VT_NULL)
result = (LPCTSTR)(_bstr_t)var;
else
result = "";
break;
}
else
{
result ="列索引超出范围";
break;
}
}
i++;
MoveNext();
}
if( rowindex > i)
result ="行索引超出范围";

return result;
}


int ADO_Excel::GetCount()
{
return m_pRecordset->GetRecordCount();
}


void ADO_Excel::CloseExcel()
{
    m_pRecordset->Close();
    // 先释放连接,然后建立连接
    ExitConnection();
}


void ADO_Excel::MoveNext()
{
    if(!m_pRecordset->adoEOF)
    {
        m_pRecordset->MoveNext();
    }
}


bool ADO_Excel::IsFinish()
{
    return m_pRecordset->adoEOF;
}


ADO_Excel::ADO_Excel()
{


}


ADO_Excel::~ADO_Excel()
{


}


demo:

CString FilePath;
    GetModuleFileName(NULL,FilePath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
    FilePath.ReleaseBuffer();
    int iPosIndex;
    iPosIndex = FilePath.ReverseFind('\\');
    FilePath = FilePath.Left(iPosIndex);
    FilePath +="\\动力环境监控量.xls";
if(0 == _access(FilePath,0))
{
ADO_Excel objExcel;
objExcel.Init();
objExcel.OpenExcel(FilePath,"站点配置");
int n;
int m =objExcel.GetCount();
for(n=0;n<m;n++)
{
CString str = objExcel.ReaderCell(n,0);
if(str!="")
SupervisionCenter.push_back(str);


}

//SupervisionUnit录入
objExcel.OpenExcel(FilePath,"站点配置");

m =objExcel.GetCount();
for(n=0;n<m;n++)
{
CString str = objExcel.ReaderCell(n,1);
if(str!="")
SupervisionUnit.push_back(str);

}
objExcel.CloseExcel();
objExcel.Release();




//SupervisionObject录入


ADO_Excel objExceL;
objExceL.Init();
objExceL.OpenExcel(FilePath,"告警配置");

m =objExceL.GetCount();
for(n=0;n<m;n++)
{
CString str = objExceL.ReaderCell(n,0);
if(str!="")
SupervisionObject.push_back(str);

}


//SupervisionPoint
objExceL.OpenExcel(FilePath,"告警配置");

m =objExceL.GetCount();
for(n=0;n<m;n++)
{
CString str = objExceL.ReaderCell(n,1);
if(str!="")
SupervisionPoint.push_back(str);

}


//SupervisionType


objExceL.OpenExcel(FilePath,"告警配置");

m =objExceL.GetCount();
for(n=0;n<m;n++)
{
CString str = objExceL.ReaderCell(n,2);
if(str!="")
SupervisionType.push_back(str);

}

objExceL.CloseExcel();
objExceL.Release();
}
else
MessageBox("请将'动力环境监控量.xls'放在可执行程序目录下");
return TRUE;
}




0 0
原创粉丝点击