把Excell中的数据导入Access数据库中这一问题困扰了很长时间,终于经过一天的搜集资料,测试把这个问题搞定了。整理的资料跟大家共享一下。
解决这个问题有两种方法1、通过Excell自动化提供的类;2、通过ODBC直接读取Excell文件;我觉得第一种方法比较麻烦,第二种方法思路很清晰。只要把Excell中的数据读取出来接下来可以通过ADO写入数据库中。实现如下:
通过ODBC直接读取Excell文件
首先、创建一 Excell文件demo.xls,内容如下:
stuNum | stuName |
001 | 张三 |
002 | 李四 |
核心代码如下:
>获取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; }
>获取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; }
最后需要包含以下头文件:
#include <afxdb.h>
#include <odbcinst.h>
Note:
ReadFromExcell()函数中的 sSql = "SELECT stuNum, stuName FROM [Sheet1$] ORDER BY stuNum";SQL语句
中的表明一定要加[...$]