用ADO读取Excel文件,对于绝大多数单元格内容(都是文本格式)可以读出,但是对于某些个别的单元格读出为NULL.
我发现在各个单元格中如果是数字但是被当作文本显示时会在单元格左上角出现一个绿色的标记:数字为当作文字处理。这样的单元格可以被ADO顺利读出,而我这里提问的那些特别的单元格如果是数字则没有绿色的标记出现,就读成NULL了。
不知这个问题如何解决,从VC端或Excel端解决都行,只要是由计算机找出这些有问题的单元格就行。
如果需要,我可以Email给你有问题的Excel文件。
我发现在各个单元格中如果是数字但是被当作文本显示时会在单元格左上角出现一个绿色的标记:数字为当作文字处理。这样的单元格可以被ADO顺利读出,而我这里提问的那些特别的单元格如果是数字则没有绿色的标记出现,就读成NULL了。
不知这个问题如何解决,从VC端或Excel端解决都行,只要是由计算机找出这些有问题的单元格就行。
如果需要,我可以Email给你有问题的Excel文件。
可是我没有得到问题答案,也必须给分吗?
http://www.vckbase.com/document/viewdoc/?id=421。只有一点略有不同,他用的字段名取:
recset.GetFieldValue("Name ", sItem1);//sItem1为CString Type
我用的字段索引号取:
recset.GetFieldValue(index, sItem1);//index为short Type我取的区域都是数字,但某些列的读取正常,某些明明有数却读个NULL出来。
如果在这些无法正确读取的数前面加“'”(英文单撇号),就可以正确读取。
NULL、NULL、 DOUBLE,//简写类型
NULL、DOUBLE、DOUBLE,
NULL、DOUBLE、DOUBLE,
NULL、DOUBLE、DOUBLE,
NULL、DOUBLE、DOUBLE。太见鬼了!
{
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实现方法。
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”,还是不行。还望指教!
m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test2.xls;Extended Properties=Excel 8.0;HDR=NO;IMEX=1", "", "", adModeUnknown);
Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1\"
这里要用一层引号把“Extended Properties=”之后的东东引起来。