bool CSpreadSheet::Open()
{
if (m_bExcel) // If file is an Excel spreadsheet
{
m_Database->OpenEx(m_sDsn, CDatabase::noOdbcDialog); // Open Sheet
m_rSheet = new CRecordset( m_Database );
m_sSql.Format("SELECT * FROM [%s$A1:IV65536]", m_sSheetName);
try
{
m_rSheet->Open(CRecordset::forwardOnly, m_sSql, CRecordset::readOnly);
}
catch(...)
{
delete m_rSheet;
m_rSheet = NULL;
m_Database->Close();
return false;
} // Get number of columns
m_dTotalColumns = m_rSheet->m_nResultCols; if (m_dTotalColumns != 0)
{
m_aRows.RemoveAll();
m_stempString.Empty();
m_bAppend = true;
m_dTotalRows++; // Keep count of total number of rows

// Get field names i.e header row
for (int i = 0; i < m_dTotalColumns; i++)
{
m_stempSql = m_rSheet->m_rgODBCFieldInfos[i].m_strName;
m_aFieldNames.Add(m_stempSql); // Join up all the columns into a string
if (i != m_dTotalColumns-1) // Not last column
{
m_stempString = m_stempString + "\"" + m_stempSql + "\"" + m_sSeparator;
}
else // Last column
{
m_stempString = m_stempString + "\"" + m_stempSql + "\"";
}
}

// Store the header row as the first row in memory
m_aRows.Add(m_stempString); // Read and store the rest of the rows in memory
while (!m_rSheet->IsEOF())
{
m_dTotalRows++; // Keep count of total number of rows
try
{
// Get all the columns in a row
m_stempString.Empty();
for (short column = 0; column < m_dTotalColumns; column++)
{
                                                //在这里获取每列的数据
m_rSheet->GetFieldValue(column, m_stempSql); // Join up all the columns into a string
if (column != m_dTotalColumns-1) // Not last column
{
m_stempString = m_stempString + "\"" + m_stempSql + "\"" + m_sSeparator;
}
else // Last column
{
m_stempString = m_stempString + "\"" + m_stempSql + "\"";
}
} // Store the obtained row in memory
m_aRows.Add(m_stempString);
m_rSheet->MoveNext();
}
catch (...)
{
m_sLastError = "Error reading row\n";
delete m_rSheet;
m_rSheet = NULL;
m_Database->Close();
return false;
}
}
}

m_rSheet->Close();
delete m_rSheet;
m_rSheet = NULL;
m_Database->Close();
m_dCurrentRow = 1;
return true;
}这个ODBC读取excel的代码我也是在csdn上面找到的
当excel的内容如下时:
第一行为列头  测试1  测试2  测试3
              1      2      3
              a      22    33读取第二行1、2、3时是没有问题的
当读取第三行的第一个单元格的内容时就获取不到,其它的都正常是不是用ODBC读取excel时某列的内容的类型要完全一致,要么都是数字要么都是字符串??????? 连接字符串m_Database = new CDatabase;
GetExcelDriver();
m_sDsn.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s", m_sExcelDriver, m_sFile, m_sFile);

解决方案 »

  1.   

    第一行为列头  测试1  测试2  测试3
                  a      a      a
                  1      2      3
                  a      22    33 在excel里这样处理下试试,然后读出数据后,a,a,a这行结果不要。也就是数据行(除列头)的第一行不要。
      

  2.   

    这样是不行的 我试过的 只要是某列既有数字又有字符串的时候肯定读取不正常的何况我要读取的excel文件是一个模板文件 不能修改里面的内容的
      

  3.   

    链接字符串
    ODBC
     
    标准
    Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=C:\MyExcel.xls;DefaultDir=c:\mypath;SQL表达式"SELECT * FROM [sheet1$]"。例如:在excel工作表名称后面跟"$"字符并且使用"[" "]"将其括起来。 
     
    OLE DB
     
    标准
    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";"HDR=Yes;" 表示工作表的第一行是表头,没有数据。 "HDR=No;"与之相反。
    "IMEX=1;"告诉驱动程序始终将"intermixed"数据类型(numbers, dates, strings等等)作为文本型读取。
    注意:该选项可能引起Excel工作表写权限的修改。  在ODBC中有没有类似于IMEX=1的这种选项????
      

  4.   

    把excel中每个列的数据改为字符型的呢?或者在代码里进行强制转换为字符型的呢?
      

  5.   

    m_rSheet = new CRecordset( m_Database );
    m_sSql.Format("SELECT * FROM [%s$A1:IV65536]", m_sSheetName);
    try
    {
        m_rSheet->Open(CRecordset::forwardOnly, m_sSql, CRecordset::readOnly);
    }
    在这个记录集里面第三行的第一个单元格的内容是空的用void GetFieldValue(short nIndex, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE);
    来获取时varValue.m_dwType是等于DBVT_NULL的
      

  6.   

    来获取第一列的CODBCFieldInfo fieldinfo时
    (fieldinfo).m_nSQLType是等于8的即double型但在excel中第三行第一列的值是a,是个字符串,导致类型不匹配 而无法获取到该单元格的内容有没有什么解决方案啊请各位大大指点下哈   急哈.........
      

  7.   

    这个问题我也遇到过,在数据库连接串中加上Extended Properties="Excel 8.0;HDR=Yes;IMEX=1;"问题就可以解决了IMEX=1选项可控制数据格式。
    IMEX的说明如下:
    "IMEX=1;"tellsthedrivertoalwaysread"intermixed"(numbers,dates,stringsetc)datacolumnsastext.Notethatthisoptionmightaffectexcelsheetwriteaccessnegative.
      

  8.   

    先导出为TXT文件(文本方式),再导回来
      

  9.   

    Extended Properties="Excel 8.0;HDR=Yes;IMEX=1; 对EXCEL没用