直接通过ODBC读写Excel表格文件
想要通过ODBC直接读、写Excel表格文件,首先,应确保ODBC中已安装有Excel表格文件的驱动"MICROSOFT EXCEL DRIVER (*.XLS)"。然后,可根据下面步骤进行:
1. 在StdAfx.h文件中加入:
1.#include < afxdb.h > 2.#include < odbcinst.h >2. 通过ODBC直接创建Excel文件并在表中插入数据(暂定文件名:Demo.xls)
01.//创建并写入Excel文件 02.void CRWExcel::WriteToExcel() 03.{ 04. CDatabase database; 05. CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动 06. CString sExcelFile = "c:\\demo.xls"; // 要建立的Excel文件 07. CString sSql; 08. 09. TRY 10. { 11. // 创建进行存取的字符串 12. sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s", 13. sDriver, sExcelFile, sExcelFile); 14. 15. // 创建数据库 (既Excel表格文件) 16. if( database.OpenEx(sSql,CDatabase::noOdbcDialog) ) 17. { 18. // 创建表结构(姓名、年龄) 19. sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)"; 20. database.ExecuteSQL(sSql); 21. 22. // 插入数值 23. sSql = "INSERT INTO demo (Name,Age) VALUES (''徐景周'',26)"; 24. database.ExecuteSQL(sSql); 25. 26. sSql = "INSERT INTO demo (Name,Age) VALUES (''徐志慧'',22)"; 27. database.ExecuteSQL(sSql); 28. 29. sSql = "INSERT INTO demo (Name,Age) VALUES (''郭徽'',27)"; 30. database.ExecuteSQL(sSql); 31. } 32. 33. // 关闭数据库 34. database.Close(); 35. } 36. CATCH_ALL(e) 37. { 38. TRACE1("Excel驱动没有安装: %s",sDriver); 39. } 40. END_CATCH_ALL; 41.}3. 通过ODBC直接读取Excel文件(暂定文件名:Demo.xls)
01.// 读取Excel文件 02.void CRWExcel::ReadFromExcel() 03.{ 04. CDatabase database; 05. CString sSql; 06. CString sItem1, sItem2; 07. CString sDriver; 08. CString sDsn; 09. CString sFile = "Demo.xls"; // 将被读取的Excel文件名 10. 11. // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" 12. sDriver = GetExcelDriver(); 13. if (sDriver.IsEmpty()) 14. { 15. // 没有发现Excel驱动 16. AfxMessageBox("没有安装Excel驱动!"); 17. return; 18. } 19. 20. // 创建进行存取的字符串 21. sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile); 22. 23. TRY 24. { 25. // 打开数据库(既Excel文件) 26. database.Open(NULL, false, false, sDsn); 27. 28. CRecordset recset(&database); 29. 30. // 设置读取的查询语句. 31. sSql = "SELECT Name, Age " 32. "FROM demo " 33. "ORDER BY Name "; 34. 35. // 执行查询语句 36. recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly); 37. 38. // 获取查询结果 39. while (!recset.IsEOF()) 40. { 41. //读取Excel内部数值 42. recset.GetFieldValue("Name ", sItem1); 43. recset.GetFieldValue("Age", sItem2); 44. 45. // 移到下一行 46. recset.MoveNext(); 47. } 48. 49. // 关闭数据库 50. database.Close(); 51. 52. } 53. CATCH(CDBException, e) 54. { 55. // 数据库操作产生异常时... 56. AfxMessageBox("数据库错误: " + e->m_strError); 57. } 58. END_CATCH; 59.}4. 获取ODBC中Excel驱动的函数
01.CString CRWExcel::GetExcelDriver() 02.{ 03. char szBuf[2001]; 04. WORD cbBufMax = 2000; 05. WORD cbBufOut; 06. char *pszBuf = szBuf; 07. CString sDriver; 08. 09. // 获取已安装驱动的名称(涵数在odbcinst.h里) 10. if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut)) 11. return ""; 12. 13. // 检索已安装的驱动是否有Excel... 14. do15. { 16. if (strstr(pszBuf, "Excel") != 0) 17. { 18. //发现 ! 19. sDriver = CString(pszBuf); 20. break; 21. } 22. pszBuf = strchr(pszBuf, ''\0'') + 1; 23. } 24. while (pszBuf[1] != ''\0''); 25. 26. return sDriver; 27.}

浙公网安备 33010602011771号