首页 > 技术文章 > 【MFC/C++操作Excel】Excel篇

For-her 2013-12-31 17:21 原文

MFC操作Excel

下面的操作基于Excel2003

一.初始化操作

1.导入类库

点击查看->建立类向导-> Add Class...\From a type Library...-> C:\Program Files\Microsoft Office\Office\EXCEL.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. }  

 

推荐阅读