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);
a a a
1 2 3
a 22 33 在excel里这样处理下试试,然后读出数据后,a,a,a这行结果不要。也就是数据行(除列头)的第一行不要。
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的这种选项????
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的
(fieldinfo).m_nSQLType是等于8的即double型但在excel中第三行第一列的值是a,是个字符串,导致类型不匹配 而无法获取到该单元格的内容有没有什么解决方案啊请各位大大指点下哈 急哈.........
IMEX的说明如下:
"IMEX=1;"tellsthedrivertoalwaysread"intermixed"(numbers,dates,stringsetc)datacolumnsastext.Notethatthisoptionmightaffectexcelsheetwriteaccessnegative.