vc 操作excel說明文檔


BasicExcel說明文檔

BasicExcel原始鏈接:

http://www.codeproject.com/Articles/13852/BasicExcel-A-Class-to-Read-and-Write-to-Microsoft

一個有用的連接:

http://www.360doc.com/content/12/0426/16/7023119_206710295.shtml

為防止此鏈接文章丟失,文章摘錄如下:

vc訪問excel的兩篇文章(主要介紹OLE方式)

文章一、Excel操作類-CSpreadSheet and BasicExcel

CSpreadSheet - A Class to Read and Write to Excel and Text Delimited Spreadsheet,使用ODBC操作Excel

http://www.codeproject.com/KB/database/cspreadsheet.aspx

BasicExcel - A Class to Read and Write to Microsoft Excel,直接從Excel文件格式出發,操作Excel

http://www.codeproject.com/KB/office/BasicExcel.aspx#

轉載:

由於工作需要,需要在excel和mysql數據庫之間互相交換數據,於是在網上搜索了一下用vc如何操作excel,基本上有三種實現方式,一種是利用odbc,一種是使用微軟的automation技術,一種就是直接分析excel的格式並進行解析。

在codeproject上找到兩個開源的操作類,一個是basicexcel,地址為:http://www.codeproject.com/KB/office/BasicExcel.aspx

一個是CSpreadSheet,地址為:http://www.codeproject.com/KB/database/cspreadsheet.aspx

兩個我都使用了一下,最后決定使用basicexcel,下面說說我的感受:

1 CSpreadSheet,采用odbc實現,速度慢,bug多,但是對中文支持比較好,但是有個讓我最不能忍受的確定,就是它把所有的數據寫入excel中時都當作字符串來實現,這樣導致在excel的每個field中的內容前都自動添加一個單引號,原因是excel為了防止自動格式轉換,添加一個單引號使得每個數據項都強制轉換成字符串類型。最后怎么都去不掉,只好放棄使用。

2 basicexcel,采用com方式實現,訪問速度快,api接口也比較簡單,可以隨意設置excel中field內容的類型,但是對於中文的支持不好,要自己處理漢字編碼,支持ansi字符和unicode字符。剛開始的時候寫入的漢字都是亂碼,后來自己做了字符轉換,吧gb2312編碼的漢字轉變成unicode編碼,就可以正常顯示了

這兩個類在官方網頁上都有api使用說明和示例工程,大家一起交流...

由於剛剛使用,感受暫時就這么多了,感覺微軟的東西還真是麻煩...

文章二、VC操作Excel文件編程相關內容總結

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/handsing/archive/2010/04/08/5461070.aspx

最近在做個數據庫程序,因為有些數據用戶要求導出到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關系)

圖 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組件

view plaincopy to clipboardprint? 
if(!AfxOleInit())    
{    
   AfxMessageBox("無法初始化COM的動態連接庫");    
   return FALSE;    
}   
if(!AfxOleInit()) 

   AfxMessageBox("無法初始化COM的動態連接庫"); 
   return FALSE; 
}

然后,創建Excel 服務器(啟動Excel)

定義app的全局或成員變量 _Application app;

view plaincopy to clipboardprint? 
if (!app.CreateDispatch("Excel.Application"))    
{    
   AfxMessageBox("無法啟動Excel服務器");    
   return FALSE;    
}   
if (!app.CreateDispatch("Excel.Application")) 

   AfxMessageBox("無法啟動Excel服務器"); 
   return FALSE; 

3、設置Excel的狀態

view plaincopy to clipboardprint? 
app.SetVisible(bVisble); // 使Excel可見 
app.SetUserControl(bControl); // 允許其他用戶控制Excel   
app.SetVisible(bVisble); // 使Excel可見 
app.SetUserControl(bControl); // 允許其他用戶控制Excel

三、VC對Excel的操作

定義變量

     view plaincopy to clipboardprint? 
Workbooks  books;    
_Workbook  book;    
Worksheets  sheets;    
_Worksheet  sheet;    
LPDISPATCH  lpDisp;    
Range   range;    
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);   
      Workbooks  books; 
      _Workbook  book; 
      Worksheets  sheets; 
      _Worksheet  sheet; 
      LPDISPATCH  lpDisp; 
      Range   range; 
      COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

  1、打開已有的Excel文件

            view plaincopy to clipboardprint? 
    books.AttachDispatch(app.GetWorkbooks());    
   // 或者也可以 
   // books = app.GetWorkbooks();    
  lpDisp = books.Open("D:////1.xls", covOptional, covOptional,  covOptional,   covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,    
covOptional, covOptional, covOptional, covOptional);   
      books.AttachDispatch(app.GetWorkbooks()); 
     // 或者也可以 
     // books = app.GetWorkbooks(); 
    lpDisp = books.Open("D:////1.xls", covOptional, covOptional,  covOptional,   covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, 
  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

下面是自己心得:

1、 BasicExcel_src (1).zip是此開源工具對應的源文件。

2、 BasicExcel_demo (1).zip和ExcelTest分別是作者和我做測試的兩個demo。

3、 BasicExcelChinese.rar是為了解決中文路徑問題對應的修改之后的源文件(作者提供的原始文件不能解決中文路徑問題,在其中設定了中文環境之后,即BasicExcelChinese,則可以解決中文路徑文件的讀寫)。當系統中可能會出現中文路徑時,可以使用此源文件,但是此源文件依然不能解決excel讀寫中文內容的問題。

4、 但是ConvertACPToUtf8.txt中的函數ConvertACPToUtf8()將GB2312轉換為Unicode,可以解決讀寫中文內容問題。

5、 經測試,發現兩個函數clip_image002[1]方法Save()似乎有bug不穩定,簡單的讀寫保存可以,復雜時出現錯誤。而SaveAs()可以。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM