完整Demo下載地址 基於VS2010 Office2010X64
http://download.csdn.net/detail/hi_dahaihai/9909867
AccessDatabaseEngine_X64下載地址(用於連接Excel和VS)
http://download.csdn.net/detail/hi_dahaihai/9910613
教程:
ListControl View類型選擇Report
如果用64位編譯,office2007是不可以的,要下載office2010,並且安裝AccessDatabaseEngine_X64,程序中的改動如下紅字:
CString sDriver =_T("Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)") ; // Excel驅動
void CExcelTestDlg::OnBnClickedInput() { // TODO: Add your control notification handler code here CFileDialog dlg( TRUE,//TRUE或FALSE。TRUE為打開文件;FALSE為保存文件 _T("xls"), //為缺省的擴展名 _T( "FileList"), //為顯示在文件名組合框的編輯框的文件名,一般可選NULL OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,//為對話框風格,一般為OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,即隱藏只讀選項和覆蓋已有文件前提示。 _T("Excel 文件(*.xls)|*.xls||")//為下拉列表樞中顯示文件類型 ); dlg.m_ofn.lpstrTitle = _T("導入數據"); if (dlg.DoModal() != IDOK) return; CString strFilePath; //獲得文件路徑名 strFilePath = dlg.GetPathName(); //判斷文件是否已經存在,存在則打開文件 DWORD dwRe = GetFileAttributes(strFilePath); if ( dwRe != (DWORD)-1 ) { //ShellExecute(NULL, NULL, strFilePath, NULL, NULL, SW_RESTORE); } else return; CDatabase db;//數據庫庫需要包含頭文件 #include <afxdb.h> CString sDriver =_T("MICROSOFT EXCEL DRIVER (*.XLS)") ; // Excel驅動 CString sSql,arr[3]; sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),sDriver, strFilePath, strFilePath); if(!db.OpenEx(sSql,CDatabase::noOdbcDialog))//連接數據源DJB.xls { MessageBox(_T("打開EXCEL文件失敗!","錯誤")); return; } //打開EXCEL表 CRecordset pset(&db); m_list.DeleteAllItems(); AfxMessageBox(_T("OK")); /* sSql = "SELECT 學號,姓名,成績 " "FROM EXCELDEMO"; */ // "ORDER BY 姓名"; sSql.Format(_T("SELECT * FROM [Sheet1$]")); pset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly); while(!pset.IsEOF()) { pset.GetFieldValue(_T("學號"),arr[0]);//前面字段必須與表中的相同,否則出錯。 pset.GetFieldValue(_T("姓名"),arr[1]); pset.GetFieldValue(_T("成績"),arr[2]); int count = m_list.GetItemCount();//插入到ListCtrl中 m_list.InsertItem(count,arr[0]); m_list.SetItemText(count,1,arr[1]); m_list.SetItemText(count,2,arr[2]); pset.MoveNext(); } db.Close(); MessageBox(_T("Excel數據成功導入系統!","導入成功")); } //導出數據到excel中 void CExcelTestDlg::OnBnClickedOutput() { //// TODO: Add your control notification handler code here //首先判斷列表框中是否有記錄 if ( m_list.GetItemCount()<= 0 ) { AfxMessageBox(_T("列表中沒有記錄需要保存!")); return; } //打開另存為對話框 ,需要包含 #include <Afxdlgs.h> CFileDialog dlg( FALSE, _T("xls"), _T("FileList"), OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("Excel 文件(*.xls)|*.xls||")); dlg.m_ofn.lpstrTitle =_T( "文件列表另存為"); if (dlg.DoModal() != IDOK) return; CString strFilePath; //獲得文件路徑名 strFilePath = dlg.GetPathName(); //判斷文件是否已經存在,存在則刪除重建 DWORD dwRe = GetFileAttributes(strFilePath); if ( dwRe != (DWORD)-1 ) { DeleteFile(strFilePath); } CDatabase database;//數據庫庫需要包含頭文件 #include <afxdb.h> CString sDriver =_T("MICROSOFT EXCEL DRIVER (*.XLS)";) // Excel驅動 CString sSql,strInsert; TRY { // 創建進行存取的字符串 sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),sDriver, strFilePath, strFilePath); // 創建數據庫 (既Excel表格文件) if( database.OpenEx(sSql,CDatabase::noOdbcDialog) ) { //獲得列別框總列數 int iColumnNum,iRowCount; LVCOLUMN lvCol; CString strColName; //用於保存列標題名稱 int i,j; //列、行循環參數 iColumnNum = m_list.GetHeaderCtrl()->GetItemCount(); iRowCount = m_list.GetItemCount(); sSql = _T(" CREATE TABLE DSO_DX ( "); strInsert = _T(" INSERT INTO DSO_DX ( ") ; //獲得列標題名稱 lvCol.mask = LVCF_TEXT; //必需設置,說明LVCOLUMN變量中pszText參數有效 lvCol.cchTextMax = 32; //必設,pszText參數所指向的字符串的大小 lvCol.pszText = strColName.GetBuffer(32); //必設,pszText 所指向的字符串的實際存儲位置。 //以上三個參數設置后才能通過 GetColumn()函數獲得列標題的名稱 for( i=0 ; i< iColumnNum ; i++ ) { if ( !(m_list.GetColumn(i,&lvCol)) ) return; if ( i<iColumnNum-1 ) { sSql = sSql + lvCol.pszText + _T(" TEXT , "); strInsert = strInsert + lvCol.pszText + _T(" , "); } else { sSql = sSql + lvCol.pszText + _T(" TEXT ) "); strInsert = strInsert + lvCol.pszText +_T( " ) VALUES ( "); } } //創建Excel表格文件 database.ExecuteSQL(sSql); //循環提取記錄並插入到EXCEL中 sSql = strInsert; char chTemp[33]; for ( j=0 ; j<iRowCount ; j++ ) { memset(chTemp,0,33); for ( i=0 ; i<iColumnNum ; i++ ) { m_list.GetItemText(j,i,chTemp,33); if ( i < (iColumnNum-1) ) { sSql = sSql + _T("'") + chTemp + _T("' , "); } else { sSql = sSql +_T("'") + chTemp +_T("' ) ") ; } } //將記錄插入到表格中 database.ExecuteSQL(sSql); sSql = strInsert; } } // 關閉Excel表格文件 database.Close(); AfxMessageBox(_T("保存查詢結果為Excel文件成功!")); } CATCH_ALL(e) { //錯誤類型很多,根據需要進行報錯。 AfxMessageBox(_T("Excel文件保存失敗。")); } END_CATCH_ALL; }