zoukankan      html  css  js  c++  java
  • Excel和vs2010 的连接

    通过VS实现对Excel表格的操作的方法有多种,如:通过ODBC数据库实现,通过解析Excel表格文件,通过OLE/COM的实现。本文通过ODBC实现对Excel表格的操作
    首先,应确保ODBC中已安装有Excel表格文件的驱动"Microsoft Excel Driver (*.xls)"。
    控制面板->管理工具->数据源(ODBC)如下(添加驱动后,这里命名为Excel97):
    image

    注意,程序中头文件需要添加:
    #include < afxdb.h > 
    #include < odbcinst.h >
    如果出现#error :  Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
    解决方案:打开“项目->XX属性->常规->MFC的使用”,设置为:在共享 DLL 中使用 MFC。
    然后,程序实现如下:

    /*
     *作者:侯凯
     *说明:vs2010和excel通过odbc的方式实现连接
     *日期:2013-6-1
    */
    #include <iostream>
    #include < afxdb.h >  
    #include < odbcinst.h >
    using namespace std;
    
    //获取ODBC中Excel驱动的函数
    CString 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;  
    }  
    
    //创建并写入Excel文件  
    void WriteToExcel()  
    {    
        CDatabase database;    
        CString sDriver = "Microsoft Excel Driver (*.xls)"; //Excel安装驱动
        //也可以使用"Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)",支持xlsx  
        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;  
    }
    
    // 读取Excel文件  
    void ReadFromExcel()   
    {      
        CDatabase database;      
        CString sSql;      
        CString sItem1, sItem2;      
        CString sDriver;      
        CString sDsn;      
        CString sFile = "c:\\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;  
    }  
    
    void main()
    {
        //WriteToExcel();
        ReadFromExcel();
    }

    这样,便实现了Excel的基本读写操作。
    最后,如果你想要的到更多的功能实现可以参考:http://www.vckbase.com/index.php/wv/494以及http://hi.baidu.com/xiao___q/item/1fd973b6f0a42f71254b0926。它们对Excel的操作做了进一步的类封装,比较完善。

  • 相关阅读:
    UVA 1386 Cellular Automaton
    ZOJ 3331 Process the Tasks
    CodeForces 650B Image Preview
    CodeForces 650A Watchmen
    CodeForces 651B Beautiful Paintings
    CodeForces 651A Joysticks
    HUST 1601 Shepherd
    HUST 1602 Substring
    HUST 1600 Lucky Numbers
    POJ 3991 Seinfeld
  • 原文地址:https://www.cnblogs.com/houkai/p/3113902.html
Copyright © 2011-2022 走看看