zoukankan      html  css  js  c++  java
  • C++之操作Excel(抄录https://www.cnblogs.com/For-her/p/3499782.html)

    MFC操作Excel

    下面的操作基于Excel2003

    一.初始化操作

    1.导入类库

    点击查看->建立类向导-> Add Class...From a type Library...-> C:Program FilesMicrosoft OfficeOfficeEXCEL.EXE,接下来就可以看到导入的类excel.h, excel.cpp。

    2.初始化COM

    找到App的InitInstance()函数,在其中添加 AfxOleInit()函数的调用,如:

    [cpp] view plaincopy
     
    1. if (!AfxOleInit())  
    2.   
    3. {  
    4.   
    5.        AfxMessageBox("注册COM出错!");  
    6.   
    7.        return FALSE;  
    8.   
    9. }  


     

    二.Excel操作类

    ExcelOperate.h

    [cpp] view plaincopy
     
    1. #include "atlbase.h"  
    2. #include "excel.h"  
    3. using namespace myexcel;  
    4. class CExcelOperate    
    5. {  
    6. private:  
    7.     myexcel::_Application m_ecApp;  
    8.     Workbooks m_ecBooks;  
    9.     _Workbook m_ecBook;  
    10.     Worksheets m_ecSheets;  
    11.     _Worksheet m_ecSheet;  
    12.     myexcel::Range m_ecRange;  
    13.     VARIANT ret;//保存单元格的值  
    14. public:  
    15.     CExcelOperate();  
    16.     virtual ~CExcelOperate();  
    17. public:  
    18.     //操作  
    19.     //**********************创建新EXCEL*******************************************  
    20.     BOOL CreateApp();  
    21.     BOOL CreateWorkbooks();                //创建一个新的EXCEL工作簿集合  
    22.         BOOL CreateWorkbook();                //创建一个新的EXCEL工作簿  
    23.     BOOL CreateWorksheets();                //创建一个新的EXCEL工作表集合  
    24.         BOOL CreateWorksheet(short index);                //创建一个新的EXCEL工作表  
    25.     BOOL CreateSheet(short index);  
    26.     BOOL Create(short index = 1);                         //创建新的EXCEL应用程序并创建一个新工作簿和工作表  
    27.         void ShowApp();                        //显示EXCEL文档  
    28.         void HideApp();                        //隐藏EXCEL文档  
    29.     //**********************打开文档*********************************************  
    30.     BOOL OpenWorkbook(CString fileName, short index = 1);  
    31.         BOOL Open(CString fileName);        //创建新的EXCEL应用程序并打开一个已经存在的文档。  
    32.     BOOL SetActiveWorkbook(short i);    //设置当前激活的文档。  
    33.   
    34.     //**********************保存文档*********************************************  
    35.         BOOL SaveWorkbook();                //Excel是以打开形式,保存。  
    36.         BOOL SaveWorkbookAs(CString fileName);//Excel以创建形式,保存。  
    37.         BOOL CloseWorkbook();  
    38.         void CloseApp();  
    39.     //**********************读信息********************************  
    40.     BOOL GetRangeAndValue(CString begin, CString end);//得到begin到end的Range并将之间的值设置到ret中  
    41.     void GetRowsAndCols(long &rows, long &cols);//得到ret的行,列数  
    42.     BOOL GetTheValue(int rows, int cols, CString &dest);//返回第rows,cols列的值,注意只返回文本类型的,到dest中  
    43.     BOOL SetTextFormat(CString &beginS, CString &endS);//将beginS到endS设置为文本格式(数字的还要用下面的方法再转一次)  
    44.     BOOL SetRowToTextFormat(CString &beginS, CString &endS);//将beginS到endS(包括数字类型)设置为文本格式  
    45.   
    46. };  

    ExcelOperate.cpp

    [cpp] view plaincopy
     
      1. CExcelOperate::CExcelOperate()  
      2. {  
      3.   
      4. }  
      5.   
      6. CExcelOperate::~CExcelOperate()  
      7. {  
      8.   
      9. }  
      10.   
      11. BOOL CExcelOperate::CreateApp()  
      12. {  
      13.     //if (FALSE == m_wdApp.CreateDispatch("Word.Application"))  
      14.     COleException pe;  
      15.     if (!m_ecApp.CreateDispatch(_T("Excel.Application"), &pe))  
      16.     {  
      17.         AfxMessageBox("Application创建失败,请确保安装了word 2000或以上版本!", MB_OK|MB_ICONWARNING);  
      18.         pe.ReportError();  
      19.         throw &pe;  
      20.         return FALSE;  
      21.     }  
      22.     return TRUE;  
      23. }  
      24.   
      25. BOOL CExcelOperate::CreateWorkbooks()               //创建一个新的EXCEL工作簿集合  
      26. {  
      27.     if (FALSE == CreateApp())   
      28.     {  
      29.         return FALSE;  
      30.     }  
      31.     m_ecBooks = m_ecApp.GetWorkbooks();  
      32.     if (!m_ecBooks.m_lpDispatch)   
      33.     {  
      34.         AfxMessageBox("WorkBooks创建失败!", MB_OK|MB_ICONWARNING);  
      35.         return FALSE;  
      36.     }  
      37.     return TRUE;  
      38. }  
      39.   
      40. BOOL CExcelOperate::CreateWorkbook()               //创建一个新的EXCEL工作簿  
      41. {  
      42.     if(!m_ecBooks.m_lpDispatch)   
      43.     {  
      44.         AfxMessageBox("WorkBooks为空!", MB_OK|MB_ICONWARNING);  
      45.         return FALSE;  
      46.     }  
      47.   
      48.     COleVariant vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
      49.   
      50.     m_ecBook = m_ecBooks.Add(vOptional);  
      51.     if(!m_ecBook.m_lpDispatch)   
      52.     {  
      53.         AfxMessageBox("WorkBook为空!", MB_OK|MB_ICONWARNING);  
      54.         return FALSE;  
      55.     }  
      56. /* 
      57.     //得到document变量 
      58.     m_wdDoc = m_wdApp.GetActiveDocument(); 
      59.     if (!m_wdDoc.m_lpDispatch)  
      60.     { 
      61.         AfxMessageBox("Document获取失败!", MB_OK|MB_ICONWARNING); 
      62.         return FALSE; 
      63.     } 
      64.     //得到selection变量 
      65.     m_wdSel = m_wdApp.GetSelection(); 
      66.     if (!m_wdSel.m_lpDispatch)  
      67.     { 
      68.         AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING); 
      69.         return FALSE; 
      70.     } 
      71.     //得到Range变量 
      72.     m_wdRange = m_wdDoc.Range(vOptional,vOptional); 
      73.     if(!m_wdRange.m_lpDispatch) 
      74.     { 
      75.         AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING); 
      76.         return FALSE; 
      77.     } 
      78. */  
      79.     return TRUE;  
      80. }  
      81.   
      82. BOOL CExcelOperate::CreateWorksheets()                //创建一个新的EXCEL工作表集合  
      83. {  
      84.     if(!m_ecBook.m_lpDispatch)   
      85.     {  
      86.         AfxMessageBox("WorkBook为空!", MB_OK|MB_ICONWARNING);  
      87.         return FALSE;  
      88.     }  
      89.     m_ecSheets = m_ecBook.GetSheets();  
      90.     if(!m_ecSheets.m_lpDispatch)   
      91.     {  
      92.         AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);  
      93.         return FALSE;  
      94.     }  
      95.     return TRUE;  
      96. }  
      97.   
      98. BOOL CExcelOperate::CreateWorksheet(short index)                //创建一个新的EXCEL工作表  
      99. {  
      100.     if(!m_ecSheets.m_lpDispatch)   
      101.     {  
      102.         AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);  
      103.         return FALSE;  
      104.     }  
      105.     m_ecSheet = m_ecSheets.GetItem(COleVariant(index));  
      106.     if(!m_ecSheet.m_lpDispatch)   
      107.     {  
      108.         AfxMessageBox("WorkSheet为空!", MB_OK|MB_ICONWARNING);  
      109.         return FALSE;  
      110.     }  
      111.     return TRUE;  
      112. }  
      113.   
      114. BOOL CExcelOperate::CreateSheet(short index)  
      115. {  
      116.     if(CreateWorksheets() == FALSE)  
      117.     {  
      118.             return FALSE;  
      119.     }  
      120.     if(CreateWorksheet(index) == FALSE)  
      121.     {  
      122.             return FALSE;  
      123.     }  
      124.     return TRUE;  
      125. }  
      126.   
      127. BOOL CExcelOperate::Create(short index)                        //创建新的EXCEL应用程序并创建一个新工作簿和工作表  
      128. {  
      129.     if(CreateWorkbooks() == FALSE)  
      130.     {  
      131.         return FALSE;  
      132.     }  
      133.     if(CreateWorkbook() == FALSE)  
      134.     {  
      135.         return FALSE;  
      136.     }  
      137.     if(CreateSheet(index) == FALSE)  
      138.     {  
      139.         return FALSE;  
      140.     }  
      141.     return TRUE;  
      142. }  
      143.   
      144. void CExcelOperate::ShowApp()                        //显示WORD文档  
      145. {  
      146.     m_ecApp.SetVisible(TRUE);  
      147. }  
      148.   
      149. void CExcelOperate::HideApp()                       //隐藏word文档  
      150. {  
      151.     m_ecApp.SetVisible(FALSE);  
      152. }  
      153.   
      154. //**********************打开文档*********************************************  
      155. BOOL CExcelOperate::OpenWorkbook(CString fileName, short index)  
      156. {  
      157.     if(!m_ecBooks.m_lpDispatch)   
      158.     {  
      159.         AfxMessageBox("WorkSheets为空!", MB_OK|MB_ICONWARNING);  
      160.         return FALSE;  
      161.     }  
      162.     //COleVariant vFileName(_T(fileName));  
      163.     COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
      164.     m_ecBook = m_ecBooks.Open(fileName,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);  
      165.     if(!m_ecBook.m_lpDispatch)   
      166.     {  
      167.         AfxMessageBox("WorkSheet获取失败!", MB_OK|MB_ICONWARNING);  
      168.         return FALSE;  
      169.     }  
      170.     if(CreateSheet(index) == FALSE)  
      171.     {  
      172.         return FALSE;  
      173.     }  
      174.     return TRUE;  
      175. }  
      176.   
      177. BOOL CExcelOperate::Open(CString fileName)        //创建新的EXCEL应用程序并打开一个已经存在的文档。  
      178. {  
      179.     if(CreateWorkbooks() == FALSE)  
      180.     {  
      181.         return FALSE;  
      182.     }  
      183.     return OpenWorkbook(fileName);  
      184. }  
      185.   
      186. /*BOOL CExcelOperate::SetActiveWorkbook(short i)    //设置当前激活的文档。  
      187. {  
      188. }*/  
      189.   
      190. //**********************保存文档*********************************************  
      191. BOOL CExcelOperate::SaveWorkbook()                //文档是以打开形式,保存。  
      192. {  
      193.     if (!m_ecBook.m_lpDispatch)   
      194.     {  
      195.         AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);  
      196.         return FALSE;  
      197.     }  
      198.     m_ecBook.Save();  
      199.     return TRUE;  
      200. }  
      201. BOOL CExcelOperate::SaveWorkbookAs(CString fileName)//文档以创建形式,保存。  
      202. {  
      203.     if (!m_ecBook.m_lpDispatch)   
      204.     {  
      205.         AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);  
      206.         return FALSE;  
      207.     }  
      208.     COleVariant vTrue((short)TRUE),      
      209.                 vFalse((short)FALSE),  
      210.                 vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
      211.     COleVariant vFileName(_T(fileName));  
      212.   
      213.     m_ecBook.SaveAs(  
      214.                 vFileName,    //VARIANT* FileName  
      215.                 vOptional,    //VARIANT* FileFormat  
      216.                 vOptional,    //VARIANT* LockComments  
      217.                 vOptional,    //VARIANT* Password  
      218.                 vOptional,    //VARIANT* AddToRecentFiles  
      219.                 vOptional,    //VARIANT* WritePassword  
      220.                 0,    //VARIANT* ReadOnlyRecommended  
      221.                 vOptional,    //VARIANT* EmbedTrueTypeFonts  
      222.                 vOptional,    //VARIANT* SaveNativePictureFormat  
      223.                 vOptional,    //VARIANT* SaveFormsData  
      224.                 vOptional,    //VARIANT* SaveAsAOCELetter  
      225.                 vOptional    //VARIANT* ReadOnlyRecommended  
      226. /*                vOptional,    //VARIANT* EmbedTrueTypeFonts  
      227.                 vOptional,    //VARIANT* SaveNativePictureFormat  
      228.                 vOptional,    //VARIANT* SaveFormsData  
      229.                 vOptional    //VARIANT* SaveAsAOCELetter*/  
      230.                 );  
      231.     return    TRUE;  
      232. }  
      233. BOOL CExcelOperate::CloseWorkbook()  
      234. {  
      235.     COleVariant vTrue((short)TRUE),      
      236.                 vFalse((short)FALSE),  
      237.                 vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
      238.       
      239.     m_ecBook.Close(vFalse,    // SaveChanges.  
      240.              vTrue,            // OriginalFormat.  
      241.              vFalse            // RouteDocument.  
      242.              );  
      243.     m_ecBook = m_ecApp.GetActiveWorkbook();  
      244.     if(!m_ecBook.m_lpDispatch)   
      245.     {  
      246.         AfxMessageBox("Book获取失败!", MB_OK|MB_ICONWARNING);  
      247.         return FALSE;  
      248.     }  
      249.     if(CreateSheet(1) == FALSE)  
      250.     {  
      251.         return FALSE;  
      252.     }  
      253.     return TRUE;  
      254. }  
      255. void CExcelOperate::CloseApp()  
      256. {  
      257.     SaveWorkbook();  
      258.     COleVariant vTrue((short)TRUE),      
      259.                 vFalse((short)FALSE),  
      260.                 vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
      261.     //m_ecDoc.Save();  
      262.     m_ecApp.Quit();  
      263.     if(m_ecRange.m_lpDispatch)  
      264.         m_ecRange.ReleaseDispatch();  
      265.     if(m_ecSheet.m_lpDispatch)  
      266.         m_ecSheet.ReleaseDispatch();  
      267.     if(m_ecSheets.m_lpDispatch)  
      268.         m_ecSheets.ReleaseDispatch();  
      269.     if(m_ecBook.m_lpDispatch)  
      270.         m_ecBook.ReleaseDispatch();  
      271.     if(m_ecBooks.m_lpDispatch)  
      272.         m_ecBooks.ReleaseDispatch();  
      273.     if(m_ecApp.m_lpDispatch)  
      274.         m_ecApp.ReleaseDispatch();  
      275.   
      276. }  
      277.   
      278. BOOL CExcelOperate::GetRangeAndValue(CString begin, CString end)  
      279. {  
      280.     if(!m_ecSheet.m_lpDispatch)  
      281.     {  
      282.         AfxMessageBox("Sheet获取失败!", MB_OK|MB_ICONWARNING);  
      283.         return FALSE;  
      284.     }  
      285.     m_ecRange = m_ecSheet.GetRange(COleVariant(begin), COleVariant(end));  
      286.     if(!m_ecRange.m_lpDispatch)  
      287.     {  
      288.         AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);  
      289.         return FALSE;  
      290.     }  
      291.     ret = m_ecRange.GetValue2();//得到表格中的值  
      292.     return TRUE;  
      293. }  
      294.   
      295. void CExcelOperate::GetRowsAndCols(long &rows, long &cols)  
      296. {  
      297.     COleSafeArray sa(ret);  
      298.     sa.GetUBound(1,&rows);  
      299.     sa.GetUBound(2,&cols);  
      300. }  
      301.   
      302. //只返回CString类型的,其他类型概视为错误  
      303. BOOL CExcelOperate::GetTheValue(int rows, int cols, CString &dest)  
      304. {  
      305.     long rRows, rCols;  
      306.     long index[2];  
      307.     VARIANT val;  
      308.     COleSafeArray sa(ret);  
      309.     sa.GetUBound(1,&rRows);  
      310.     sa.GetUBound(2,&rCols);  
      311.     if(rows < 1 || cols < 1 || rRows < rows || rCols < cols)  
      312.     {  
      313.         AfxMessageBox("出错点1");  
      314.         return FALSE;  
      315.     }  
      316.     index[0]=rows;  
      317.     index[1]=cols;    
      318.     sa.GetElement(index,&val);  
      319.     if(val.vt != VT_BSTR)  
      320.     {  
      321.         CString str;  
      322.         str.Format("出错点2, %d",val.vt);  
      323.         AfxMessageBox(str);  
      324.         return FALSE;  
      325.     }  
      326.     dest = val.bstrVal;  
      327.     return TRUE;  
      328. }  
      329.   
      330. //将beginS到endS之间设置为文本格式  
      331. BOOL CExcelOperate::SetTextFormat(CString &beginS, CString &endS)  
      332. {  
      333.     if(GetRangeAndValue(beginS, endS))  
      334.     {  
      335.         m_ecRange.Select();  
      336.         m_ecRange.SetNumberFormatLocal(COleVariant("@"));  
      337.         return TRUE;  
      338.     }  
      339.     return FALSE;  
      340. }  
      341.   
      342. //将beginS到endS之间(必须是一列)设置为真正的文本格式  
      343. BOOL CExcelOperate::SetRowToTextFormat(CString &beginS, CString &endS)  
      344. {  
      345.     if(GetRangeAndValue(beginS, endS))  
      346.     {  
      347.         m_ecRange.Select();  
      348.         Range m_tempRange = m_ecSheet.GetRange(COleVariant(beginS), COleVariant(beginS));  
      349.         if(!m_tempRange.m_lpDispatch) return FALSE;  
      350.         COleVariant vTrue((short)TRUE),      
      351.                 vFalse((short)FALSE);  
      352.         //int tempArray[2] = {1, 2};  
      353.         COleSafeArray saRet;  
      354.         DWORD numElements = {2};  
      355.         saRet.Create(VT_I4, 1, &numElements);  
      356.         long index = 0;  
      357.         int val = 1;  
      358.         saRet.PutElement(&index, &val);  
      359.         index++;  
      360.         val = 2;  
      361.         saRet.PutElement(&index, &val);  
      362.         //m_tempRange.GetItem(COleVariant((short)5),COleVariant("A"));  
      363.         m_ecRange.TextToColumns(m_tempRange.GetItem(COleVariant((short)1),COleVariant((short)1)), 1, 1, vFalse, vTrue, vFalse, vFalse, vFalse, vFalse, vFalse, saRet, vFalse, vFalse, vTrue);  
      364.         m_tempRange.ReleaseDispatch();  
      365.         return TRUE;  
      366.     }  
      367.     return FALSE;  
      368. }  
  • 相关阅读:
    nginx 附件上传不上去 client_max_body_size 设置的太小
    python 1
    NGINX 常用配置
    Linux OOM Killer 保护机制
    MacbookPro接上HDM连接显示器不能上网的解决方法
    python 逻辑运算符 () > not > and > or
    TASSL 服务端 客户端测试代码
    SSL通信双方如何判断对方采用了国密
    C/S boringSSL那点事
    从Chrome源码看浏览器的事件机制
  • 原文地址:https://www.cnblogs.com/Pond-ZZC/p/10510227.html
Copyright © 2011-2022 走看看