1. 程式人生 > >vc操作Excel儲存 和Excel的退出

vc操作Excel儲存 和Excel的退出

      最近在做個數據庫程式,因為有些資料使用者要求匯出到Excel檔案顯示(需要報給其他單位)。所以查閱了一下相關的VC的Excel程式設計操作,總結一下吧:(所有資料來源於網路)

利用VC操作Excel的方法至少有兩種

1 .利用ODBC把Excel檔案當成資料庫檔案,來進行讀、寫、修改等操作,網上有人編寫了CSpreadSheet類,提供支援。

2. 利用Automation(OLD Automation)方法。將Excel當成元件伺服器,利用VBA。又分為基於MFC的和SDK兩種。

    主要研究了一下第二種基於MFC的OLE程式設計方法。

一、Excel的物件模型

    在對Excel程式設計之前首先要了解微軟Excel 物件(Object)模型。(Parent-Child關係)

Office 應用程式物件模型

                 圖 1 Office 應用程式物件模型(Excel)From msdn

其中:

       Application:代表應用程式本身。即Excel應用程式

       Workbooks:是Workbook 的集合,代表了工作薄。

       Worksheets:是Worksheet的集合,是Workbook的子物件。

       Range:是Worksheet的子物件,可以理解為Sheet中一定範圍的單元格。

       Shapes:是Worksheet的子物件,用於儲存圖片等資訊的單元格。

二、VC操作Excel的初始化過程

 1、匯入Excel庫檔案。

      首先開啟Class Wizard,點選"Add class"按鈕下的"From a type Library"匯入 office安裝目錄下的"excel.exe"(適用於    Excel2003),然後選擇需要用的一些類,比如_Application, _Workbook, Workbooks,    Worksheets,_Wroksheet,Range,Shapes等。點選確定後,系統會在你的程式目錄下生成excel.h和excel.cpp兩個檔案,在要使用這些匯入的類時加入#include "Excel.h"即可。

     2、初始化Application。

     首先, 初始化COM元件

[cpp:nogutter] view plaincopyprint?
  1. if(!AfxOleInit())  
  2. {  
  3.    AfxMessageBox("無法初始化COM的動態連線庫");  
  4.    return FALSE;  
  5. }  

   然後,建立Excel 伺服器(啟動Excel)

   定義app的全域性或成員變數 _Application app;

[cpp:nogutter] view plaincopyprint?
  1. if (!app.CreateDispatch("Excel.Application"))  
  2. {  
  3.    AfxMessageBox("無法啟動Excel伺服器");  
  4.    return FALSE;  
  5. }  

3、設定Excel的狀態 [cpp:nogutter] view plaincopyprint?
  1. app.SetVisible(bVisble); // 使Excel可見   
  2. app.SetUserControl(bControl); // 允許其他使用者控制Excel  

三、VC對Excel的操作

       定義變數

[cpp:nogutter] view plaincopyprint?
  1. Workbooks  books;  
  2. _Workbook  book;  
  3. Worksheets  sheets;  
  4. _Worksheet  sheet;  
  5. LPDISPATCH  lpDisp;  
  6. Range   range;  
  7. COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  

  1、開啟已有的Excel檔案

[cpp:nogutter] view plaincopyprint?
  1.     books.AttachDispatch(app.GetWorkbooks());  
  2.    // 或者也可以   
  3.    // books = app.GetWorkbooks();   
  4.   lpDisp = books.Open("D:////1.xls", covOptional, covOptional,  covOptional,   covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,  
  5. covOptional, covOptional, covOptional, covOptional);  

 2.、 新建一個.xls檔案,並寫入資料

       COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

        // Get the Workbooks collection so that you can add a new workbook
            books.AttachDispatch(app.GetWorkbooks());  // 得到Workbooks
        book = books.Add(covOptional);     // 得到Workbook
 
      // Get the Worksheets collection so that you can get the IDispatch for the first Worksheet
       sheets = book.GetWorksheets();     // 得到Worksheets
       sheet = sheets.GetItem(COleVariant((short)1)); // 得到Worksheet

       // 分別向每個單元格新增資料
       // Excel2000 用函式SetValue()即可, Excel2003用函式SetValue2()
      //

      range  = sheet.GetRange(COleVariant("A1"), covOptional);  // 獲取A1 Range
      range.SetValue2( COleVariant("Date"));                               // 新增資料
 
     range = sheet.GetRange(COleVariant("B1"), covOptional);   // 獲取B1 Range
     range.SetValue2(COleVariant("Order"));                               // 新增資料

     range = sheet.GetRange(COleVariant("C1"), covOptional);   // 獲取C1 Range
     range.SetValue2(COleVariant("Amount"));                            // 新增資料

     range = sheet.GetRange(COleVariant("D1"), covOptional);   // 獲取D1 Range
     range.SetValue2(COleVariant("Tax"));                                   // 新增資料

       // 向單元格中新增公式

    range = sheet.GetRange(COleVariant("D2"), covOptional);      // 獲得D2 Range
    range = range.GetResize(COleVariant((long)NUMROWS), COleVariant((long)1)); // 重新設定D2的大小
    range.SetFormula(COleVariant("=C2*0.07"));                         // 給D2:D21設定公式

      // 設定單元格的格式

      range = sheet.GetRange(COleVariant("A1"), COleVariant("D1")); // 獲得A1:D1的Range
      oFont = range.GetFont();                                                              // 獲得Range的字型
      oFont.SetBold(COleVariant((short)TRUE));                                    // 設定是否粗體
      oFont.SetColor(COleVariant((long)RGB(255, 0, 0)));                     // 設定字型顏色

      oFont.SetName(COleVariant("黑體"));                                           // 設定字型型別

      //設定單元格尺寸根據內容自適應

      range = range.GetEntireColumn();                                                // 獲得全部的單元格
      range.AutoFit();                                                                            // 自動適合尺寸

3、 合併單元格

      // 思路:1.先獲取A1:C1的Range範圍,然後重新定義此範圍,最後合併
      //          2.直接獲得A1:C2的Range範圍,直接合並。結果和第一種方法一樣
        Range unionRange;
       unionRange = sheet.GetRange(COleVariant("A1"), COleVariant("C1")); 
       vResult = unionRange.GetMergeCells();
        unionRange = unionRange.GetResize(COleVariant((long)2), COleVariant((long)3));
        unionRange.Merge(COleVariant((long)0));      //合併單元格
        unionRange.SetRowHeight(COleVariant((short)30));   //設定單元格的高度
        unionRange.SetHorizontalAlignment(COleVariant((long)-4108));// 水平居中對齊   

4、向單元格中插入圖片(支援BMP、JPG格式,其他沒試)

    Shapes   shapes   =   sheet.GetShapes();       // 從Sheet物件上獲得一個Shapes    
    range   = sheet.GetRange(COleVariant("B16"),COleVariant("J22"));    // 獲得Range物件,用來插入圖片
        
   rgMyRge1 = range;
   shapes.AddPicture("D://Test1.jpg"   ,   false   ,   true   ,   
                                  (float)range .GetLeft().dblVal, (float)range .GetTop().dblVal,     // 從本地新增一個圖片
                                  (float)range .GetWidth().dblVal, (float)range .GetHeight().dblVal);

   ShapeRange   sRange   =   shapes.GetRange(_variant_t(long(1)));

   sRange.SetHeight(float(30));   
   sRange.SetWidth(float(30));  

5、將已建的.xls檔案另存為

    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    book.SaveAs(COleVariant("D://3.xls"),covOptional,covOptional,
                                covOptional,covOptional,covOptional,0,
                                covOptional,covOptional,covOptional,covOptional,covOptional); 

6、關閉Excel服務

    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    book.SetSaved(TRUE);     // 將Workbook的儲存狀態設定為已儲存,即不讓系統提示是否人工儲存
    range.ReleaseDispatch();    // 釋放Range物件
    sheet.ReleaseDispatch();    // 釋放Sheet物件
    sheets.ReleaseDispatch();    // 釋放Sheets物件
 
    book.ReleaseDispatch();     // 釋放Workbook物件
    books.ReleaseDispatch();    // 釋放Workbooks物件

    book.Close (covOptional, covOptional,covOptional);// 關閉Workbook物件
    books.Close();           // 關閉Workbooks物件
    
    app.Quit();          // 退出_Application
    app.ReleaseDispatch ();       // 釋放_Application

先寫這麼多吧,以後再新增!