使用OBDC读取Excel表格数据 哪位仁兄知道,在VC2005中,使用ODBC读取Excel数据时,如果没有表头,怎样直接读取Excel数据的方法?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用ADO吧,置顶的帖子里有,Excel数据库连接字符串"HDR=Yes;" indicates that the first row contains columnnames, not data. "HDR=No;" indicates the opposite. 置顶的帖子里都是介绍怎样操作Access的,没有关于Excel的,请指教 连接字符串换成Excel就行了,其他差不多。 我只学过odbc,而且还学得不怎么样,希望高手指点一下…… 只是连接字符串不同而已,区别不大。 tmp.Format(TEXT("Driver={Microsoft Excel Driver (*.xls)};Dbq=%s;ReadOnly=1;"), resToken); try { db.OpenEx(tmp, CDatabase::openReadOnly); if (db.IsOpen()) { lb->InsertString(-1, TEXT("")); tmp.Format(TEXT("打开Excel文件: %s 成功!准备转换数据...."), resToken); lb->InsertString(-1, tmp); lb->SetCurSel(lb->GetCount()-1); rs.Open(-1, TEXT("select * from [sheet1$]")); } }catch(CDBException &e) { e.ReportError(); } CString ReadExcel:: GetExcelDriver(){TCHAR szBuf[2001];WORD cbBufMax = 2000;WORD cbBufOut;TCHAR *pszBuf = szBuf;CString sDriver;// 获取已安装驱动的名称(涵数在odbcinst.h里)//获取系统中已经安装的数据库驱动器信息可以通过SQLGetInstalledDrivers函数来实现。该函数定义如下: //BOOL SQLGetInstalledDrivers( // LPSTR lpszBuf, //保存驱动器信息的缓冲区 // WORD cbBufMax, //缓冲区最大长度 // WORD * pcbBufOut //返回的实际使用的缓冲区长度 // )if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut)) return "";// 检索已安装的驱动是否有Excel...do{ if (_tcsstr(pszBuf, _T("Excel")) != 0) //char *strstr(char *str1,char *str2);作用是找出str2字符串在str1字符串中第一次出现 //的位置(不包括str2的串结束符),如果找到返回该位置的指针。若找不到,返回NULL指针 { //发现 ! sDriver = CString(pszBuf); break; } pszBuf = wcschr(pszBuf, _T('\0')) + 1;}while (pszBuf[1] != '\0');return sDriver;}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////获得excel文件路径void ReadExcel::Initial_path( ){ CFileDialog MyDlg(TRUE, NULL,_T("xls"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Worksheet Files (*.xls)|*.xls"), NULL); if (MyDlg.DoModal()==IDOK) { ExcelName=MyDlg.GetFileName();}}//设定sheet名和行名void ReadExcel::Initial_sheet_columnname(CString _sheet, CString _columnname){SheetName = _sheet;ColumnName = _columnname;CString _temp = _columnname;ColumnLength = _temp.Remove(',') + 1;}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////打开excel文件void ReadExcel::Open_DataBase(){ // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" sDriver = GetExcelDriver();if (sDriver.IsEmpty()){// 没有发现Excel驱动AfxMessageBox(_T("没有安装Excel驱动!"));return;}// 创建进行存取的字符串sDsn.Format(_T("ODBC;DRIVER={%s};DSN='';DBQ=%s"), sDriver, ExcelName);TRY{// 打开数据库(既Excel文件)database.Open(NULL, false, false, sDsn);recset = new CRecordset(&database);//recset = &database;//CRecordset recset(&database);// 设置读取的查询语句.sSql = _T("SELECT ") + ColumnName + _T(" FROM ") + SheetName;//"ORDER BY Name ";// 执行查询语句recset->Open(CRecordset::forwardOnly/*dynamic*/, sSql, CRecordset::readOnly); }CATCH(CDBException, e){// 数据库操作产生异常时...AfxMessageBox(_T("数据库错误: ") + e->m_strError);}END_CATCH;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////关闭excel文件void ReadExcel::Close_DataBae(){recset->Close();// 关闭数据库database.Close();}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////还是请教高人,使用ODBC的方法,在上述代码中能做修改不? 对Excel而言,真不需要使用ODBC~ 功能强大的IOCP Socket Server模块源码——完成端口通讯服务器(IOCP Socket Server)设计(六) dll,ocx,lib,oca文件都有什么区别呀?同名的文件分别有这几种扩展名? 关于C/S型程序用邮箱做跳板进行P2P通信的问题 调试程序的问题 mysql+vc 记录集显示问题 谢了先 关于VC程序中快捷键调用方法的实现? VC中的指数运算是怎么写的? 简单画正多边形问题 找高手交流,共同成长!!! VC++的小问题,新手问题。怎样制作一个安装程序? 数据流和字节可以一起发送吗? 问个MFC Serialize的问题,希望高手们帮帮忙……
"HDR=Yes;" indicates that the first row contains columnnames, not data. "HDR=No;" indicates the opposite.
{
db.OpenEx(tmp, CDatabase::openReadOnly);
if (db.IsOpen())
{
lb->InsertString(-1, TEXT(""));
tmp.Format(TEXT("打开Excel文件: %s 成功!准备转换数据...."), resToken);
lb->InsertString(-1, tmp);
lb->SetCurSel(lb->GetCount()-1);
rs.Open(-1, TEXT("select * from [sheet1$]"));
}
}catch(CDBException &e)
{
e.ReportError();
}
{
TCHAR szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut;
TCHAR *pszBuf = szBuf;
CString sDriver;
// 获取已安装驱动的名称(涵数在odbcinst.h里)//获取系统中已经安装的数据库驱动器信息可以通过SQLGetInstalledDrivers函数来实现。该函数定义如下:
//BOOL SQLGetInstalledDrivers(
// LPSTR lpszBuf, //保存驱动器信息的缓冲区
// WORD cbBufMax, //缓冲区最大长度
// WORD * pcbBufOut //返回的实际使用的缓冲区长度
// )if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
return "";
// 检索已安装的驱动是否有Excel...
do
{
if (_tcsstr(pszBuf, _T("Excel")) != 0) //char *strstr(char *str1,char *str2);作用是找出str2字符串在str1字符串中第一次出现
//的位置(不包括str2的串结束符),如果找到返回该位置的指针。若找不到,返回NULL指针
{
//发现 !
sDriver = CString(pszBuf);
break;
}
pszBuf = wcschr(pszBuf, _T('\0')) + 1;
}
while (pszBuf[1] != '\0');return sDriver;
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////获得excel文件路径
void ReadExcel::Initial_path( )
{
CFileDialog MyDlg(TRUE, NULL,_T("xls"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Worksheet Files (*.xls)|*.xls"), NULL);
if (MyDlg.DoModal()==IDOK)
{ ExcelName=MyDlg.GetFileName();}}
//设定sheet名和行名
void ReadExcel::Initial_sheet_columnname(CString _sheet, CString _columnname)
{
SheetName = _sheet;
ColumnName = _columnname;
CString _temp = _columnname;
ColumnLength = _temp.Remove(',') + 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////打开excel文件
void ReadExcel::Open_DataBase()
{
// 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
// 没有发现Excel驱动
AfxMessageBox(_T("没有安装Excel驱动!"));
return;
}
// 创建进行存取的字符串
sDsn.Format(_T("ODBC;DRIVER={%s};DSN='';DBQ=%s"), sDriver, ExcelName);
TRY
{
// 打开数据库(既Excel文件)
database.Open(NULL, false, false, sDsn);
recset = new CRecordset(&database);
//recset = &database;
//CRecordset recset(&database);
// 设置读取的查询语句.
sSql = _T("SELECT ") + ColumnName + _T(" FROM ") + SheetName;//"ORDER BY Name ";
// 执行查询语句
recset->Open(CRecordset::forwardOnly/*dynamic*/, sSql, CRecordset::readOnly);
}
CATCH(CDBException, e)
{
// 数据库操作产生异常时...
AfxMessageBox(_T("数据库错误: ") + e->m_strError);
}
END_CATCH;
}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//关闭excel文件
void ReadExcel::Close_DataBae()
{
recset->Close();
// 关闭数据库
database.Close();
}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
还是请教高人,使用ODBC的方法,在上述代码中能做修改不?