ADO读取Excel的简单例子

一、简单说明:

工程名字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数据:

idac value
10011冰夜 1.2
10021冰早 3.2
10031冷日 7.9

运行结果:



二、代码

// 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表:

idacvalue
10011冰夜1.2
10021冰早3.2
10031冷日7.9
存放在:d:\data\test.xls, 输入:" d:\\data\\test.xls " 即显示结果。


4.总结

ADO读取Excel比ODBC快很多。

COM数据 类型转换比较复杂,而且这个ADOExcel读取引擎引入CString类型,std::string类型就引起库冲突,这里用的字符串类型是_bstr_t。
可以拓展ADOExcel读取引擎类。

用户的Excel文档可以自定义,然后用ADOExcel读取引擎实现自己读取逻辑。

更多的请参考:

fullsail的文章

http://blog.csdn.net/fullsail/article/details/8449448


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值