• 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;
    
    }
  • 相关阅读:
    React Native区分安卓/iOS平台
    yarn命令使用
    React 源码剖析系列 - 不可思议的 react diff
    dangerouslySetInnerHTMl
    iOS12下APP进入后台后再返回前台连接断开
    AttributedString-富文本字符串
    Bundle创建与使用
    UIButton-详解
    实战项目-百思不得姐-精华
    iOS 抖音个人主页布局开发(简单)
  • 原文地址:https://www.cnblogs.com/gaohai/p/7233705.html
Copyright © 2020-2023  润新知