概述
一、简单说明:
工程名字ADO_Excel,类型是console app, 非empty有预编译头stdafx.h。
编译说明:1.确保C盘下面路径有msado15.dll,没有则需安装office2007:
#import "C:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","adoEOF")
#pragma comment(lib, "ws2_32.lib")
2.工程是Use Multi-Byte Character Set,不是unicode的。
3.读取的Excel数据:
id | ac | value | |
1001 | 1冰夜 | 1.2 | |
1002 | 1冰早 | 3.2 | |
1003 | 1冷日 | 7.9 |
运行结果:
二、代码
// 1.新建ADO_Excel.h
#ifndef _ADO_EXCEL_H_
#define _ADO_EXCEL_H_
#import "C:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","adoEOF")
class ADOExcel
{
public:
void Init();// 初始化Com对象,用于读取xls文件
void Release();
void OpenExcel(const char* szFilePath);
void CloseExcel();
int GetInt(const char* strField);
unsigned int GetUInt(const char* strField);
float GetFloat(const char* strField);
double GetDouble(const char* strField);
_bstr_t GetString(const char* strField);
bool IsFinish();
void MoveNext();
private:
void OnConnection(const char* path); // 用ADO连接xls
void ExitConnection();
private:
_ConnectionPtr m_pConnection;//Excel模块特有的
_RecordsetPtr m_pRecordset; //Excel模块特有的
};
#endif
// 2.新建ADO_Excel.cpp
// ADO_Excel.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "ADO_Excel.h"
void ADOExcel::Init()
{
::CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(Connection));
/*::CoInitialize(NULL);*/
m_pRecordset.CreateInstance(__uuidof(Recordset));
}
void ADOExcel::Release()
{
m_pConnection.Release();
//::CoUninitialize();
m_pRecordset.Release();
::CoUninitialize();
}
void ADOExcel::OnConnection(const char* path)
{
try
{
_bstr_t strConnect = "";
//CString conStr;
strConnect =_T("Provider=Microsoft.ACE.OLEDB.12.0;");
strConnect +=_T("Data Source=");
strConnect +=path;
strConnect +=_T(";Extended Properties='Excel 12.0 Xml;HDR=YES'");
//_bstr_t strConnect(conStr);
m_pConnection->Open(strConnect,"","",adModeUnknown);
}catch(_com_error &e)
{
printf("Please make your Excel is integrity.");
}
}
void ADOExcel::ExitConnection()
{
if(m_pConnection!=NULL)
{
m_pConnection->Close();
}
}
void ADOExcel::OpenExcel(const char* szFilePath)
{
OnConnection(szFilePath);
_variant_t SQL;
SQL=_variant_t(_T("SELECT * FROM [Sheet1$]"));
try{
m_pRecordset->Open(SQL,_variant_t((IDispatch*)m_pConnection,true),
adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error &e)
{
printf("请确保输入的xls表单名是Sheet1类型,列名是由没有空格的规定单词组成的和单元格设置是否为文本.");
return;
}
}
void ADOExcel::CloseExcel()
{
m_pRecordset->Close();
// 先释放连接,然后建立连接
ExitConnection();
}
int ADOExcel::GetInt(const char* strField)
{
int nNum = 0;
_variant_t varField((LPCTSTR)strField);
_variant_t vTempValue = m_pRecordset->GetCollect(varField);
nNum = (int)atoi(_bstr_t(vTempValue));
return nNum;
}
unsigned int ADOExcel::GetUInt(const char* strField)
{
unsigned int nNum = 0;
_variant_t varField((LPCTSTR)strField);
_variant_t vTempValue = m_pRecordset->GetCollect(varField);
nNum = (unsigned int)atoi(_bstr_t(vTempValue));
return nNum;
}
float ADOExcel::GetFloat(const char* strField)
{
float fValue = 0.0f;
_variant_t varField((LPCTSTR)strField);
_variant_t vTempValue = m_pRecordset->GetCollect(varField);
_bstr_t strValue = bstr_t(vTempValue);
fValue = (float)atof((LPCTSTR)strValue);
return fValue;
}
double ADOExcel::GetDouble(const char* strField)
{
double dbValue = 0.0f;
_variant_t varField((LPCTSTR)strField);
_variant_t vTempValue = m_pRecordset->GetCollect(varField);
_bstr_t strValue = bstr_t(vTempValue);
dbValue = (double)atof((LPCTSTR)strValue);
return dbValue;
}
_bstr_t ADOExcel::GetString(const char* strField)
{
_variant_t varField((LPCTSTR)strField);
_variant_t vTempValue = m_pRecordset->GetCollect(varField);
return bstr_t(vTempValue);
}
void ADOExcel::MoveNext()
{
if(!m_pRecordset->adoEOF)
{
m_pRecordset->MoveNext();
}
}
bool ADOExcel::IsFinish()
{
return m_pRecordset->adoEOF;
}
// 3.新建main.cpp
#include "stdafx.h"
#include "ADO_Excel.h"
int _tmain(int argc, _TCHAR* argv[])
{
ADOExcel objExcel;
objExcel.Init();
char szCurPath[256];
printf("请输入Excel文件的路径:n");
scanf("%s",szCurPath);
objExcel.OpenExcel(szCurPath);
printf("---------------读取Excel开始-----------------n");
// 读取数据
while(!objExcel.IsFinish())
{
// 读取数据,实际工程中,在这里处理工程数据的逻辑代码
int nNum = objExcel.GetInt("id");
_bstr_t strAC = objExcel.GetString("ac");
float fValue = objExcel.GetFloat("value");
printf("id: %d, ac: %s, value: %1.2f n", nNum,(LPCTSTR)strAC, fValue);
// next
objExcel.MoveNext();
}
// 读取完毕
objExcel.CloseExcel();
objExcel.Release();
printf("---------------读取Excel结束-----------------n");
while(1);
return 0;
}
3.使用
编译成功后,建立好数据excel表:
id | ac | value |
1001 | 1冰夜 | 1.2 |
1002 | 1冰早 | 3.2 |
1003 | 1冷日 | 7.9 |
4.总结
ADO读取Excel比ODBC快很多。
COM数据 类型转换比较复杂,而且这个ADOExcel读取引擎引入CString类型,std::string类型就引起库冲突,这里用的字符串类型是_bstr_t。
可以拓展ADOExcel读取引擎类。
用户的Excel文档可以自定义,然后用ADOExcel读取引擎实现自己读取逻辑。
更多的请参考:
fullsail的文章
http://blog.csdn.net/fullsail/article/details/8449448
最后
以上就是发嗲小熊猫为你收集整理的ADO读取Excel的简单例子的全部内容,希望文章能够帮你解决ADO读取Excel的简单例子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复