MFC学习之 将 list 表里的信息写入.txt文本 和 .xls EXCEL 文件中(ODBC)

来源:互联网 发布:淘宝精品推荐在哪里 编辑:程序博客网 时间:2024/05/21 22:40
原文链接:http://blog.csdn.net/abidepan/article/details/8266028#comments
[cpp] view plain copy
print?
  1. 1、将 listcontrol 表中的信息 用 Cfile 函数写入 .txt 中 ,用ODBC来实现excel的写操作。  
[cpp] view plain copy
print?
  1. afx_msg void OnBnClickedButtonExport();  
  2. int32_t ExportToTXT(CString& strFilePath);  
  3. int32_t ExportToXLS(CString& strFilePath);  

在XXXDlg.cpp中

[cpp] view plain copy
print?
  1. void CLogPageDlg::OnBnClickedButtonExport()  
  2. {  
  3.     //弹出保存文件对话框,输入保存的日志文件名,并选择保存类型 txt | xls  
  4.     SYSTEMTIME st;  
  5.     GetLocalTime(&st);  
  6.   
  7.     CString str;  
  8.     str.Format(_T("%4d%02d%02d%02d%02d%02d.txt"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);  
  9.   
  10.     CFileDialog dlg(FALSE, _T("txt"), str, OFN_EXPLORER | OFN_PATHMUSTEXIST, _T("Text Files (*.txt)|*.txt|WorkSheet Files (*.xls)|*.xls||"));  
  11.     if (IDOK != dlg.DoModal())  
  12.     {  
  13.         return;  
  14.     }  
  15.   
  16.     //开始导出  
  17.     CString strPathName = dlg.GetPathName();  
  18.     CString strExt = dlg.GetFileExt();  
  19.     strExt.MakeLower();  
  20.   
  21.     int32_t ret = 0;  
  22.   
  23.     if (_T("txt") == strExt)//保存txt  
  24.     {  
  25.         ret = ExportToTXT(strPathName);  
  26.     }  
  27.     else if (_T("xls") == strExt)//保存xls  
  28.     {  
  29.         ret = ExportToXLS(strPathName);  
  30.     }  
  31.   
  32.     return;  
  33. }  
[cpp] view plain copy
print?
  1. int32_t CLogPageDlg::ExportToTXT(CString& strFilePath)  
  2. {  
  3.     USES_CONVERSION;  
  4.   
  5.     CFile mytxtFile;  
  6.     CString strCaption, strMsg;  
  7.   
  8.     if(!mytxtFile.Open(strFilePath, CFile::modeCreate | CFile::modeReadWrite))  
  9.     {  
  10.         strCaption.LoadString(IDS_MESSAGEBOX_CAPTION);  
  11.         strMsg.LoadString(IDS_OPENFILE_FAILED);  
  12.   
  13.         strMsg += strFilePath;  
  14.   
  15.         MessageBoxDLg(strMsg, strCaption, MB_OK | MB_ICONERROR, this);  
  16.   
  17.         return fail;  
  18.     }  
  19.   
  20.     //计算列的宽度  
  21.     int32_t width[5] = {0};  
  22.     int32_t i = 0, j = 0, nLen = 0;  
  23.     int32_t nCount = m_logList.GetItemCount();  
  24.   
  25.     //构造格式化字符串  
  26.     char format[512] = {0};  
  27.     char buf[1024] = {0};  
  28.   
  29.     CString str0, str1, str2, str3, str4;  
  30.   
  31.     str0.LoadString(IDS_COME);  
  32.     width[0] = strlen(T2A(str0));  
  33.   
  34.     str1.LoadString(IDS_TIME);  
  35.     width[1] = strlen(T2A(str1));  
  36.   
  37.     str2.LoadString(IDS_USERS);  
  38.     width[2] = strlen(T2A(str2));  
  39.   
  40.     str3.LoadString(IDS_CONTENT);  
  41.     width[3] = strlen(T2A(str3));  
  42.   
  43.     str4.LoadString(IDS_REMAKE);  
  44.     width[4] = strlen(T2A(str4));  
  45.   
  46.     for (i = 0; i < 5; i++)  
  47.     {  
  48.         for (j = 0; j < nCount; j++)  
  49.         {  
  50.             nLen = strlen(T2A(m_logList.GetItemText(j, i)));  
  51.             if (nLen > width[i]) width[i] = nLen;  
  52.         }  
  53.   
  54.         //多点间隔  
  55.         width[i] += 10;  
  56.     }  
  57.   
  58.     //format  
  59.     sprintf_s(format, "%%-%ds %%-%ds %%-%ds %%-%ds %%-%ds \r\n", width[0], width[1], width[2], width[3], width[4]);  
  60.   
  61.     //打印列名  
  62.     sprintf_s(buf, format, T2A(str0), T2A(str1), T2A(str2), T2A(str3), T2A(str4));  
  63.     mytxtFile.Write(buf, strlen(buf));  
  64.   
  65.     for (i = 0; i < nCount; i++)  
  66.     {  
  67.         str0 = m_logList.GetItemText(i, 0);  
  68.         str1 = m_logList.GetItemText(i, 1);  
  69.         str2 = m_logList.GetItemText(i, 2);  
  70.         str3 = m_logList.GetItemText(i, 3);  
  71.         str4 = m_logList.GetItemText(i, 4);  
  72.   
  73.         sprintf_s(buf, format, T2A(str0), T2A(str1), T2A(str2), T2A(str3), T2A(str4));  
  74.         mytxtFile.Write(buf, strlen(buf));  
  75.     }  
  76.   
  77.     mytxtFile.Close();  
  78.   
  79.     return success;  
  80. }  

[cpp] view plain copy
print?
  1. int32_t CLogPageDlg::ExportToXLS(CString& strFilePath)  
  2. {  
  3.     CDatabase database;  
  4.     CString sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)"); // Excel安装驱动  
  5.     CString sSql;  
  6.     CString strCaption, strMsg;  
  7.   
  8.     try  
  9.     {  
  10.         //检测是否安装了excel驱动程序  
  11.         if (!CheckExcelDriver())  
  12.         {  
  13.             strCaption.LoadString(IDS_MESSAGEBOX_CAPTION);  
  14.             strMsg.LoadString(IDS_EXCEL_DRIVER_FAILED);  
  15.   
  16.             MessageBoxDLg(strMsg, strCaption, MB_OK | MB_ICONERROR, this);  
  17.             return fail;  
  18.         }  
  19.   
  20.         //创建excel连接字符串  
  21.         sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),  
  22.             sDriver, strFilePath, strFilePath);  
  23.   
  24.         //打开xls文件失败,成功则创建xls数据库文件  
  25.         if(!database.OpenEx(sSql, CDatabase::noOdbcDialog))  
  26.         {  
  27.             strCaption.LoadString(IDS_MESSAGEBOX_CAPTION);  
  28.             strMsg.LoadString(IDS_OPEN_EXCEL_FAILED);  
  29.   
  30.             MessageBoxDLg(strMsg, strCaption, MB_OK | MB_ICONERROR, this);  
  31.             return fail;  
  32.         }  
  33.   
  34.         //创建表  
  35.         CString str0, str1, str2, str3, str4;  
  36.   
  37.         str0.LoadString(IDS_COME);  
  38.         str1.LoadString(IDS_TIME);  
  39.         str2.LoadString(IDS_USERS);  
  40.         str3.LoadString(IDS_CONTENT);  
  41.         str4.LoadString(IDS_REMAKE);  
  42.   
  43.         sSql.Format(_T("CREATE TABLE log (%s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT)"),   
  44.             str0, str1, str2, str3, str4);  
  45.         database.ExecuteSQL(sSql);  
  46.   
  47.         //循环导入数据  
  48.         int32_t i = 0, j = 0;  
  49.         CString str5, str6, str7, str8, str9;  
  50.         int32_t nCount = m_logList.GetItemCount();  
  51.         for (i = 0; i < nCount; i++)  
  52.         {  
  53.             str5 = m_logList.GetItemText(i, 0);  
  54.             str6 = m_logList.GetItemText(i, 1);  
  55.             str7 = m_logList.GetItemText(i, 2);  
  56.             str8 = m_logList.GetItemText(i, 3);  
  57.             str9 = m_logList.GetItemText(i, 4);  
  58.               
  59.             sSql.Format(_T("INSERT INTO log (%s, %s, %s, %s, %s) values('%s', '%s', '%s', '%s', '%s')"),   
  60.                 str0, str1, str2, str3, str4, str5, str6, str7, str8, str9);  
  61.             database.ExecuteSQL(sSql);  
  62.         }  
  63.   
  64.         //关闭xls数据库  
  65.         database.Close();  
  66.     }  
  67.     catch(...)  
  68.     {  
  69.         //提示excel操作出现异常  
  70.         strCaption.LoadString(IDS_MESSAGEBOX_CAPTION);  
  71.         strMsg.LoadString(IDS_EXCEL_OPENFILE_FAILED);  
  72.   
  73.         MessageBoxDLg(strMsg, strCaption, MB_OK | MB_ICONERROR, this);  
  74.         return fail;  
  75.     }  
  76.   
  77.     return success;  
  78. }  


 


[cpp] view plain copy
print?
  1. BOOL CLogPageDlg::CheckExcelDriver()  
  2. {  
  3.     TCHAR szBuf[2001] = {0};  
  4.     WORD cbBufMax = 2000;  
  5.     WORD cbBufOut = 0;  
  6.     TCHAR *pszBuf = szBuf;  
  7.   
  8.     //获取已安装驱动的名称  
  9.     if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))  
  10.     {  
  11.         return FALSE;  
  12.     }  
  13.   
  14.     //查找excel  
  15.     while (_tcslen(pszBuf) > 0)  
  16.     {  
  17.         if (NULL != _tcsstr(pszBuf, _T("Excel")))  
  18.         {  
  19.             return TRUE;  
  20.         }  
  21.   
  22.         pszBuf += _tcslen(pszBuf) + 1;  
  23.     }  
  24.   
  25.     return FALSE;  
  26. }  
原创粉丝点击