VC list contro 将列表信息导出为excel文件 反之

    

    这里要添加一个头文件#include <afxdb.h> ,利用CDatabase类来导出excel,下面是参考代码

void demoDlg::OnBnClickedButtonOutput()
{
    // TODO: 在此添加控件通知处理程序代码
    if(m_alist.GetItemCount()<=0)
    {
        AfxMessageBox("列表中没有记录保存");
        return;
    }
    
    CFileDialog dlg(FALSE,"xls","FileList",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Excel 文件(*.xls)|*.xls||");

    dlg.m_ofn.lpstrTitle="文件列表另存为";

    if(dlg.DoModal()!=IDOK)
        return;
    CString strFilePath;
    //获取文件路径名
    strFilePath=dlg.GetPathName();
    //判断文件是否存在,存在则删除重建
    DWORD dwRe=GetFileAttributes(strFilePath);
    if(dwRe!=(DWORD)-1)
    {
        DeleteFile(strFilePath);
    }

    CDatabase  database; 
    CString sDriver="MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel驱动
    CString sSql,strInsert;
    TRY{
        //创建进行存取的字符串
        sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, strFilePath, strFilePath);

        //创建数据库
        if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
         {
           //获得列别框总列数
           int iColumnNum,iRowCount;
           LVCOLUMN lvCol;
           CString strColName; //用于保存列标题名称
           int i,j; //列、行循环参数
         
           iColumnNum = m_alist.GetHeaderCtrl()->GetItemCount();
           iRowCount = m_alist.GetItemCount();

           sSql = " CREATE TABLE DSO_DX ( ";
           strInsert = " 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_alist.GetColumn(i,&lvCol)) )
                    return;
                if ( i<iColumnNum-1 )
                {
                    sSql = sSql + lvCol.pszText + " TEXT , ";
                    strInsert = strInsert + lvCol.pszText + " , ";
                }
                else
                {
                     sSql = sSql + lvCol.pszText + " TEXT ) ";
                     strInsert = strInsert + lvCol.pszText + " )  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_alist.GetItemText(j,i,chTemp,33);

                     if ( i < (iColumnNum-1) )
                     {
                         sSql = sSql + "'" + chTemp + "' , ";
                      }
                     else
                     {
                         sSql = sSql + "'" + chTemp + "' ) ";
                     }
                }

                //将记录插入到表格中
                database.ExecuteSQL(sSql);
                sSql = strInsert;
              }
        }     

    // 关闭Excel表格文件
      database.Close();
      AfxMessageBox("保存查询结果为Excel文件成功!");

    }

     CATCH_ALL(e)
     {
      //错误类型很多,根据需要进行报错。
         AfxMessageBox("Excel文件保存失败。");
     }
    END_CATCH_ALL;
}


void demoDlg::OnBnClickedButtonInput()
{
 // TODO: Add your control notification handler code here CFileDialog dlg( TRUE, //TRUE或FALSE。TRUE为打开文件;FALSE为保存文件
      "xls", //为缺省的扩展名
      "FileList", //为显示在文件名组合框的编辑框的文件名,一般可选NULL 
      OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,//为对话框风格,一般为OFN_HIDEREADONLY   |   OFN_OVERWRITEPROMPT,即隐藏只读选项和覆盖已有文件前提示。
      "Excel 文件(*.xls)|*.xls||"//为下拉列表枢中显示文件类型
      );
     dlg.m_ofn.lpstrTitle = "导入数据";
 
     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 = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel驱动
     CString sSql,arr[3];
     sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, strFilePath, strFilePath);
     if(!db.OpenEx(sSql,CDatabase::noOdbcDialog))//连接数据源DJB.xls
     {
      MessageBox("打开EXCEL文件失败!","错误");
      return;
     }
     //打开EXCEL表
     CRecordset pset(&db);
     m_list.DeleteAllItems();
     AfxMessageBox("OK");
    /* sSql = "SELECT 学号,姓名,成绩 "       
               "FROM EXCELDEMO";      */          
              // "ORDER BY 姓名";
     sSql.Format("SELECT 学号,姓名,成绩 FROM DSO_DX");
     pset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);
     while(!pset.IsEOF())
     {
     pset.GetFieldValue("学号",arr[0]);//前面字段必须与表中的相同,否则出错。
     pset.GetFieldValue("姓名",arr[1]);
     pset.GetFieldValue("成绩",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("Excel数据成功导入系统!","导入成功");
}


你可能感兴趣的:(VC list contro 将列表信息导出为excel文件 反之)