ADO读取Excel的简单例子
来源:互联网 发布:淘宝哪家特百惠是正品 编辑:程序博客网 时间:2024/05/21 09:00
一、简单说明:
工程名字ADO_Excel,类型是console app, 非empty有预编译头stdafx.h。
编译说明:1.确保C盘下面路径有msado15.dll,没有则需安装office2007:
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
#pragma comment(lib, "ws2_32.lib")
2.工程是Use Multi-Byte Character Set,不是unicode的。
3.读取的Excel数据:
运行结果:
二、代码
// 1.新建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")
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表:
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的简单例子
- 利用PHP读取Excel的简单例子
- POI读取excel简单例子
- JAVA用POI读取EXCEL的例子 超简单
- ASP读取EXCEL的例子
- EXCEL的简单读取
- EXCEL的简单读取
- ado.net读取excel
- ado.net读取excel
- ado excel读取
- ADO读取Excel内容
- ADO读取EXCEL
- 简单 的java 读取 excel
- 简单的读取excel文件
- 读取Excel文件的一个例子
- Java POI读取excel的例子
- COM方式读取Excel表格的例子
- 一个QTP中用ADO操作Excel的例子
- linux编译与链接的知识
- (hdu step 2.3.8)小兔的棋盘(卡特兰数:从左上角走到右上角的路径数)
- [OpenGL] 配置freeglut和glew
- vehicle market review 2014
- 94. 基于Notes/Domino的文档工作流系统(六)
- ADO读取Excel的简单例子
- Android查看wakelock
- UVA10935 - Throwing cards away I
- C++编程技巧
- is_int,is_numeric区别
- 软件设计本质论(Essential Design)—白话面向对象
- ubuntu下安装mpich2
- 微信朋友圈广告:精准投放还是“绑架”营销
- php引入外部文件