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. }  
  • 相关阅读:
    vue实践推荐
    angularjs实现checkbox的点击-全选功能-选中数据
    是你需要的前端编码风格吗?
    webpack--前端性能优化与Gzip原理
    基于verdaccio的npm私有仓库搭建
    使用uni-app开发微信小程序
    《JavaScript设计模式与开发实践》-- 迭代器模式
    《JavaScript设计模式与开发实践》-- 发布-订阅模式
    《JavaScript设计模式与开发实践》-- 策略模式
    《JavaScript设计模式与开发实践》-- 代理模式
  • 原文地址:https://www.cnblogs.com/For-her/p/3499782.html
Copyright © 2011-2022 走看看