ExcelForODBC.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include "stdafx.h"
  2. #include <odbcinst.h>
  3. #include "ExcelForODBC.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #endif
  7. ExcelForODBC::ExcelForODBC()
  8. {
  9. }
  10. ExcelForODBC::~ExcelForODBC()
  11. {
  12. }
  13. //************************************//
  14. // [函数]:GetExcelDriver
  15. // [描述]:读取Excel驱动
  16. // [参数]:
  17. // [返回]:CString返回驱动名
  18. //************************************//
  19. CString ExcelForODBC::GetExcelDriver()
  20. {
  21. TCHAR wszBuf[1024] = {0};
  22. WORD cbBufMax = 2000;
  23. WORD cbBufOut;
  24. // 获取已安装驱动的名称(涵数在odbcinst.h里)
  25. if (!SQLGetInstalledDrivers(wszBuf, cbBufMax, &cbBufOut))
  26. {
  27. ::AfxMessageBox(_T("Failed!"));
  28. return 0;
  29. }
  30. // 检索已安装的驱动是否有Excel...
  31. int nlen = 0;
  32. int npos = 0;
  33. TCHAR szBuf[512] = {0};
  34. TCHAR* pBuf = wszBuf;
  35. CString strMsg;
  36. while(1)
  37. {
  38. memset(szBuf, 0, 512*sizeof(TCHAR));
  39. //nlen = WChar2Char(szBuf, pBuf + npos);
  40. nlen = _tcslen(pBuf + npos);
  41. if(nlen == 0)
  42. break;
  43. npos += (nlen + 1);
  44. printf("发现 %s\n", szBuf);
  45. if(_tcscmp(szBuf, _T("Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)")) == 0
  46. || _tcscmp(szBuf, _T("Microsoft Excel-Treiber (*.xls)")) == 0
  47. || _tcscmp(szBuf, _T("Microsoft Excel Driver (*.xls)")) == 0
  48. || _tcscmp(szBuf, _T("Driver do Microsoft Excel (*.xls)")) == 0)
  49. {
  50. //WCHAR wsztmp[512] = {0};
  51. //Char2WChar(wsztmp, szBuf);
  52. return szBuf;
  53. }
  54. }
  55. return _T("");
  56. }
  57. //创建并写入Excel文件
  58. void ExcelForODBC::WriteToExcel(CString& strFile)
  59. {
  60. CDatabase database;
  61. CString sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)"); // Excel安装驱动
  62. CString strSql = _T("");
  63. TRY
  64. {
  65. // 创建进行存取的字符串
  66. strSql.Format(_T("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"), sDriver.GetBuffer(), strFile.GetBuffer(), strFile.GetBuffer());
  67. // 创建数据库 (既Excel表格文件)
  68. if(database.OpenEx(strSql,CDatabase::noOdbcDialog))
  69. {
  70. // 创建表结构(姓名、年龄)
  71. strSql = _T("CREATE TABLE demo (Name TEXT,Age NUMBER)");
  72. database.ExecuteSQL(strSql);
  73. // 插入数值
  74. strSql = _T("INSERT INTO demo (Name,Age) VALUES (''徐景周'',26)");
  75. database.ExecuteSQL(strSql);
  76. strSql = _T("INSERT INTO demo (Name,Age) VALUES (''徐志慧'',22)");
  77. database.ExecuteSQL(strSql);
  78. strSql = _T("INSERT INTO demo (Name,Age) VALUES (''郭徽'',27)");
  79. database.ExecuteSQL(strSql);
  80. }
  81. // 关闭数据库
  82. database.Close();
  83. }
  84. CATCH(CDBException, e)
  85. {
  86. // 数据库操作产生异常时...
  87. AfxMessageBox(_T("数据库错误: ") + e->m_strError);
  88. }
  89. END_CATCH;
  90. }
  91. //************************************//
  92. // [函数]:ReadFromExcel
  93. // [描述]:读取Excel文件
  94. // [参数]:
  95. // CString& strFile, Excel文件路径
  96. // CString& strSql 设置读取的查询语句.注意此处表名的写法,excel里的表默认为系统表,所以访问表时表明应为[表名$]
  97. // CArray<CStringArray, CStringArray>& arr 返回读取的数据
  98. // [返回]:
  99. //************************************//
  100. void ExcelForODBC::ReadFromExcel(CString& strFile, CString& strSql, CArray<CStringArray, CStringArray>& arr)
  101. {
  102. if(strFile == _T(""))
  103. return;
  104. CDatabase database;
  105. CString sDriver = _T("");
  106. CString sDsn = _T("");
  107. // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"
  108. sDriver = GetExcelDriver();
  109. if (sDriver.IsEmpty())
  110. {
  111. // 没有发现Excel驱动
  112. AfxMessageBox(_T("没有安装Excel驱动!"));
  113. return;
  114. }
  115. // 创建进行存取的字符串
  116. sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"), sDriver.GetBuffer(), strFile.GetBuffer());
  117. TRY
  118. {
  119. // 打开数据库(既Excel文件)
  120. database.Open(NULL, FALSE, FALSE, sDsn);
  121. CString strTemp = _T("select count(*) as cot from [Sheet1$]");
  122. CRecordset tagRecordset(&database);
  123. tagRecordset.Open(CRecordset::forwardOnly, strTemp);
  124. tagRecordset.GetFieldValue(_T("cot"), strTemp);
  125. tagRecordset.Close();
  126. //char szValue[64] = {0};
  127. //WChar2Char(szValue, strTemp);
  128. //int nSize = atol(szValue);
  129. int nSize = _tstol(strTemp);
  130. arr.SetSize(nSize, 1);
  131. CRecordset recset(&database);
  132. // 执行查询语句
  133. recset.Open(CRecordset::forwardOnly, strSql, CRecordset::readOnly);
  134. // 获取查询结果
  135. CString strIterm1(_T("")), strIterm2(_T(""));
  136. int nIdx = 0;
  137. while (!recset.IsEOF())
  138. {
  139. //读取Excel内部数值
  140. arr.ElementAt(nIdx).RemoveAll();
  141. recset.GetFieldValue(_T("姓名"), strIterm1);
  142. recset.GetFieldValue(_T("电话号码"), strIterm2);
  143. strIterm2 = strIterm2.Left(strIterm2.Find(_T(".")));
  144. arr.ElementAt(nIdx).Add(_T(""));
  145. arr.ElementAt(nIdx).SetAt(0, strIterm1);
  146. arr.ElementAt(nIdx).Add(_T(""));
  147. arr.ElementAt(nIdx).SetAt(1, strIterm2);
  148. ++nIdx;
  149. // 移到下一行
  150. recset.MoveNext();
  151. if(nIdx >= arr.GetSize())
  152. break;
  153. }
  154. // 关闭数据库
  155. database.Close();
  156. }
  157. CATCH(CDBException, e)
  158. {
  159. // 数据库操作产生异常时...
  160. AfxMessageBox(_T("数据库错误: ") + e->m_strError);
  161. }
  162. END_CATCH;
  163. }