zoukankan      html  css  js  c++  java
  • 【MFC/C++操作Excel】Excel篇

    MFC操作Excel

    下面的操作基于Excel2003

    一.初始化操作

    1.导入类库

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

    2.初始化COM

    找到AppInitInstance()函数,在其中添加 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. }  
  • 相关阅读:
    LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)
    LeetCode 80 Remove Duplicates from Sorted Array II(移除数组中出现两次以上的元素)
    LeetCode 79 Word Search(单词查找)
    LeetCode 78 Subsets (所有子集)
    LeetCode 77 Combinations(排列组合)
    LeetCode 50 Pow(x, n) (实现幂运算)
    LeetCode 49 Group Anagrams(字符串分组)
    LeetCode 48 Rotate Image(2D图像旋转问题)
    LeetCode 47 Permutations II(全排列)
    LeetCode 46 Permutations(全排列问题)
  • 原文地址:https://www.cnblogs.com/For-her/p/3499782.html
Copyright © 2011-2022 走看看