怎样通过ODBC直接读、写Excel表格文件

怎样通过ODBC直接读、写Excel表格文件,第1张

想要通过ODBC直接读、写Excel表格文件,首先,应确保ODBC中已安装有Excel表格文件的驱动"MICROSOFT EXCEL DRIVER (*.XLS)"。然后,可根据下面步骤进行:

1. 在StdAfx.h文件中加入:

#include <afxdb.h>

#include <odbcinst.h>

2. 通过ODBC直接创建Excel文件并在表中插入数据(暂定文件名:Demo.xls) //创建并写入Excel文件

void CRWExcel::WriteToExcel()

{

CDatabase database

CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"// Excel安装驱动

CString sExcelFile = "c:\\demo.xls" // 要建立的Excel文件顷纯

CString sSql

TRY

{

// 创建进行存取芹镇的字符串

sSql.Format("DRIVER={%s}DSN=''''FIRSTROWHASNAMES=1READONLY=FALSECREATE_DB=\"%s\"DBQ=%s",

sDriver, sExcelFile, sExcelFile)

// 创建数据库 (既Excel表格文件)

if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )

{

// 创建表结构(姓名、年龄)

sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)"

database.ExecuteSQL(sSql)

// 插入数值

sSql = "INSERT INTO demo (Name,Age) VALUES (''徐景周'',26)"

database.ExecuteSQL(sSql)

sSql = "INSERT INTO demo (Name,Age) VALUES (''徐志慧'',22)"

database.ExecuteSQL(sSql)

sSql = "INSERT INTO demo (Name,Age) VALUES (''郭徽'',27)"

database.ExecuteSQL(sSql)

}

// 关闭数据库

database.Close()

}

CATCH_ALL(e)

{

TRACE1("Excel驱动没有安装: %s",sDriver)

}

END_CATCH_ALL

}

3. 通过ODBC直接读取Excel文件(暂定文件名:Demo.xls) // 读取Excel文件

void CRWExcel::ReadFromExcel()

{

CDatabase database

CString sSql

CString sItem1, sItem2

CString sDriver

CString sDsn

CString sFile = "Demo.xls" // 将被读取的Excel文件名

// 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"

sDriver = GetExcelDriver()

if (sDriver.IsEmpty())

{

// 没有发现Excel驱动

AfxMessageBox("没有安装Excel驱动!")

return

}

// 创建进行存取的字符串嫌乎粗

sDsn.Format("ODBCDRIVER={%s}DSN=''''DBQ=%s", sDriver, sFile)

TRY

{

// 打开数据库(既Excel文件)

database.Open(NULL, false, false, sDsn)

CRecordset recset(&database)

// 设置读取的查询语句.

sSql = "SELECT Name, Age "

"FROM demo "

"ORDER BY Name "

// 执行查询语句

recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly)

// 获取查询结果

while (!recset.IsEOF())

{

//读取Excel内部数值

recset.GetFieldValue("Name ", sItem1)

recset.GetFieldValue("Age", sItem2)

// 移到下一行

recset.MoveNext()

}

// 关闭数据库

database.Close()

}

CATCH(CDBException, e)

{

// 数据库 *** 作产生异常时...

AfxMessageBox("数据库错误: " + e->m_strError)

}

END_CATCH

}

4. 获取ODBC中Excel驱动的函数 CString CRWExcel::GetExcelDriver()

{

char szBuf[2001]

WORD cbBufMax = 2000

WORD cbBufOut

char *pszBuf = szBuf

CString sDriver

// 获取已安装驱动的名称(涵数在odbcinst.h里)

if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))

return ""

// 检索已安装的驱动是否有Excel...

do

{

if (strstr(pszBuf, "Excel") != 0)

{

//发现 !

sDriver = CString(pszBuf)

break

}

pszBuf = strchr(pszBuf, ''\0'') + 1

}

while (pszBuf[1] != ''\0'')

return sDriver

由于微软在2017-10-10左右更新了安全补丁(KB4041678,KB4041681)

从而更新了Microsoft JET Database Engine导致asp、asp.net等无法读取Excel。

出错提示1:Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'

[Microsoft][ODBC Excel 驱动程序] 保留错误 (-5016); 没有这种错误的消息。

出错提示2:导入或者查询excel 提示:外部数据库驱动程序中(1)的意外错误

一直正常,没有修改过配置,只是更新了并梁补丁就查询不了了,所以基本上是补丁问题。

百度到的方法大都是卸载补丁

解决方案:在控制面板>程序>程序和功能>已安装更新中,找到对应的两个补丁,进行卸载。

本人也收到多位asp+excel通用查询系统忠实用户的反馈。

其中一位用户提供了解决方法,本人亲测可用,故予以分享。

实现原理:使用旧版msexcl40.dll即可解决。

第一步:下载旧版 msexcl40.dll

打补丁后异常的新版:337KB版本4.0.9801.1

我们得下载最新旧版:332KB版本4.0.9801.0

或更早版本绝模运:比如:4.0.9502.0

第二步:更名后复制到相同位置

文件名码羡更改msexcl40.dll为msexcl40_aiyaha.dll

复制到C:\Windows\SysWOW64\下

新复制的旧版位置:C:\Windows\SysWOW64\msexcl40_aiyaha.dll

第三步:修改注册表对应的位置参数

运行-->regedit 进入注册表并搜索msexcl40.dll

得到注册表位置:(如图)

双击修改名称win32值为:C:\Windows\SysWOW64\msexcl40_aiyaha.dll

第四步:Win2008 64位环境下亲测,无需重启已经正常


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12254571.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存