想要通过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. do
15. {
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.}