VS2008用mfc讀Excel文件


1、獲取驅動代碼:自己添加的成員函數CString CMFC_SEECOLORDlg::GetExcelDriver(void),這裏參考自:http://bbs.csdn.net/topics/340079163#new_post

CString CMFC_SEECOLORDlg::GetExcelDriver(void)
{
	wchar_t szBuf[2001];
	wchar_t excl[]=L"Excel";
	WORD cbBufMax = 2000;
	WORD cbBufOut;
	wchar_t *pszBuf = szBuf;
	CString sDriver;
	// 獲取已安裝驅動的名稱(涵數在odbcinst.h裏)
	if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
		return L"";

	// 檢索已安裝的驅動是否有Excel...     
	do
	{
		if (wcsstr(pszBuf, excl) != 0)
		{
			//發現 !
			sDriver = CString(pszBuf);
			break;
		}
		wchar_t ze={'\0'};
		pszBuf = wcschr(pszBuf,ze) + 1;
	}
	while (pszBuf[1] != '\0');
	return sDriver;

}

2、讀Excel的代碼:加一個讀Excel按鈕,添加它的響應函數void CMFC_SEECOLORDlg::OnBnClickedButtonRead(),百度得到的,嘿嘿、、

void CMFC_SEECOLORDlg::OnBnClickedButtonRead()
{		// TODO: Add your control notification handler code here
	CDatabase database;
	CString sSql;
	CString sItem1, sItem2,sItem3;
	CString sDriver;
	CString sDsn;
	CString sFile,sPath;

	//獲取主程序所在路徑,存在sPath中
	GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
	sPath.ReleaseBuffer ();
// 	MessageBox(sPath);
	int nPos;
	nPos=sPath.ReverseFind ('\\');
	sPath=sPath.Left (nPos);
	sFile = sPath + _T("\\Demo.xls");     // 將被讀取的Excel文件名
	// 檢索是否安裝有Excel驅動 "Microsoft Excel Driver (*.xls)" 
	sDriver = GetExcelDriver();
	MessageBox(sDriver);
	if (sDriver.IsEmpty())
	{
		// 沒有發現Excel驅動
		AfxMessageBox(_T("沒有安裝Excel驅動!"));
		return;
	}
	// 創建進行存取的字符串
	sDsn.Format(_T("ODBC;DRIVER={%s};DSN=' ';DBQ=%s"), sDriver, sFile);
	TRY
	{
		// 打開數據庫(既Excel文件)
		database.Open(NULL, false, false, sDsn);
		CRecordset recset(&database);
		// 設置讀取的查詢語句.

		sSql = "SELECT Num,Name, Age " //設置索引順序     
			"FROM Exceldemo " ;                
		"ORDER BY Name ";

		// 執行查詢語句
		recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
		// 獲取查詢結果
		while (!recset.IsEOF())
		{
			//讀取Excel內部數值
			recset.GetFieldValue(_T("Num"), sItem1);
			recset.GetFieldValue(_T("Name"), sItem2);
			recset.GetFieldValue(_T("Age"), sItem3);
			//顯示記取的內容
			m_ExcelList.AddString( sItem1 + _T(" --> ")+sItem2+ _T(" --> ")+sItem3 );
			// 移到下一行
			recset.MoveNext();
		}
		// 關閉數據庫
		database.Close();

	}
	CATCH(CDBException, e)
	{
		// 數據庫操作產生異常時...
		AfxMessageBox(_T("數據庫錯誤: ")+ e->m_strError);
	}
	END_CATCH;
}


3、寫Excel的代碼:加一個寫Excel按鈕,添加它的響應函數void CMFC_SEECOLORDlg::OnBnClickedButtonWrite(),也是百度了,文庫裏有下載、、

void CMFC_SEECOLORDlg::OnBnClickedButtonWrite()
{
	// TODO: Add your control notification handler code here
	// TODO: Add your control notification handler code here
	CDatabase database;
	CString sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)"); // Excel安裝驅動
	CString sExcelFile,sPath; 
	CString sSql;

	//獲取主程序所在路徑,存在sPath中
	GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
	sPath.ReleaseBuffer ();
	int nPos;
	nPos=sPath.ReverseFind ('\\');
	sPath=sPath.Left (nPos);
	sExcelFile = sPath + _T("\\Demo.xls");     // 要建立的Excel文件
	TRY
	{
		// 創建進行存取的字符串
		sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),sDriver, sExcelFile, sExcelFile);
		// 創建數據庫 (既Excel表格文件)
		if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
		{
			// 創建表結構(序號、姓名、年齡)
			sSql = "CREATE TABLE Exceldemo (Num Number,Name TEXT,Age NUMBER)";//可以用中文表示序號,姓名,年齡等
			database.ExecuteSQL(sSql);
			// 插入數值
			sSql = "INSERT INTO Exceldemo (Num,Name,Age) VALUES (1,'小西',24)";
			database.ExecuteSQL(sSql);
			sSql = "INSERT INTO Exceldemo (Num,Name,Age) VALUES (2,'小東',22)";
			database.ExecuteSQL(sSql);
			sSql = "INSERT INTO Exceldemo (Num,Name,Age) VALUES (3,'小朱',25)";
			database.ExecuteSQL(sSql);
			sSql = "INSERT INTO Exceldemo (Num,Name,Age) VALUES (4,'小鴨',27)";
			database.ExecuteSQL(sSql);
		}     
		// 關閉數據庫

		database.Close();
		AfxMessageBox(_T("Excel文件寫入成功!"));
	}
	CATCH_ALL(e)
	{
		TRACE1("Excel驅動沒有安裝: %s",sDriver);
	}
	END_CATCH_ALL;


}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章