zoukankan      html  css  js  c++  java
  • MFC通过sql访问excel的方法

    1.首先检查安装的驱动中是否有excel,代码如下:
    CString CAbcd1Dlg::GetExcelDriver()
    {
      TCHAR sBuf[1000], *p=sBuf;
      WORD sBufMax=1000, sBufOut;
      if (!SQLGetInstalledDrivers(sBuf, sBufMax, &sBufOut))
        return "";

      CString strDriver;
      do{
        if(_tcsstr(p,_T("Excel"))!=0)
        {
          strDriver=CString(p);
          break;
        }
        p=_tcschr(p,_T('') )+1;
      }while(p[1]!=_T(''));

      return strDriver;
      }

      此函数的返回值即为excel驱动设备名称

    2.读取访问excel表数据,先定义一个表,操作如下:
      运行Microsoft Excel , 打开要操作的工作簿, 左键拖拽,选取要定义成为表的区域,
      从菜单中选择'插入 '->'名称'->'定义','定义名称'对话框出现后,键入表的名字,
      例如:test,保存退出。
      这样,你就可以在VC中,使用象SELECT * FROM test这样的SQL语句了

      CString sD;
      //m_strDriver为 1 中获取的excel设备驱动名称,
      //strExcelFullFileName是excel表的全名
      sD.Format(_T("ODBC;DRIVER={%s};DSN='';DBQ=%s"), m_strDriver, strExcelFullFileName);

      CDatabase database;
      //打开数据库(即Excel文件)
      if (0 == database.Open(NULL, false, false, sD))
      {
        CString strFailInfo;
        strFailInfo.Format(_T("%s database 打开失败"),strExcelName);
        AfxMessageBox(strFailInfo);
        return;
      }

      CRecordset recset(&database);

      //设置读取的查询语句
      CString ql(_T("SELECT 字段1,字段2 FROM test"));
      //执行查询语句
      recset.Open(CRecordset::forwardOnly,ql,CRecordset::readOnly);

      遍历每一条,获取每一个字段
      while(!recset.IsEOF())
      {
        CString str1, str2;
        recset.GetFieldValue(_T("字段1"), str1);
        recset.GetFieldValue(_T("字段2"), str2);
        recset.MoveNext();//移到下一条记录
      }

    3.写excel
      CString sSql;
      //m_strDriver为 1 中获取的excel设备驱动名称
      //strExcelFileName 为 写入的excel名称
      sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB="%s";DBQ=%s",m_strDriver, strExcelFileName,   strExcelFileName);
      //打开数据文件
      if (0 == m_dbWriteToExcel.OpenEx(sSql,CDatabase::noOdbcDialog)){
        return false;
      }
      写入表头
      sSql = "CREATE TABLE Exceldemo (字段1 TEXT, 字段2 TEXT)";
      m_dbWriteToExcel.ExecuteSQL(sSql);

      //写入数据
      str1.Replace(_T("'"),_T("''"));
      str2.Replace(_T("'"),_T("''"));

      CString strSql;
      strSql.Format(_T("INSERT INTO Exceldemo (字段1, 字段2) VALUES ('%s', '%s ')"),str1, str2);
      m_dbWriteToExcel.ExecuteSQL(strSql);

      备注:
        1.由于sql中插入的字段值要用''包起来,如果字段值中有'则会出现冲突,在sql中俩个'代表一个'
        2.'%s ' 后面的'号前有个空格,经过测试,'紧挨着%s会出现一些奇怪的情况。

  • 相关阅读:
    算法练习-寻找和为定值的两个数
    算法练习-字符串全排列
    算法练习-最长回文子串
    判断一点是否在三角形的外接圆内
    用递归方法计算行列式的值
    算法练习-回文判断
    算法练习-字符串转换成整数(实现atoi函数)
    算法练习-字符串包含
    数据结构-队列
    结构体(或者联合体)变量的成员在内存里是如何分布的
  • 原文地址:https://www.cnblogs.com/sancong/p/6292243.html
Copyright © 2011-2022 走看看