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;
}
- VC读EXCLE数据
- 数据导出Excle
- 数据导出Excle !
- Excle数据 读取
- 导入excle数据
- Mysql导入Excle数据
- excle 导入导出数据
- excle 数据导入数据库
- SQLserver调用Excle数据
- matlab 数据写入EXCLE
- POI导出excle数据
- 将EXCLE数据导入MYSQL
- Java导出数据到Excle
- .Net导出数据到Excle
- qtxlsx读取excle的数据
- 大数据量数据导出excle
- sql 读取excle 中数据
- 利用java获取excle数据
- 第十六周 OJ 职工信息结构体
- NSObject详解
- 滚动条滑倒div的底部,扣扣发消息时
- 客户端伪造代理服务器ip进行sql注入
- 如何在Centos 6上安装Wordpress?
- VC读EXCLE数据
- 启动tomcat中的startup.bat闪退?
- PRML读书笔记(二)
- Physically Based Rendering - Cook–Torrance
- opengl 画三角形
- iOS 轮播图
- jstorm rebalance动态调整Task和Worker
- maven 常用命令
- java基础--27.了解线程组ThreadGroup