MFC CListCtrl与Excel之间的数据导入导出

来源:互联网 发布:字符串数组转化成byte 编辑:程序博客网 时间:2024/04/28 17:02

//从Excel中导入到CListCtrl中
void CluvlistctrlDlg::OnBnClickedInput()
{
 // 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数据成功导入系统!","导入成功");


}

 

//导出数据到excel中
void CluvlistctrlDlg::OnBnClickedOutput()
{
 // TODO: Add your control notification handler code here
 //首先判断列表框中是否有记录
 if ( m_list.GetItemCount()<= 0 )
 {
  AfxMessageBox("列表中没有记录需要保存!");
  return;
 }
 //打开另存为对话框 ,需要包含 #include <Afxdlgs.h>
 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;//数据库库需要包含头文件 #include <afxdb.h>
 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);
 
  // 创建数据库 (既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 = " 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_list.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_list.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;
 
}

0 0