关于VC操作Excel(解决mircoSoft jet 数据库引擎找不到对象)

开始尝试了odbc方法,mircoSoft jet 数据库引擎找不到对象错误

首先,确保ODBC中已安装有Excel表格文件的驱动 "MICROSOFT   EXCEL   DRIVER   (*.XLS) "。(转的)和我一样的弱人们,不得不再百度一下怎么安装这个神马驱动!

控制面板-》管理工具-》数据源(odbc)-》用户DSN里如果有”EXCEL FILES“,那就ok了,如果没有,去找office安装盘吧!

然后,可根据下面步骤进行:
  1.   在StdAfx.h文件中加入:  
#include   <afxdb.h>  
#include   <odbcinst.h>

(转)

弱弱地提醒一下,不放在stdafx.h下也行,哪里要用就放哪里吧!

  2.   通过ODBC直接创建Excel文件并在表中插入数据(暂定文件名:Demo.xls)   //创建并写入Excel文件
void   CRWExcel::WriteToExcel()
{
    CDatabase   database;
    CString   sDriver   =   "MICROSOFT   EXCEL   DRIVER   (*.XLS) ";   //   Excel安装驱动
    CString   sExcelFile   =   "c://demo.xls ";                                 //   要建立的Excel文件
    CString   sSql;
       
    TRY
    {
        //   创建进行存取的字符串
        sSql.Format( "DRIVER={%s};DSN= ' ' ' ';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/ "%s/ ";DBQ=%s ",
                                sDriver,   sExcelFile,   sExcelFile);
        //   创建数据库   (既Excel表格文件)
        if(   database.OpenEx(sSql,CDatabase::noOdbcDialog)   )
        {
            //   创建表结构(姓名、年龄)
            sSql   =   "CREATE   TABLE   demo   (Name   TEXT,Age   NUMBER) ";
            database.ExecuteSQL(sSql);
            //   插入数值
            sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   ( ' '徐景周 ' ',26) ";
            database.ExecuteSQL(sSql);
            sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   ( ' '徐志慧 ' ',22) ";
            database.ExecuteSQL(sSql);
            sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   ( ' '郭徽 ' ',27) ";
            database.ExecuteSQL(sSql);
        }            
        //   关闭数据库
        database.Close();
    }
    CATCH_ALL(e)
    {
        TRACE1( "Excel驱动没有安装:   %s ",sDriver);
    }
    END_CATCH_ALL;
}
  3.   通过ODBC直接读取Excel文件(暂定文件名:Demo.xls)   //   读取Excel文件
void   CRWExcel::ReadFromExcel()  
{
        CDatabase   database;
        CString   sSql;
        CString   sItem1,   sItem2;
        CString   sDriver;
        CString   sDsn;
        CString   sFile   =   "Demo.xls ";   //   将被读取的Excel文件名
                                                                         
        //   检索是否安装有Excel驱动   "Microsoft   Excel   Driver   (*.xls) "  
        sDriver   =   GetExcelDriver();
        if   (sDriver.IsEmpty())
        {
                //   没有发现Excel驱动
                AfxMessageBox( "没有安装Excel驱动! ");
                return;
        }
       
        //   创建进行存取的字符串
        sDsn.Format( "ODBC;DRIVER={%s};DSN= ' ' ' ';DBQ=%s ",   sDriver,   sFile);
        TRY
        {
                //   打开数据库(既Excel文件)
                database.Open(NULL,   false,   false,   sDsn);
               
                CRecordset   recset(&database);
                //   设置读取的查询语句.
                sSql   =   "SELECT   Name,   Age   "              
                              "FROM   demo   "                                  
                              "ORDER   BY   Name   ";
       
                //   执行查询语句
                recset.Open(CRecordset::forwardOnly,   sSql,   CRecordset::readOnly);
                //   获取查询结果
                while   (!recset.IsEOF())
                {
                        //读取Excel内部数值
                        recset.GetFieldValue( "Name   ",   sItem1);
                        recset.GetFieldValue( "Age ",   sItem2);
                        //   移到下一行
                        recset.MoveNext();
                }
                //   关闭数据库
                database.Close();
                                                         
        }
        CATCH(CDBException,   e)
        {
                //   数据库操作产生异常时...
                AfxMessageBox( "数据库错误:   "   +   e-> m_strError);
        }
        END_CATCH;
}
  4.   获取ODBC中Excel驱动的函数   CString   CRWExcel::GetExcelDriver()
{
        char   szBuf[2001];
        WORD   cbBufMax   =   2000;
        WORD   cbBufOut;
        char   *pszBuf   =   szBuf;
        CString   sDriver;
        //   获取已安装驱动的名称(涵数在odbcinst.h里)
        if   (!SQLGetInstalledDrivers(szBuf,   cbBufMax,   &cbBufOut))
                return   " ";
       
        //   检索已安装的驱动是否有Excel...
        do
        {
                if   (strstr(pszBuf,   "Excel ")   !=   0)
                {
                        //发现   !
                        sDriver   =   CString(pszBuf);
                        break;
                }
                pszBuf   =   strchr(pszBuf,   ' '/0 ' ')   +   1;
        }
        while   (pszBuf[1]   !=   ' '/0 ' ');
        return   sDriver;
}

上面的是转载的,如果你拿来这个代码一下子就能跑的话,恭喜你!

说一下我的环境:VS05,office2010

为了让它能跑起来,不得不做一些修修改改。

最后,万能的神啊,它跑起来了……

但是,当我把WriteToExcel去掉,希望让我的程序从一个已有的excel中读取数据的时候……

困惑了好久,终于意外发现,只要把sql语句中的表名变成 [ 表名$]就ok了:

                         "SELECT   Name,   Age   "              
                              "FROM   [testcases$]   "                                  
                              "ORDER   BY   Name   "

很简单,但很有用啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值