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