现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

Vc++读写Excel文件

2013-12-12 20:35 工业·编程 ⁄ 共 2389字 ⁄ 字号 暂无评论

     把Excel中的数据导入Access数据库中这一问题困扰了很长时间,终于经过一天的搜集资料,测试把这个问题搞定了。解决这个问题有两种方法。

1、通过Excell自动化提供的类;

2、通过ODBC直接读取Excell文件;

相关阅读

----VC中彻底玩转Excel

我觉得第一种方法比较麻烦,第二种方法思路很清晰。只要把Excell中的数据读取出来接下来可以通过ADO写入数据库中。实现如下:

首先、创建一 Excell文件demo.xls,内容如下:

stuNum stuName
001 张三
002 李四

核心代码如下:

1)获取Excell内容函数

void ReadFromExcell()
{
    // TODO: Add your control notification handler code here
    CDatabase database;
    CString sDriver;
    CString sDsn;
    CString sFile;
    CString sSql;
    CString sItem1, sItem2;
   
    CFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "Excell(*.xls)|*.xls| |", AfxGetMainWnd());
    if(dlgFile.DoModal() ==  IDOK){
        sFile = dlgFile.GetPathName();
    }else{
        return;
    }
   
    // 检索是否安装有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 stuNum, stuName FROM [Sheet1$] ORDER BY stuNum";
       
        // 执行查询语句
        recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
       
        // 获取查询结果
        while (!recset.IsEOF())
        {
            //读取Excel内部数值
            recset.GetFieldValue("stuNum", sItem1);
            recset.GetFieldValue("stuName", sItem2);
           
            //在此处对获取的数据进行处理
            //****
            AfxMessageBox(sItem1);
            AfxMessageBox(sItem2);
            //****
            // 移到下一行
            recset.MoveNext();
        }
       
        // 关闭数据库
        database.Close();
       
    }
    CATCH(CDBException, e)
    {
        // 数据库操作产生异常时...
        AfxMessageBox("数据库错误: " + e->m_strError);
    }
    END_CATCH;
}

2)获取ODBC中Excell驱动函数

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;
}

3)最后需要包含以下头文件:

#include <afxdb.h>
#include <odbcinst.h>

Note:

ReadFromExcell()函数中的 sSql = "SELECT stuNum, stuName FROM [Sheet1$] ORDER BY stuNum";SQL语句中的表一定要加[...$]

给我留言

留言无头像?