1. 程式人生 > >【MFC/C++操作Excel】Excel篇 (OLE/COM)

【MFC/C++操作Excel】Excel篇 (OLE/COM)

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 plain copy print?
  1. if (!AfxOleInit())  
  2. {  
  3.        AfxMessageBox("註冊COM出錯!");  
  4.        return FALSE;  
  5. }  
       if (!AfxOleInit())

       {

              AfxMessageBox("註冊COM出錯!");

              return FALSE;

       }

二.我自己寫的Excel操作類

ExcelOperate.h

[cpp] view plain copy print?
  1. #include "atlbase.h"
  2. #include "excel.h"
  3. usingnamespace
     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.         BOOL SaveWorkbook();                //Excel是以開啟形式,儲存。
  35.         BOOL SaveWorkbookAs(CString fileName);//Excel以建立形式,儲存。
  36.         BOOL CloseWorkbook();  
  37.         void CloseApp();  
  38.     //**********************讀資訊********************************
  39.     BOOL GetRangeAndValue(CString begin, CString end);//得到begin到end的Range並將之間的值設定到ret中
  40.     void GetRowsAndCols(long &rows, long &cols);//得到ret的行,列數
  41.     BOOL GetTheValue(int rows, int cols, CString &dest);//返回第rows,cols列的值,注意只返回文字型別的,到dest中
  42.     BOOL SetTextFormat(CString &beginS, CString &endS);//將beginS到endS設定為文字格式(數字的還要用下面的方法再轉一次)
  43.     BOOL SetRowToTextFormat(CString &beginS, CString &endS);//將beginS到endS(包括數字型別)設定為文字格式
  44. };  
#include "atlbase.h"
#include "excel.h"
using namespace myexcel;
class CExcelOperate  
{
private:
	myexcel::_Application m_ecApp;
	Workbooks m_ecBooks;
	_Workbook m_ecBook;
	Worksheets m_ecSheets;
	_Worksheet m_ecSheet;
	myexcel::Range m_ecRange;
	VARIANT ret;//儲存單元格的值
public:
	CExcelOperate();
	virtual ~CExcelOperate();
public:
	//操作
    //**********************建立新EXCEL*******************************************
	BOOL CreateApp();
	BOOL CreateWorkbooks();                //建立一個新的EXCEL工作簿集合
    	BOOL CreateWorkbook();                //建立一個新的EXCEL工作簿
	BOOL CreateWorksheets();                //建立一個新的EXCEL工作表集合
    	BOOL CreateWorksheet(short index);                //建立一個新的EXCEL工作表
	BOOL CreateSheet(short index);
	BOOL Create(short index = 1);                         //建立新的EXCEL應用程式並建立一個新工作簿和工作表
    	void ShowApp();                        //顯示EXCEL文件
    	void HideApp();                        //隱藏EXCEL文件
	//**********************開啟文件*********************************************
	BOOL OpenWorkbook(CString fileName, short index = 1);
    	BOOL Open(CString fileName);        //建立新的EXCEL應用程式並開啟一個已經存在的文件。
   	BOOL SetActiveWorkbook(short i);    //設定當前啟用的文件。

    //**********************儲存文件*********************************************
    	BOOL SaveWorkbook();                //Excel是以開啟形式,儲存。
    	BOOL SaveWorkbookAs(CString fileName);//Excel以建立形式,儲存。
    	BOOL CloseWorkbook();
    	void CloseApp();
	//**********************讀資訊********************************
	BOOL GetRangeAndValue(CString begin, CString end);//得到begin到end的Range並將之間的值設定到ret中
	void GetRowsAndCols(long &rows, long &cols);//得到ret的行,列數
	BOOL GetTheValue(int rows, int cols, CString &dest);//返回第rows,cols列的值,注意只返回文字型別的,到dest中
	BOOL SetTextFormat(CString &beginS, CString &endS);//將beginS到endS設定為文字格式(數字的還要用下面的方法再轉一次)
	BOOL SetRowToTextFormat(CString &beginS, CString &endS);//將beginS到endS(包括數字型別)設定為文字格式

};

ExcelOperate.cpp

[cpp] view plain copy print?
  1. CExcelOperate::CExcelOperate()  
  2. {  
  3. }  
  4. CExcelOperate::~CExcelOperate()  
  5. {  
  6. }  
  7. BOOL CExcelOperate::CreateApp()  
  8. {  
  9.     //if (FALSE == m_wdApp.CreateDispatch("Word.Application"))
  10.     COleException pe;  
  11.     if (!m_ecApp.CreateDispatch(_T("Excel.Application"), &pe))  
  12.     {  
  13.         AfxMessageBox("Application建立失敗,請確保安裝了word 2000或以上版本!", MB_OK|MB_ICONWARNING);  
  14.         pe.ReportError();  
  15.         throw &pe;  
  16.         return FALSE;  
  17.     }  
  18.     return TRUE;  
  19. }  
  20. BOOL CExcelOperate::CreateWorkbooks()               //建立一個新的EXCEL工作簿集合
  21. {  
  22.     if (FALSE == CreateApp())   
  23.     {  
  24.         return FALSE;  
  25.     }  
  26.     m_ecBooks = m_ecApp.GetWorkbooks();  
  27.     if (!m_ecBooks.m_lpDispatch)   
  28.     {  
  29.         AfxMessageBox("WorkBooks建立失敗!", MB_OK|MB_ICONWARNING);  
  30.         return FALSE;  
  31.     }  
  32.     return TRUE;  
  33. }  
  34. BOOL CExcelOperate::CreateWorkbook()               //建立一個新的EXCEL工作簿
  35. {  
  36.     if(!m_ecBooks.m_lpDispatch)   
  37.     {  
  38.         AfxMessageBox("WorkBooks為空!", MB_OK|MB_ICONWARNING);  
  39.         return FALSE;  
  40.     }  
  41.     COleVariant vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
  42.     m_ecBook = m_ecBooks.Add(vOptional);  
  43.     if(!m_ecBook.m_lpDispatch)   
  44.     {  
  45.         AfxMessageBox("WorkBook為空!", MB_OK|MB_ICONWARNING);  
  46.         return FALSE;  
  47.     }  
  48. /* 
  49.     //得到document變數 
  50.     m_wdDoc = m_wdApp.GetActiveDocument(); 
  51.     if (!m_wdDoc.m_lpDispatch)  
  52.     { 
  53.         AfxMessageBox("Document獲取失敗!", MB_OK|MB_ICONWARNING); 
  54.         return FALSE; 
  55.     } 
  56.     //得到selection變數 
  57.     m_wdSel = m_wdApp.GetSelection(); 
  58.     if (!m_wdSel.m_lpDispatch)  
  59.     { 
  60.         AfxMessageBox("Select獲取失敗!", MB_OK|MB_ICONWARNING); 
  61.         return FALSE; 
  62.     } 
  63.     //得到Range變數 
  64.     m_wdRange = m_wdDoc.Range(vOptional,vOptional); 
  65.     if(!m_wdRange.m_lpDispatch) 
  66.     { 
  67.         AfxMessageBox("Range獲取失敗!", MB_OK|MB_ICONWARNING); 
  68.         return FALSE; 
  69.     } 
  70. */
  71.     return TRUE;  
  72. }  
  73. BOOL CExcelOperate::CreateWorksheets()                //建立一個新的EXCEL工作表集合
  74. {  
  75.     if(!m_ecBook.m_lpDispatch)   
  76.     {  
  77.         AfxMessageBox("WorkBook為空!", MB_OK|MB_ICONWARNING);  
  78.         return FALSE;  
  79.     }  
  80.     m_ecSheets = m_ecBook.GetSheets();  
  81.     if(!m_ecSheets.m_lpDispatch)   
  82.     {  
  83.         AfxMessageBox("WorkSheets為空!", MB_OK|MB_ICONWARNING);  
  84.         return FALSE;  
  85.     }  
  86.     return TRUE;  
  87. }  
  88. BOOL CExcelOperate::CreateWorksheet(short index)                //建立一個新的EXCEL工作表
  89. {  
  90.     if(!m_ecSheets.m_lpDispatch)   
  91.     {  
  92.         AfxMessageBox("WorkSheets為空!", MB_OK|MB_ICONWARNING);  
  93.         return FALSE;  
  94.     }  
  95.     m_ecSheet = m_ecSheets.GetItem(COleVariant(index));  
  96.     if(!m_ecSheet.m_lpDispatch)   
  97.     {  
  98.         AfxMessageBox("WorkSheet為空!", MB_OK|MB_ICONWARNING);  
  99.         return FALSE;  
  100.     }  
  101.     return TRUE;  
  102. }  
  103. BOOL CExcelOperate::CreateSheet(short index)  
  104. {  
  105.     if(CreateWorksheets() == FALSE)  
  106.     {  
  107.             return FALSE;  
  108.     }  
  109.     if(CreateWorksheet(index) == FALSE)  
  110.     {  
  111.             return FALSE;  
  112.     }  
  113.     return TRUE;  
  114. }  
  115. BOOL CExcelOperate::Create(short index)                        //建立新的EXCEL應用程式並建立一個新工作簿和工作表
  116. {  
  117.     if(CreateWorkbooks() == FALSE)  
  118.     {  
  119.         return FALSE;  
  120.     }  
  121.     if(CreateWorkbook() == FALSE)  
  122.     {  
  123.         return FALSE;  
  124.     }  
  125.     if(CreateSheet(index) == FALSE)  
  126.     {  
  127.         return FALSE;  
  128.     }  
  129.     return TRUE;  
  130. }  
  131. void CExcelOperate::ShowApp()                        //顯示WORD文件
  132. {  
  133.     m_ecApp.SetVisible(TRUE);  
  134. }  
  135. void CExcelOperate::HideApp()                       //隱藏word文件
  136. {  
  137.     m_ecApp.SetVisible(FALSE);  
  138. }  
  139. //**********************開啟文件*********************************************
  140. BOOL CExcelOperate::OpenWorkbook(CString fileName, short index)  
  141. {  
  142.     if(!m_ecBooks.m_lpDispatch)   
  143.     {  
  144.         AfxMessageBox("WorkSheets為空!", MB_OK|MB_ICONWARNING);  
  145.         return FALSE;  
  146.     }  
  147.     //COleVariant vFileName(_T(fileName));
  148.     COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
  149.     m_ecBook = m_ecBooks.Open(fileName,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);  
  150.     if(!m_ecBook.m_lpDispatch)   
  151.     {  
  152.         AfxMessageBox("WorkSheet獲取失敗!", MB_OK|MB_ICONWARNING);  
  153.         return FALSE;  
  154.     }  
  155.     if(CreateSheet(index) == FALSE)  
  156.     {  
  157.         return FALSE;  
  158.     }  
  159.     return TRUE;  
  160. }  
  161. BOOL CExcelOperate::Open(CString fileName)        //建立新的EXCEL應用程式並開啟一個已經存在的文件。
  162. {  
  163.     if(CreateWorkbooks() == FALSE)  
  164.     {  
  165.         return FALSE;  
  166.     }  
  167.     return OpenWorkbook(fileName);  
  168. }  
  169. /*BOOL CExcelOperate::SetActiveWorkbook(short i)    //設定當前啟用的文件。
  170. {  
  171. }*/  
  172. //**********************儲存文件*********************************************
  173. BOOL CExcelOperate::SaveWorkbook()                //文件是以開啟形式,儲存。
  174. {  
  175.     if (!m_ecBook.m_lpDispatch)   
  176.     {  
  177.         AfxMessageBox("Book獲取失敗!", MB_OK|MB_ICONWARNING);  
  178.         return FALSE;  
  179.     }  
  180.     m_ecBook.Save();  
  181.     return TRUE;  
  182. }  
  183. BOOL CExcelOperate::SaveWorkbookAs(CString fileName)//文件以建立形式,儲存。
  184. {  
  185.     if (!m_ecBook.m_lpDispatch)   
  186.     {  
  187.         AfxMessageBox("Book獲取失敗!", MB_OK|MB_ICONWARNING);  
  188.         return FALSE;  
  189.     }  
  190.     COleVariant vTrue((short)TRUE),      
  191.                 vFalse((short)FALSE),  
  192.                 vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
  193.     COleVariant vFileName(_T(fileName));  
  194.     m_ecBook.SaveAs(  
  195.                 vFileName,    //VARIANT* FileName
  196.                 vOptional,    //VARIANT* FileFormat
  197.                 vOptional,    //VARIANT* LockComments
  198.                 vOptional,    //VARIANT* Password
  199.                 vOptional,    //VARIANT* AddToRecentFiles
  200.                 vOptional,    //VARIANT* WritePassword
  201.                 0,    //VARIANT* ReadOnlyRecommended
  202.                 vOptional,    //VARIANT* EmbedTrueTypeFonts
  203.                 vOptional,    //VARIANT* SaveNativePictureFormat
  204.                 vOptional,    //VARIANT* SaveFormsData
  205.                 vOptional,    //VARIANT* SaveAsAOCELetter
  206.                 vOptional    //VARIANT* ReadOnlyRecommended
  207. /*                vOptional,    //VARIANT* EmbedTrueTypeFonts
  208.                 vOptional,    //VARIANT* SaveNativePictureFormat
  209.                 vOptional,    //VARIANT* SaveFormsData
  210.                 vOptional    //VARIANT* SaveAsAOCELetter*/
  211.                 );  
  212.     return    TRUE;  
  213. }  
  214. BOOL CExcelOperate::CloseWorkbook()  
  215. {  
  216.     COleVariant vTrue((short)TRUE),      
  217.                 vFalse((short)FALSE),  
  218.                 vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
  219.     m_ecBook.Close(vFalse,    // SaveChanges.
  220.              vTrue,            // OriginalFormat.
  221.              vFalse            // RouteDocument.
  222.              );  
  223.     m_ecBook = m_ecApp.GetActiveWorkbook();  
  224.     if(!m_ecBook.m_lpDispatch)   
  225.     {  
  226.         AfxMessageBox("Book獲取失敗!", MB_OK|MB_ICONWARNING);  
  227.         return FALSE;  
  228.     }  
  229.     if(CreateSheet(1) == FALSE)  
  230.     {  
  231.         return FALSE;  
  232.     }  
  233.     return TRUE;  
  234. }  
  235. void CExcelOperate::CloseApp()  
  236. {  
  237.     SaveWorkbook();  
  238.     COleVariant vTrue((short)TRUE),      
  239.                 vFalse((short)FALSE),  
  240.                 vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
  241.     //m_ecDoc.Save();
  242.     m_ecApp.Quit();  
  243.     if(m_ecRange.m_lpDispatch)  
  244.         m_ecRange.ReleaseDispatch();  
  245.     if(m_ecSheet.m_lpDispatch)  
  246.         m_ecSheet.ReleaseDispatch();  
  247.     if(m_ecSheets.m_lpDispatch)  
  248.         m_ecSheets.ReleaseDispatch();  
  249.     if(m_ecBook.m_lpDispatch)  
  250.         m_ecBook.ReleaseDispatch();  
  251.     if(m_ecBooks.m_lpDispatch)  
  252.         m_ecBooks.ReleaseDispatch();  
  253.     if(m_ecApp.m_lpDispatch)  
  254.         m_ecApp.ReleaseDispatch();  
  255. }  
  256. BOOL CExcelOperate::GetRangeAndValue(CString begin, CString end)  
  257. {  
  258.     if(!m_ecSheet.m_lpDispatch)  
  259.     {  
  260.         AfxMessageBox("Sheet獲取失敗!", MB_OK|MB_ICONWARNING);  
  261.         return FALSE;  
  262.     }  
  263.     m_ecRange = m_ecSheet.GetRange(COleVariant(begin), COleVariant(end));  
  264.     if(!m_ecRange.m_lpDispatch)  
  265.     {  
  266.         AfxMessageBox("Range獲取失敗!", MB_OK|MB_ICONWARNING);  
  267.         return FALSE;  
  268.     }  
  269.     ret = m_ecRange.GetValue2();//得到表格中的值
  270.     return TRUE;  
  271. }  
  272. void CExcelOperate::GetRowsAndCols(long &rows, long &cols)  
  273. {  
  274.     COleSafeArray sa(ret);  
  275.     sa.GetUBound(1,&rows);  
  276.     sa.GetUBound(2,&cols);  
  277. }  
  278. //只返回CString型別的,其他型別概視為錯誤
  279. BOOL CExcelOperate::GetTheValue(int rows, int cols, CString &dest)  
  280. {  
  281.     long rRows, rCols;  
  282.     long index[2];  
  283.     VARIANT val;  
  284.     COleSafeArray sa(ret);  
  285.     sa.GetUBound(1,&rRows);  
  286.     sa.GetUBound(2,&rCols);  
  287.     if(rows < 1 || cols < 1 || rRows < rows || rCols < cols)  
  288.     {  
  289.         AfxMessageBox("出錯點1");  
  290.         return FALSE;  
  291.     }  
  292.     index[0]=rows;  
  293.     index[1]=cols;    
  294.     sa.GetElement(index,&val);  
  295.     if(val.vt != VT_BSTR)  
  296.     {  
  297.         CString str;  
  298.         str.Format("出錯點2, %d",val.vt);  
  299.         AfxMessageBox(str);  
  300.         return FALSE;  
  301.     }  
  302.     dest = val.bstrVal;  
  303.     return TRUE;  
  304. }  
  305. //將beginS到endS之間設定為文字格式
  306. BOOL CExcelOperate::SetTextFormat(CString &beginS, CString &endS)  
  307. {  
  308.     if(GetRangeAndValue(beginS, endS))  
  309.     {  
  310.         m_ecRange.Select();  
  311.         m_ecRange.SetNumberFormatLocal(COleVariant("@"));  
  312.         return TRUE;  
  313.     }  
  314.     return FALSE;  
  315. }  
  316. //將beginS到endS之間(必須是一列)設定為真正的文字格式
  317. BOOL CExcelOperate::SetRowToTextFormat(CString &beginS, CString &endS)  
  318. {  
  319.     if(GetRangeAndValue(beginS, endS))  
  320.     {  
  321.         m_ecRange.Select();  
  322.         Range m_tempRange = m_ecSheet.GetRange(COleVariant(beginS), COleVariant(beginS));  
  323.         if(!m_tempRange.m_lpDispatch) return FALSE;  
  324.         COleVariant vTrue((short)TRUE),      
  325.                 vFalse((short)FALSE);  
  326.         //int tempArray[2] = {1, 2};
  327.         COleSafeArray saRet;  
  328.         DWORD numElements = {2};  
  329.         saRet.Create(VT_I4, 1, &numElements);  
  330.         long index = 0;  
  331.         int val = 1;  
  332.         saRet.PutElement(&index, &val);  
  333.         index++;  
  334.         val = 2;  
  335.         saRet.PutElement(&index, &val);  
  336.         //m_tempRange.GetItem(COleVariant((short)5),COleVariant("A"));
  337.         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);  
  338.         m_tempRange.ReleaseDispatch();  
  339.         return TRUE;  
  340.     }  
  341.     return FALSE;  
  342. }  
CExcelOperate::CExcelOperate()
{

}

CExcelOperate::~CExcelOperate()
{

}

BOOL CExcelOperate::CreateApp()
{
    //if (FALSE == m_wdApp.CreateDispatch("Word.Application"))
	COleException pe;
	if (!m_ecApp.CreateDispatch(_T("Excel.Application"), &pe))
    {
        AfxMessageBox("Application建立失敗,請確保安裝了word 2000或以上版本!", MB_OK|MB_ICONWARNING);
		pe.ReportError();
		throw &pe;
        return FALSE;
    }
    return TRUE;
}

BOOL CExcelOperate::CreateWorkbooks()               //建立一個新的EXCEL工作簿集合
{
	if (FALSE == CreateApp()) 
    {
        return FALSE;
    }
    m_ecBooks = m_ecApp.GetWorkbooks();
    if (!m_ecBooks.m_lpDispatch) 
    {
        AfxMessageBox("WorkBooks建立失敗!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    return TRUE;
}

BOOL CExcelOperate::CreateWorkbook()               //建立一個新的EXCEL工作簿
{
	if(!m_ecBooks.m_lpDispatch) 
    {
        AfxMessageBox("WorkBooks為空!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }

    COleVariant vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    m_ecBook = m_ecBooks.Add(vOptional);
	if(!m_ecBook.m_lpDispatch) 
    {
        AfxMessageBox("WorkBook為空!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
/*
    //得到document變數
    m_wdDoc = m_wdApp.GetActiveDocument();
    if (!m_wdDoc.m_lpDispatch) 
    {
        AfxMessageBox("Document獲取失敗!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    //得到selection變數
    m_wdSel = m_wdApp.GetSelection();
    if (!m_wdSel.m_lpDispatch) 
    {
        AfxMessageBox("Select獲取失敗!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    //得到Range變數
    m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    if(!m_wdRange.m_lpDispatch)
    {
        AfxMessageBox("Range獲取失敗!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
*/
    return TRUE;
}

BOOL CExcelOperate::CreateWorksheets()                //建立一個新的EXCEL工作表集合
{
	if(!m_ecBook.m_lpDispatch) 
    {
        AfxMessageBox("WorkBook為空!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
	m_ecSheets = m_ecBook.GetSheets();
	if(!m_ecSheets.m_lpDispatch) 
    {
        AfxMessageBox("WorkSheets為空!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
	return TRUE;
}

BOOL CExcelOperate::CreateWorksheet(short index)                //建立一個新的EXCEL工作表
{
	if(!m_ecSheets.m_lpDispatch) 
    {
        AfxMessageBox("WorkSheets為空!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
	m_ecSheet = m_ecSheets.GetItem(COleVariant(index));
	if(!m_ecSheet.m_lpDispatch) 
    {
        AfxMessageBox("WorkSheet為空!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
	return TRUE;
}

BOOL CExcelOperate::CreateSheet(short index)
{
	if(CreateWorksheets() == FALSE)
	{
			return FALSE;
	}
	if(CreateWorksheet(index) == FALSE)
	{
			return FALSE;
	}
	return TRUE;
}

BOOL CExcelOperate::Create(short index)                        //建立新的EXCEL應用程式並建立一個新工作簿和工作表
{
	if(CreateWorkbooks() == FALSE)
	{
		return FALSE;
	}
	if(CreateWorkbook() == FALSE)
	{
		return FALSE;
	}
	if(CreateSheet(index) == FALSE)
	{
		return FALSE;
	}
	return TRUE;
}

void CExcelOperate::ShowApp()                        //顯示WORD文件
{
	m_ecApp.SetVisible(TRUE);
}

void CExcelOperate::HideApp()                       //隱藏word文件
{
	m_ecApp.SetVisible(FALSE);
}

//**********************開啟文件*********************************************
BOOL CExcelOperate::OpenWorkbook(CString fileName, short index)
{
	if(!m_ecBooks.m_lpDispatch) 
    {
        AfxMessageBox("WorkSheets為空!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
	//COleVariant vFileName(_T(fileName));
	COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	m_ecBook = m_ecBooks.Open(fileName,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional,VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);
	if(!m_ecBook.m_lpDispatch) 
    {
        AfxMessageBox("WorkSheet獲取失敗!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
	if(CreateSheet(index) == FALSE)
	{
		return FALSE;
	}
	return TRUE;
}

BOOL CExcelOperate::Open(CString fileName)        //建立新的EXCEL應用程式並開啟一個已經存在的文件。
{
	if(CreateWorkbooks() == FALSE)
	{
		return FALSE;
	}
	return OpenWorkbook(fileName);
}

/*BOOL CExcelOperate::SetActiveWorkbook(short i)    //設定當前啟用的文件。
{
}*/

//**********************儲存文件*********************************************
BOOL CExcelOperate::SaveWorkbook()                //文件是以開啟形式,儲存。
{
	if (!m_ecBook.m_lpDispatch) 
    {
        AfxMessageBox("Book獲取失敗!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
	m_ecBook.Save();
	return TRUE;
}
BOOL CExcelOperate::SaveWorkbookAs(CString fileName)//文件以建立形式,儲存。
{
	if (!m_ecBook.m_lpDispatch) 
    {
        AfxMessageBox("Book獲取失敗!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
    COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    COleVariant vFileName(_T(fileName));

    m_ecBook.SaveAs(
                vFileName,    //VARIANT* FileName
                vOptional,    //VARIANT* FileFormat
                vOptional,    //VARIANT* LockComments
                vOptional,    //VARIANT* Password
                vOptional,    //VARIANT* AddToRecentFiles
                vOptional,    //VARIANT* WritePassword
                0,    //VARIANT* ReadOnlyRecommended
                vOptional,    //VARIANT* EmbedTrueTypeFonts
                vOptional,    //VARIANT* SaveNativePictureFormat
                vOptional,    //VARIANT* SaveFormsData
                vOptional,    //VARIANT* SaveAsAOCELetter
				vOptional    //VARIANT* ReadOnlyRecommended
/*                vOptional,    //VARIANT* EmbedTrueTypeFonts
                vOptional,    //VARIANT* SaveNativePictureFormat
                vOptional,    //VARIANT* SaveFormsData
                vOptional    //VARIANT* SaveAsAOCELetter*/
                );
    return    TRUE;
}
BOOL CExcelOperate::CloseWorkbook()
{
	COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	
    m_ecBook.Close(vFalse,    // SaveChanges.
             vTrue,            // OriginalFormat.
             vFalse            // RouteDocument.
             );
	m_ecBook = m_ecApp.GetActiveWorkbook();
	if(!m_ecBook.m_lpDispatch) 
    {
        AfxMessageBox("Book獲取失敗!", MB_OK|MB_ICONWARNING);
        return FALSE;
    }
	if(CreateSheet(1) == FALSE)
	{
		return FALSE;
	}
	return TRUE;
}
void CExcelOperate::CloseApp()
{
	SaveWorkbook();
	COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE),
                vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    //m_ecDoc.Save();
    m_ecApp.Quit();
	if(m_ecRange.m_lpDispatch)
		m_ecRange.ReleaseDispatch();
	if(m_ecSheet.m_lpDispatch)
		m_ecSheet.ReleaseDispatch();
	if(m_ecSheets.m_lpDispatch)
		m_ecSheets.ReleaseDispatch();
	if(m_ecBook.m_lpDispatch)
		m_ecBook.ReleaseDispatch();
	if(m_ecBooks.m_lpDispatch)
		m_ecBooks.ReleaseDispatch();
	if(m_ecApp.m_lpDispatch)
		m_ecApp.ReleaseDispatch();

}

BOOL CExcelOperate::GetRangeAndValue(CString begin, CString end)
{
	if(!m_ecSheet.m_lpDispatch)
	{
		AfxMessageBox("Sheet獲取失敗!", MB_OK|MB_ICONWARNING);
		return FALSE;
	}
	m_ecRange = m_ecSheet.GetRange(COleVariant(begin), COleVariant(end));
	if(!m_ecRange.m_lpDispatch)
	{
		AfxMessageBox("Range獲取失敗!", MB_OK|MB_ICONWARNING);
		return FALSE;
	}
	ret = m_ecRange.GetValue2();//得到表格中的值
	return TRUE;
}

void CExcelOperate::GetRowsAndCols(long &rows, long &cols)
{
	COleSafeArray sa(ret);
	sa.GetUBound(1,&rows);
	sa.GetUBound(2,&cols);
}

//只返回CString型別的,其他型別概視為錯誤
BOOL CExcelOperate::GetTheValue(int rows, int cols, CString &dest)
{
	long rRows, rCols;
	long index[2];
	VARIANT val;
	COleSafeArray sa(ret);
	sa.GetUBound(1,&rRows);
	sa.GetUBound(2,&rCols);
	if(rows < 1 || cols < 1 || rRows < rows || rCols < cols)
	{
		AfxMessageBox("出錯點1");
		return FALSE;
	}
	index[0]=rows;
	index[1]=cols;	
	sa.GetElement(index,&val);
	if(val.vt != VT_BSTR)
	{
		CString str;
		str.Format("出錯點2, %d",val.vt);
		AfxMessageBox(str);
		return FALSE;
	}
	dest = val.bstrVal;
	return TRUE;
}

//將beginS到endS之間設定為文字格式
BOOL CExcelOperate::SetTextFormat(CString &beginS, CString &endS)
{
	if(GetRangeAndValue(beginS, endS))
	{
		m_ecRange.Select();
		m_ecRange.SetNumberFormatLocal(COleVariant("@"));
		return TRUE;
	}
	return FALSE;
}

//將beginS到endS之間(必須是一列)設定為真正的文字格式
BOOL CExcelOperate::SetRowToTextFormat(CString &beginS, CString &endS)
{
	if(GetRangeAndValue(beginS, endS))
	{
		m_ecRange.Select();
		Range m_tempRange = m_ecSheet.GetRange(COleVariant(beginS), COleVariant(beginS));
		if(!m_tempRange.m_lpDispatch) return FALSE;
		COleVariant vTrue((short)TRUE),    
                vFalse((short)FALSE);
		//int tempArray[2] = {1, 2};
		COleSafeArray saRet;
		DWORD numElements = {2};
		saRet.Create(VT_I4, 1, &numElements);
		long index = 0;
		int val = 1;
		saRet.PutElement(&index, &val);
		index++;
		val = 2;
		saRet.PutElement(&index, &val);
		//m_tempRange.GetItem(COleVariant((short)5),COleVariant("A"));
		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);
		m_tempRange.ReleaseDispatch();
		return TRUE;
	}
	return FALSE;
}