直接通过ODBC读写Excel文件,出现不稳定的现象。请帮忙看看…… vc/mfc Dialog项目小弟根据http://www.vckbase.com/document/viewdoc/?id=421提供的方法,实现了通过ODBC读取Excel文件的功能。但是在几次测试后发现,有时候某条记录没有办法读出来!!有时候某几个单元格里面的数据没有办法读取出来。除了定义好了工作表外,是不是还要进行什么设置,才可以让读取操作稳定?请指点…… 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先贴一下我的代码吧,欢迎指正:void CMTBill::OnBnClickedBndatabase(){ try { CDatabase db; CString sSql; CString sItem[12]; CString sDsn; CString pathName; CFileDialog dlg(TRUE,//Save; "xls",NULL,OFN_HIDEREADONLY, "Microsoft Excel 2000 (*.xls)|*.xls|所有文件(*.*)|*.*||",this); if(dlg.DoModal() == IDOK) { pathName = dlg.GetPathName(); pathName.Replace("\\", "\\\\");//路径格式转换 } else return;//返回 CString sDriver = GetExcelDriver(); sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, pathName); if (db.Open(NULL, false, false, sDsn)) { int nIndex = 0; CRecordset recset(&db); //设置读取的查询语句. sSql = "SELECT * FROM MT";//“MT”是我在EXCEL中定义的表名 //执行查询语句 recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly); //获取查询结果 while (!recset.IsEOF()) { //读取Excel内部数值 recset.GetFieldValue(nIndex, sItem[0]); recset.GetFieldValue(nIndex + 1, sItem[1]); recset.GetFieldValue(nIndex + 2, sItem[2]); recset.GetFieldValue(nIndex + 3, sItem[3]); recset.GetFieldValue(nIndex + 4, sItem[4]); recset.GetFieldValue(nIndex + 5, sItem[5]); recset.GetFieldValue(nIndex + 6, sItem[6]); recset.GetFieldValue(nIndex + 7, sItem[7]); recset.GetFieldValue(nIndex + 8, sItem[8]); recset.GetFieldValue(nIndex + 9, sItem[9]); // 移到下一行 recset.MoveNext(); } } db.Close(); } } catch (CDBException* e) { e->ReportError(); e->Delete(); } 楼主的说明:系统为XP,安装OFFICE2000有没有哪位大侠可以给我指点一下,谢谢!关注…… 没碰到。我所见到的都是简单应用。据说有点限制:方法1:将要读的区域定义一下。方法2:表名用[sheet1$]格式。这种方法要求题目与数据间无空行,是一种简单EXCEL表的读取,如果你的EXCEL表较复杂,则可能会有此问题。你是用方法1,但我没有碰到。 楼主的说明:谢谢ggw(格格巫)的回复,我的确是使用的方法1。1、我的EXCEL并不复杂,我进行的也只是简单的逐行读取EXCEL中单元格的数据。2、你所说的方法2,我不是很清楚,能不能具体一点给我讲述一下?3、哪位大侠有兴趣的话,可以试一下我的代码,看看会不会出现不稳定的现象。学习…… 如何得到某个桌面进程的HINSTANCE? PostNcDestroy 中Delete this 抛出异常的原因(分享)! DX版本号 ADO访问数据库 ADO连接错误后,错误信息处理后的错误处理方法? continue 100 points 帮忙看看ADO问题 请教:怎样读取计算机中的机器名 Medicalsoft Co. Ltd. 招贤纳士 如何设置对话框边界延伸 为什么给Ctime控件赋值时不是时显示不了就是秒显示不了??? 请问如何把VC下的类的各种继承关系转成类图?有没有什么软件?怎么用?
void CMTBill::OnBnClickedBndatabase()
{
try
{
CDatabase db;
CString sSql;
CString sItem[12];
CString sDsn;
CString pathName;
CFileDialog dlg(TRUE,//Save;
"xls",NULL,OFN_HIDEREADONLY, "Microsoft Excel 2000 (*.xls)|*.xls|所有文件(*.*)|*.*||",this);
if(dlg.DoModal() == IDOK)
{
pathName = dlg.GetPathName();
pathName.Replace("\\", "\\\\");//路径格式转换
}
else return;//返回
CString sDriver = GetExcelDriver();
sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, pathName);
if (db.Open(NULL, false, false, sDsn))
{
int nIndex = 0;
CRecordset recset(&db);
//设置读取的查询语句.
sSql = "SELECT * FROM MT";//“MT”是我在EXCEL中定义的表名
//执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
//获取查询结果
while (!recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue(nIndex, sItem[0]);
recset.GetFieldValue(nIndex + 1, sItem[1]);
recset.GetFieldValue(nIndex + 2, sItem[2]);
recset.GetFieldValue(nIndex + 3, sItem[3]);
recset.GetFieldValue(nIndex + 4, sItem[4]);
recset.GetFieldValue(nIndex + 5, sItem[5]);
recset.GetFieldValue(nIndex + 6, sItem[6]);
recset.GetFieldValue(nIndex + 7, sItem[7]);
recset.GetFieldValue(nIndex + 8, sItem[8]);
recset.GetFieldValue(nIndex + 9, sItem[9]);
// 移到下一行
recset.MoveNext();
}
}
db.Close();
}
}
catch (CDBException* e)
{
e->ReportError();
e->Delete();
}
我所见到的都是简单应用。
据说有点限制:
方法1:将要读的区域定义一下。
方法2:表名用[sheet1$]格式。这种方法要求题目与数据间无空行,是一种简单EXCEL表的读取,如果你的EXCEL表较复杂,则可能会有此问题。
你是用方法1,但我没有碰到。