#include "stdafx.h" #include #include "ExcelForODBC.h" #ifdef _DEBUG #define new DEBUG_NEW #endif ExcelForODBC::ExcelForODBC() { } ExcelForODBC::~ExcelForODBC() { } //************************************// // [函数]:GetExcelDriver // [描述]:读取Excel驱动 // [参数]: // [返回]:CString返回驱动名 //************************************// CString ExcelForODBC::GetExcelDriver() { TCHAR wszBuf[1024] = {0}; WORD cbBufMax = 2000; WORD cbBufOut; // 获取已安装驱动的名称(涵数在odbcinst.h里) if (!SQLGetInstalledDrivers(wszBuf, cbBufMax, &cbBufOut)) { ::AfxMessageBox(_T("Failed!")); return 0; } // 检索已安装的驱动是否有Excel... int nlen = 0; int npos = 0; TCHAR szBuf[512] = {0}; TCHAR* pBuf = wszBuf; CString strMsg; while(1) { memset(szBuf, 0, 512*sizeof(TCHAR)); //nlen = WChar2Char(szBuf, pBuf + npos); nlen = _tcslen(pBuf + npos); if(nlen == 0) break; npos += (nlen + 1); printf("发现 %s\n", szBuf); if(_tcscmp(szBuf, _T("Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)")) == 0 || _tcscmp(szBuf, _T("Microsoft Excel-Treiber (*.xls)")) == 0 || _tcscmp(szBuf, _T("Microsoft Excel Driver (*.xls)")) == 0 || _tcscmp(szBuf, _T("Driver do Microsoft Excel (*.xls)")) == 0) { //WCHAR wsztmp[512] = {0}; //Char2WChar(wsztmp, szBuf); return szBuf; } } return _T(""); } //创建并写入Excel文件 void ExcelForODBC::WriteToExcel(CString& strFile) { CDatabase database; CString sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)"); // Excel安装驱动 CString strSql = _T(""); TRY { // 创建进行存取的字符串 strSql.Format(_T("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"), sDriver.GetBuffer(), strFile.GetBuffer(), strFile.GetBuffer()); // 创建数据库 (既Excel表格文件) if(database.OpenEx(strSql,CDatabase::noOdbcDialog)) { // 创建表结构(姓名、年龄) strSql = _T("CREATE TABLE demo (Name TEXT,Age NUMBER)"); database.ExecuteSQL(strSql); // 插入数值 strSql = _T("INSERT INTO demo (Name,Age) VALUES (''徐景周'',26)"); database.ExecuteSQL(strSql); strSql = _T("INSERT INTO demo (Name,Age) VALUES (''徐志慧'',22)"); database.ExecuteSQL(strSql); strSql = _T("INSERT INTO demo (Name,Age) VALUES (''郭徽'',27)"); database.ExecuteSQL(strSql); } // 关闭数据库 database.Close(); } CATCH(CDBException, e) { // 数据库操作产生异常时... AfxMessageBox(_T("数据库错误: ") + e->m_strError); } END_CATCH; } //************************************// // [函数]:ReadFromExcel // [描述]:读取Excel文件 // [参数]: // CString& strFile, Excel文件路径 // CString& strSql 设置读取的查询语句.注意此处表名的写法,excel里的表默认为系统表,所以访问表时表明应为[表名$] // CArray& arr 返回读取的数据 // [返回]: //************************************// void ExcelForODBC::ReadFromExcel(CString& strFile, CString& strSql, CArray& arr) { if(strFile == _T("")) return; CDatabase database; CString sDriver = _T(""); CString sDsn = _T(""); // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" sDriver = GetExcelDriver(); if (sDriver.IsEmpty()) { // 没有发现Excel驱动 AfxMessageBox(_T("没有安装Excel驱动!")); return; } // 创建进行存取的字符串 sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"), sDriver.GetBuffer(), strFile.GetBuffer()); TRY { // 打开数据库(既Excel文件) database.Open(NULL, FALSE, FALSE, sDsn); CString strTemp = _T("select count(*) as cot from [Sheet1$]"); CRecordset tagRecordset(&database); tagRecordset.Open(CRecordset::forwardOnly, strTemp); tagRecordset.GetFieldValue(_T("cot"), strTemp); tagRecordset.Close(); //char szValue[64] = {0}; //WChar2Char(szValue, strTemp); //int nSize = atol(szValue); int nSize = _tstol(strTemp); arr.SetSize(nSize, 1); CRecordset recset(&database); // 执行查询语句 recset.Open(CRecordset::forwardOnly, strSql, CRecordset::readOnly); // 获取查询结果 CString strIterm1(_T("")), strIterm2(_T("")); int nIdx = 0; while (!recset.IsEOF()) { //读取Excel内部数值 arr.ElementAt(nIdx).RemoveAll(); recset.GetFieldValue(_T("姓名"), strIterm1); recset.GetFieldValue(_T("电话号码"), strIterm2); strIterm2 = strIterm2.Left(strIterm2.Find(_T("."))); arr.ElementAt(nIdx).Add(_T("")); arr.ElementAt(nIdx).SetAt(0, strIterm1); arr.ElementAt(nIdx).Add(_T("")); arr.ElementAt(nIdx).SetAt(1, strIterm2); ++nIdx; // 移到下一行 recset.MoveNext(); if(nIdx >= arr.GetSize()) break; } // 关闭数据库 database.Close(); } CATCH(CDBException, e) { // 数据库操作产生异常时... AfxMessageBox(_T("数据库错误: ") + e->m_strError); } END_CATCH; }