123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- #include "stdafx.h"
- #include <odbcinst.h>
- #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<CStringArray, CStringArray>& arr 返回读取的数据
- // [返回]:
- //************************************//
- void ExcelForODBC::ReadFromExcel(CString& strFile, CString& strSql, CArray<CStringArray, CStringArray>& 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;
- }
|