MFC ListControl 與 Excel 數據的導入導出


完整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;

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM