ADO为何对某些Excel单元格中的内容读不出来

mx17 2006-04-25 10:24:46
用ADO读取Excel文件,对于绝大多数单元格内容(都是文本格式)可以读出,但是对于某些个别的单元格读出为NULL.
我发现在各个单元格中如果是数字但是被当作文本显示时会在单元格左上角出现一个绿色的标记:数字为当作文字处理。这样的单元格可以被ADO顺利读出,而我这里提问的那些特别的单元格如果是数字则没有绿色的标记出现,就读成NULL了。
不知这个问题如何解决,从VC端或Excel端解决都行,只要是由计算机找出这些有问题的单元格就行。
如果需要,我可以Email给你有问题的Excel文件。

...全文
597 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Apezyfly 2006-06-09
  • 打赏
  • 举报
回复
再请教JAZY,我尝试用ADO方式,连接字符中一旦加入HDR=NO或IMEX=1,连接就出错,不加是对的,请问这两个参数该如何加啊?
m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test2.xls;Extended Properties=Excel 8.0;HDR=NO;IMEX=1", "", "", adModeUnknown);
jazy 2006-06-09
  • 打赏
  • 举报
回复
是这样写:
Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1\"
这里要用一层引号把“Extended Properties=”之后的东东引起来。
jazy 2006-06-08
  • 打赏
  • 举报
回复
ODBC不懂。。。我曾经为这个问题把一个项目所有数据库访问方式修改为ADO了,hoho
Apezyfly 2006-06-07
  • 打赏
  • 举报
回复
jazy兄,你的方法我看了,但依然找不到解决之道。

我用的是ODBC的方法,代码如下:

sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)";
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, m_sFileXls);
TRY {
database.Open(NULL, FALSE, FALSE, sDsn);
CRecordset recset( &database );
sSql = "SELECT * FROM [sheet1$]";//所以被处理的EXL表必须改名"sheet1"
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
………………
后来改成:
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s;IMEX=1", sDriver, m_sFileXls);
增加了“IMEX=1”,还是不行。

还望指教!

mx17 2006-06-03
  • 打赏
  • 举报
回复
看来多等了这几天真没白等,立即给分并且提交FAQ,给热心人增加信誉
jazy 2006-06-03
  • 打赏
  • 举报
回复
lz看我给你的链接了吗?我遇到过跟你一模一样的问题,按照别人的方法解决了的。
Apezyfly 2006-06-02
  • 打赏
  • 举报
回复
void CExcel_ReadDlg::OnButton1()
{
CSpreadSheet SS("C:\\0603.xls", "Sheet1");

CStringArray Rows, Column;

for (int i=1; i<=SS.GetTotalRows(); i++) {
// 读取一行
SS.ReadRow(Rows, i);
CString strContents = "";
for (int j=1; j<=Rows.GetSize(); j++) {
if (j==1)
strContents = Rows.GetAt(j-1);
else
strContents = strContents + "-->" + Rows.GetAt(j-1);
}

}
}
***********************
用CSpreadSheet的方法也试了,结果还是一样。查看该类实现代码,内部也是一样的ODBC实现方法。
jazy 2006-06-02
  • 打赏
  • 举报
回复
http://whalechen.cnblogs.com/archive/2006/04/26/385930.html
jazy 2006-06-02
  • 打赏
  • 举报
回复
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;257819
Apezyfly 2006-06-02
  • 打赏
  • 举报
回复
新发现。

用CDBVariant保存单元格内容,发现出问题的单元格类型都是“DBVT_NULL”,正常读取的都是“DBVT_DOUBLE”。

有兴趣的朋友可以看一下这个EXCEL:http://zyfly.net/rar/0603.rar。

从单元格E8开始,每列的类型依次是:
NULL、NULL、 DOUBLE,//简写类型
NULL、DOUBLE、DOUBLE,
NULL、DOUBLE、DOUBLE,
NULL、DOUBLE、DOUBLE,
NULL、DOUBLE、DOUBLE。

太见鬼了!
Apezyfly 2006-06-02
  • 打赏
  • 举报
回复
亲人啊,我也遇到类似问题。

我是用的ODBC方式读取EXCEL。环境:VC6.0,OS:XP,EXCEL 2000。

读取的具体方式如这里描述:
http://www.vckbase.com/document/viewdoc/?id=421。

只有一点略有不同,他用的字段名取:
recset.GetFieldValue("Name ", sItem1);//sItem1为CString Type
我用的字段索引号取:
recset.GetFieldValue(index, sItem1);//index为short Type

我取的区域都是数字,但某些列的读取正常,某些明明有数却读个NULL出来。
如果在这些无法正确读取的数前面加“'”(英文单撇号),就可以正确读取。
kkkgk 2006-05-22
  • 打赏
  • 举报
回复
可能是Excel中字段类型不一致吧!你应该用CDBVariant去读,判断什么类型字段,然后在定
mx17 2006-05-21
  • 打赏
  • 举报
回复
看来这80分要白扔了,真的没有高手吗
mx17 2006-05-14
  • 打赏
  • 举报
回复
to goodboyws(深夜不眠者(VCMVP)) 网友,
可是我没有得到问题答案,也必须给分吗?
goodboyws 2006-05-12
  • 打赏
  • 举报
回复
有人回了就没法删除
mx17 2006-05-11
  • 打赏
  • 举报
回复
最后一顶,本想删贴,不知为何无法删除
littleeagle007 2006-04-26
  • 打赏
  • 举报
回复
pirate-king@163.com 顺便把你的到入到excel的代码一起发。
goodboyws 2006-04-25
  • 打赏
  • 举报
回复
可以尝试用office自动化来解决

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧