Poniżej jest przykład odczytu konkretnych pól z arkusza Excel, proszę przeanalizować też kod...

user image

void CReadExcelDlg::OnButton1() 
{
	CDatabase database;
	CString sSql;
	CString sItem1, sItem2;
	CString sDriver;
	CString sDsn;
	CString sFile = "ReadExcel.xls";		// the file name. Could also be something like C:\\Sheets\\WhatDoIKnow.xls
	
	// Clear the contents of the listbox
	m_ctrlList.ResetContent();
	
	// Retrieve the name of the Excel driver. This is 
	// necessary because Microsoft tends to use language
	// specific names like "Microsoft Excel Driver (*.xls)" versus
	// "Microsoft Excel Treiber (*.xls)"
	sDriver = GetExcelDriver();
	if( sDriver.IsEmpty() )
	{
		// Blast! We didn´t find that driver!
		AfxMessageBox("No Excel ODBC driver found");
		return;
	}
	
	// Create a pseudo DSN including the name of the Driver and the Excel file
	// so we don´t have to have an explicit DSN installed in our ODBC admin
	sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);

	TRY
	{
		// Open the database using the former created pseudo DSN
		database.Open(NULL,false,false,sDsn);
				
		// Allocate the recordset
		CRecordset recset( &database );

		

		// Build the SQL string
		// Remember to name a section of data in the Excel sheet using "Insert->Names" to be
		// able to work with the data like you would with a table in a "real" database. There
		// may be more than one table contained in a worksheet.
		sSql = 	"SELECT field_1, field_2 "		
				"FROM demo_table "										 "ORDER BY field_1";
	
		// Execute that query (implicitly by opening the recordset)
		recset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);

		

		// Browse the result
		while( !recset.IsEOF() )
		{
			// Read the result line
			recset.GetFieldValue("field_1",sItem1);
			recset.GetFieldValue("field_2",sItem2);
					
			// Insert result into the list
			m_ctrlList.AddString( sItem1 + " --> "+sItem2);

			// Skip to the next resultline
			recset.MoveNext();
		}

		// Close the database
		database.Close();
							 
	}
	CATCH(CDBException, e)
	{
		// A database exception occured. Pop out the details...
		AfxMessageBox("Database error: "+e->m_strError);
	}
	END_CATCH;
}


// Get the name of the Excel-ODBC driver
CString CReadExcelDlg::GetExcelDriver()
{
	char szBuf[2001];
	WORD cbBufMax = 2000;
	WORD cbBufOut;
	char *pszBuf = szBuf;
	CString sDriver;

	// Get the names of the installed drivers ("odbcinst.h" has to be included )
   if(!SQLGetInstalledDrivers(szBuf,cbBufMax,& cbBufOut))
		return "";
	
	// Search for the driver...
	do
	{
		if( strstr( pszBuf, "Excel" ) != 0 )
		{
			// Found !
			sDriver = CString( pszBuf );
			break;
		}
		pszBuf = strchr( pszBuf, '\0' ) + 1;
	}
	while( pszBuf[1] != '\0' );

	return sDriver;
}

A ja szukam odpowiedzi jak dobrać się do całego arkusza:

sSql = "SELECT * "
"FROM ???????????"
"ORDER BY field_1";

żródło w VS C++ 6.0
http://www.codeguru.com/cpp/data/mfc_database/microsoftexcel/article.php/c1131/