1. 程式人生 > >使用MFC操作EXCEL檔案

使用MFC操作EXCEL檔案

一、載入

1、 在VC6.0裡建立一個MFC工程

2、開啟MFCClassWizard視窗(檢視—>建立類嚮導),選擇Automation,單擊AddClass按鈕,選擇Froma type library...,彈出檔案選擇對話方塊,之後定位到C:\Program Files\MicrosoftOffice\OFFICE11\EXCEL.EXE,在生成類中新增所有的物件(其實新增需要的即可,為了簡便,不出錯保留了冗餘),如下圖。


3、返回編輯器,檢視工程檔案,可發現多了EXCEL.9HEXCEL9.CPP兩個檔案,拷貝出來,放在VS2005
需要使用excel的工程檔案中。

4. 開啟stdafx.h標頭檔案確保包含如下標頭檔案:

#include <afxdisp.h>(這個一般有了)

#include "excel.h" (手動新增這個即可)

5. 開啟TestExcel.cpp檔案,修改CTestExcelApp::InitInstance(),加入如下程式碼:

if(!AfxOleInit() ){

AfxMessageBox("初始化Ole出錯!");

return FALSE;

}

為保證編譯時不產生重複定義錯誤(可以驗證一下是否成功載入,沒有也能正常執行),我編譯時出現了很多“類重複定義”異常,開啟excel.h檔案,在檔案開始位置加入如下程式碼:

#if !defined _HEAD_FILE_EXCEL9_

#define _HEAD_FILE_EXCEL9_

相應的,在檔案末尾加入:

#endif

成功

Excel介面

匯入類

標頭檔案

說明

_Application

CApplicaton

Application.h

Excel應用程式。

Workbooks

CWorkbooks

Workbooks.h

工作簿的容器,裡面包括了

Excel應用程式開啟的所有工作簿

_Workbook

CWorkbook

Workbook.h

單個工作簿。

Worksheets

CWorksheets

Worksheets.h

單個工作簿中的Sheet表格的容器,包括該工作簿中的所有Sheet

_Worksheet

CWorksheet

Worksheet.h

單個Sheet表格。

Range

CRange

Range.h

一定數量的單元格,可對單元格進行單個或多個單元格進行操作

二、操作EXCEL檔案

1. 新建一個excel表,並填充兩個單元格的例項

  1. void CTestExcelDlg::OnButton1()  
  2. {  
  3. //Workbooks—>Workbook —>Worksheets—>Worksheet —>Range
  4. _Application app;       //Excel應用程式介面
  5. Workbooks books;        //工作薄集合
  6. _Workbook book;     //工作薄
  7. Worksheets sheets;      //工作表集合
  8. _Worksheet sheet;       //工作表
  9. Range range;            //Excel中針對單元格的操作都應先獲取其對應的Range物件
  10. Font font;  
  11. Range cols;  
  12. /* 
  13. COleVariant類為VARIANT資料型別的包裝,在自動化程式中,通常都使用 
  14. VARIANT資料型別進行引數傳遞。故下列程式中,函式引數都是通過COleVariant 
  15. 類來轉換了的。 
  16. */
  17. //covOptional 可選引數的VARIANT型別
  18. COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
  19. if( !app.CreateDispatch("Excel.Application") ){  
  20. this->MessageBox("無法建立Excel應用!");  
  21. return;  
  22. }  
  23. //獲取工作薄集合
  24. books=app.GetWorkbooks();  
  25. //新增一個工作薄
  26. book=books.Add(covOptional);  
  27. //獲取工作表集合
  28. sheets=book.GetSheets();  
  29. //獲取第一個工作表
  30. sheet=sheets.GetItem(COleVariant((short)1));  
  31. //選擇工作表中A1:A1單元格區域
  32. range=sheet.GetRange(COleVariant("A1"),COleVariant("A1"));  
  33. //設定A1=HELLO EXCEL!"
  34. range.SetValue(COleVariant("HELLO EXCEL!"));  
  35. //調整格式,設定粗體
  36. font=range.GetFont();  
  37. font.SetBold(COleVariant((short)TRUE));  
  38. //選擇A2單元格,插入一個公式"=RAND()*100000",並設定A2數字格式為貨幣形
  39. 式  
  40. range=sheet.GetRange(COleVariant("A2"),COleVariant("A2"));  
  41. range.SetFormula(COleVariant("=RAND()*100000"));  
  42. range.SetNumberFormat(COleVariant("$0.00"));  
  43. //選擇A:A列,設定寬度為自動適應
  44. cols=range.GetEntireColumn();  
  45. cols.AutoFit();  
  46. //顯示Excel表格,並設定狀態為使用者可控制
  47. app.SetVisible(TRUE);  
  48. app.SetUserControl(TRUE);  

2. 開啟一個已有的excel表格例項

  1. CString strPath;   
  2. strPath += "C:\\template.xlt"// 模板的路徑 
  3. CFileFind filefind;   
  4. if( !filefind.FindFile( strPath ) )   
  5. {   
  6. AfxMessageBox( "沒有找到模版文件,請其查詢" );   
  7.     return;  
  8. }   
  9. LPDISPATCH lpDisp;  //介面指標
  10. books=app.GetWorkbooks();  
  11. lpDisp = books.Open(m_filepath,  
  12.     covOptional, covOptional, covOptional, covOptional,  
  13.     covOptional, covOptional, covOptional, covOptional,  
  14.     covOptional, covOptional, covOptional, covOptional,  
  15.     covOptional, covOptional  
  16.     );                  //與的不同,是個引數的,直接在後面加了兩個covOptional成功了
  17. book.AttachDispatch(lpDisp);  

3. 儲存一個excel檔案例項

  1. book.SetSaved(TRUE);  

4. 另存一個excel檔案例項

  1. book.SaveAs(COleVariant(m_filename),covOptional,  
  2.     covOptional,covOptional,  
  3.     covOptional,covOptional,(long)0,  
  4. covOptional,covOptional,covOptional,  
  5. covOptional,covOptional); //與的不同,是個引數的,直接在後面加了兩個covOptional成功了

5. 釋放一個excel檔案例項

經試驗證實,不釋放第二次使用excel時會中斷,放在類的析構裡面有時呼叫不到,主動呼叫最保險。(有沒有AttachDispatch()過都要釋放,否則報錯)

  1. //釋放物件(相當重要!) 
  2. Rang.ReleaseDispatch();   
  3. sheet.ReleaseDispatch();   
  4. sheets.ReleaseDispatch();   
  5. book.ReleaseDispatch();   
  6. books.ReleaseDispatch();   
  7. //退出程式 
  8. app.Quit();  
  9. //m_ExlApp一定要釋放,否則程式結束後還會有一個Excel程序駐留在記憶體中,而且程式重複執行的時候會出錯 
  10. app.ReleaseDispatch();   

6. 修改一個excel單元格

  1. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));  
  2. range.SetValue2(COleVariant(value));  

7. 取出一個excel單元格

實現Variant資料型別轉換為CString類,這個只是一個示例,轉換較為簡單。

  1. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));  
  2. COleVariant rValue;  
  3. rValue=COleVariant(range.GetValue2());  
  4. rValue.ChangeType(VT_BSTR);  
  5. return CString(rValue.bstrVal);  

8. 還有釋放問題是最重要的問題:

   首先變數必須全釋放,無論當初是否繫結過;

   其次,程式釋放和程式關閉的順序必須是

  1. app.Quit();  
  2. app.ReleaseDispatch();  
  3. 如果順如顛倒如下:  
  4. app.ReleaseDispatch();  
  5. app.Quit();  
  6. 出現的後果是程式關閉後,excel程序仍然執行,所以無法正常開啟程式曾經開啟excel表格。  

附錄(操作類原始碼):

  1. #include "../Stdafx.h"
  2. 相關推薦

    使用MFC操作EXCEL檔案

    一、載入 1、 在VC6.0裡建立一個MFC工程 2、開啟MFCClassWizard視窗(檢視—>建立類嚮導),選擇Automation,單擊AddClass按鈕,選擇Froma type library...,彈出檔案選擇對話方塊,之後定位到C:

    POI 操作 EXCEL檔案(匯入、匯出)

    1.1概述 開發中經常會設計到excel的處理,如匯出Excel,匯入Excel到資料庫中,操作Excel目前有兩個框架,一個是apache 的poi, 另一個是 Java Excel Apache POI 簡介是用Java編寫的免費開源的跨平臺的 Java API,Ap

    php使用phpexcel類操作excel檔案資料

    php使用phpexcel類操作excel檔案資料 首先下載phpexcel git地址:https://github.com/PHPOffice/PHPExcel/releases 這裡下載了1.8.1.zip 解壓之後進入目錄,Classes目錄,複製PHPExcel.php和

    利用ADO操作Excel檔案

    今天花時間研究了一下ADO操作Excel檔案的問題,跟大家分享一下: 首先利用Excel2003建立了一個名為Demo.xls的檔案,內容如下: Name Age TY 12 TZL 15 然後開啟VC,建立一個命令列應用程式。然後如一般的ADO程式一樣編寫

    Java生成和操作Excel檔案

    JAVA EXCEL API:是一開放原始碼專案,通過它Java開發人員可以讀取Excel檔案的內容、建立新的Excel檔案、更新已經存在的Excel檔案。使用該API非Windows作業系統也可以通過純Java應用來處理Excel資料表。因為它是使用Java編寫的,所以我們在Web應用中可以通過

    Java使用Apache POI操作Excel檔案

    這裡有一篇非常細緻的文章,可供需要時候檢視 Apache POI使用詳解 1. 新建Maven專案,引入POI的依賴 <!-- apache POI for xls --&

    python操作Excel檔案之openpyxl

    安裝和配置 安裝openpyxl模組: pip install openpyxl 若想使用插入圖片的功能: pip install pillow 知識點講解 workbook 工作薄:一個Excel 檔案是一個工作薄 worksheet 工作表:一個工作薄

    xlslib操作excel檔案

    一、xlslib介紹  xlslib庫是用來建立excel檔案、libxls是用來讀取excel檔案的,在使用C++或者QT語言來設計對excel檔案的讀取。都需要事先下載這兩個庫編譯成功後再進行程式設計的。之所以選擇這兩個庫來使用,是因為這兩個庫即可以在windows系統下

    使用VC++操作Excel檔案

    本文件適用於: ·Microsoft Foundation Classes (MFC), Microsoft Visual C++, 32-bit Editions, version 6.0 以上 ·Microsoft OLE 庫  第一步:建立一

    java - 操作Excel檔案

    <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version></depend

    C# 使用NPOI操作Excel檔案

    什麼是NPOI? What’s NPOI This project is the .NET version of POI Java project at http://poi.apache.org/. POI is an open source p

    C#以OleDb的方式操作Excel檔案(三)

    二、寫Excel檔案 前面講了讀Excel檔案,後面就該寫了。 其實寫的基本過程也是類似的,設定連線字串->開啟檔案->寫檔案->關閉檔案。 開啟可寫檔案的連線字串: string strConn; strConn = @"Provider=Micro

    Python操作Excel檔案

    與Python中csv模組不同,Python中沒有處理Excel檔案的標準模組,所有需要xlrd和xlwt擴充套件包,這兩個包的具體安裝過程,請大家自行百度,我就不在這多敘述了,本文主要講的是Python對Excel檔案的幾個簡單操作,由於程式碼裡註釋比較詳細,所以本文文字會

    MFC 操作Excel 同一個工作簿中依次新增sheet頁

    1.備註:新增一個新的工作簿,其預設包含sheet12.獲取當前的sheet頁總數    long CWorksheets:: get_Count();3.獲取最後一個sheet頁    LPDISPATCH CWorksheets:: get_Item(VARIANT&am

    C#專案中操作Excel檔案——使用NPOI庫

    實際C#專案中經常會涉及到需要對本地Excel檔案進行操作,特別是一些包含資料記錄、分析、彙總功能模組的專案。常用的操作Excel檔案的方法主要有三個: 1. OleDb: 這種方式是把整個Excel檔案當做一個數據源來進行資料的讀取操作。 優點:實現方式簡單,讀取

    使用NPOI操作Excel檔案及其日期處理

    工作中經常遇到需要讀取或匯出Excel檔案的情況,而NPOI是目前最宜用、效率最高的操作的Office(不只是Excel喲)檔案的元件,使用方便,不詳細說明了。 Excel工作表約定:整個Excel表格叫做工作表:WorkBook(工作薄),包含的叫頁(工作表):She

    利用java操作Excel檔案

    {            //建立一個工作薄            WritableWorkbook workbook = Workbook.createWorkbook(new File("D:/test1.xls"));            //待插入的工作表            WritableSh

    使用python中openpyxl模組操作excel檔案,計算單元格分子式的相對分子質量(二)

    在(一)文中,在最後輸出結果時,只是將相對分子質量的值輸出,並未將對應的分子式輸出,琢磨了一天,將改進的程式碼貼出來,希望大家可以給出點優化建議! import openpyxl import re def massMr(s):#定義計算相對分子質量的函式,

    操作Excel檔案

    1.導包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version&g

    Qt QAxObject操作excel檔案過程總結

    最近由於需要Qt來操作Excel檔案,所以想把QAxObject用起來,此次使用也是機緣巧合,記錄了一下心路歷程。 此前走了很多彎路,希望做同樣事情的人就別糾纏於同樣的錯誤就好。 配製方面: 1、確保Excel軟體在本地伺服器註冊成功,沒註冊成功的可以通過 在執行中"E:\