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数据:

idac value10011冰夜 1.210021冰早 3.210031冷日 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表:

idacvalue10011冰夜1.210021冰早3.210031冷日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


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 联想g40-70开机黑屏怎么办 新主机开不了机怎么办 联想720s笔记本闪屏怎么办 华硕k40ie显卡坏了怎么办 开机黑屏进入bois后怎么办 2根内存条不兼容怎么办 联想笔记本r720系统崩溃怎么办 联想天逸310卡怎么办 新买的鼠标没反应怎么办 联想笔记本触屏鼠标失灵怎么办 无线鼠标接收器丢了怎么办 联想笔记本系统重装失败怎么办 联想笔记本屏幕闪屏怎么办 种植牙螺钉掉了怎么办 水管牙断里面了怎么办 水龙头起泡器不起泡怎么办 14mm乘8mm残留怎么办 宝宝吃了螺丝冒怎么办 收割机滚筒皮带轮键槽滚了怎么办 微信界面变小了怎么办 拉杆箱螺丝掉了怎么办 洗衣机应急门锁没有拉绳怎么办? 奔驰glc发动机声音大怎么办 淋膜机模具螺丝拧不动怎么办 一字螺丝滑丝了怎么办 螺丝拧歪卡住了怎么办 车牌螺丝拧歪了怎么办 空心墙打膨胀螺丝打不上怎么办 沉孔内六角螺丝滑丝怎么办 内六角螺丝滑了怎么办? 三色灯不变光了怎么办 卧室灯不变色了怎么办 圆柱齿轮减速机噪音大怎么办 轴与套间隙生锈怎么办 汽车停小区被刮怎么办 下楼梯摔跤了 屁股疼 怎么办 剧烈咳嗽震的肚子疼怎么办 饺子粘在盘子上怎么办 生饺子粘在盘子怎么办 饺子粘在案板上怎么办 饺子冷冻粘起了怎么办