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('\0') )+1;
  }while(p[1]!=_T('\0'));

  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会出现一些奇怪的情况。

posted @ 2017-01-17 11:11  当你的世界里有风吹过  阅读(1672)  评论(0编辑  收藏  举报