直接通过ODBC读、写Excel表格文件

    技术2022-05-11  125

    直接通过ODBC读、写Excel表格文件

    译者:徐景周

           想要通过ODBC直接读、写Excel表格文件,首先,应确保ODBC中已安装有Excel表格文件的驱动"MICROSOFT EXCEL DRIVER (*.XLS)"。然后,可根据下面步骤进行:

    1.         StdAfx.h文件中加入:

    include <afxdb.h>

    include <odbcinst.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;

    }

     

     

    // 获取ODBCExcel驱动

    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;

    }

     

     

    联系方式:

    作者EMAIL:jingzhou_xu@163.net

    未来工作室(Future Studio)

     


    最新回复(0)