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; }