MFC -- Excel操作簡介(基於VS2010)


 一、添加與 Excel 操作相關的頭文件

  項目 -> 類向導,在右上方有一個下拉欄,選擇其中的 類型庫中的MFC類(T),即可看到下圖所示界面,選擇“文件”選項,然后在下方的位置選項中添加本地文件,本人電腦中的EXCEL是安裝在 C 盤的,故文件目錄為:C:\Program Files\Microsoft Office\Office14\EXCEL.EXE。

  添加了 EXCEL.EXE 后,可以看到一系列接口,選擇其中的: _Application、_Workbook、_Worksheet、Workbooks、Worksheets、Font、Range 並添加,然后在主程序中添加其頭文件:

#include "CApplication.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
#include "CRange.h"
#include "CFont0.h"

   逐次打開上述頭文件,並將其中的 “ #import "C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE" no_namespace ” 這句話給屏蔽掉,不然會報錯,無法編譯成功。這樣之后,編譯還是不能通過,會出現以下報錯:

  點擊 warning 來到報錯處,在 DialogBox() 前面加上下划線 "_",即 "_DialogBox()" 即可。

 

二、創建並保存一個 Excel

  直接上代碼先:

void CExcel_ExampleDlg::SaveDataToExcel()
{
    CString cellNum;

    CApplication m_ExcelApp;            // Excel 應用程序接口
    CWorkbook m_ExcelBook;             // 工作簿
    CWorkbooks m_ExcelBooks;           // 工作簿集合
    CWorksheet m_ExcelSheet;            // 工作表
    CWorksheets m_ExcelSheets;         // 工作表集合
    CRange m_ExcelRange;                // 用於對單元格進行操作
    CRange m_ExcelCols;
    CFont0 m_ExcelFont;                    // 用於字體操作

    // 獲取系統時間並保存為 CString 類型
    CString timeStr;                       // 獲取系統時間
    SYSTEMTIME sysTime;
    GetLocalTime(&sysTime);

    CString m_saveFilePath;                // 保存路徑
    timeStr.Format(L"_%4d.%2d.%2d_%2d.%2d",sysTime.wYear , sysTime.wMonth , sysTime.wDay , sysTime.wHour , sysTime.wMinute);
    m_saveFilePath =  _T("E:\\Workplace\\ExcelExample") + timeStr + _T(".xlsx"); 
  
    CString str;
    for(int i = 0;i <20;i++)
    {
        str.Format(L"%d",i);
        ValueArray1.Add(str);

        str.Format(L"%d",2 * i);
        ValueArray2.Add(str);

        str.Format(L"%d",3 * i);
        SumArray.Add(str);

    }

    COleVariant covTrue((short)TRUE);
    COleVariant covFalse((short)FALSE);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

    if(!m_ExcelApp.CreateDispatch(_T("Excel.Application")))
    {
        AfxMessageBox(_T("創建Excel失敗"),MB_OK | MB_ICONWARNING);
        return;
    }

    m_ExcelBooks = m_ExcelApp.get_Workbooks();        // 獲取一個工作簿集合
    m_ExcelBook = m_ExcelBooks.Add(covOptional);        // 添加一個工作簿

    m_ExcelSheets = m_ExcelBook.get_Sheets();            // 獲取一個工作表集合
    m_ExcelSheet = m_ExcelSheets.get_Item(COleVariant((short)1));   // 獲取一個工作表

    // 向 Excel 中添加數據
    // 選擇工作表中 A1-A1 單元格區域
    m_ExcelRange = m_ExcelSheet.get_Range(COleVariant( _T("A1")), COleVariant(_T("A1")));        
    m_ExcelRange.put_Value2(COleVariant( _T("變量名1")));              // 設置 A1 內容
    m_ExcelCols = m_ExcelRange.get_EntireColumn();                    // 選擇整列
    m_ExcelCols.put_HorizontalAlignment(COleVariant((long)-4108));    // 設置居中對齊

    // 選擇工作表中 B1-B1 單元格區域
    m_ExcelRange = m_ExcelSheet.get_Range(COleVariant( _T("B1")), COleVariant(_T("B1")));            
    m_ExcelRange.put_Value2(COleVariant( _T("")));                  // 設置 B1 內容
    m_ExcelCols = m_ExcelRange.get_EntireColumn();                    // 選擇整列
    m_ExcelCols.put_HorizontalAlignment(COleVariant((long)-4108));    // 設置居中對齊

    // 選擇工作表中 C1-C1 單元格區域
    m_ExcelRange = m_ExcelSheet.get_Range(COleVariant( _T("C1")), COleVariant(_T("C1")));            
    m_ExcelRange.put_Value2(COleVariant( _T("變量名2")));              // 設置 C1 內容
    m_ExcelCols = m_ExcelRange.get_EntireColumn();                    // 選擇整列
    m_ExcelCols.put_HorizontalAlignment(COleVariant((long)-4108));    // 設置居中對齊
     
    // 選擇工作表中 D1-D1 單元格區域   
    m_ExcelRange = m_ExcelSheet.get_Range(COleVariant( _T("D1")), COleVariant(_T("D1")));        
    m_ExcelRange.put_Value2(COleVariant( _T("")));                  // 設置 D1 內容
    m_ExcelCols = m_ExcelRange.get_EntireColumn();                   // 選擇整列
    m_ExcelCols.put_HorizontalAlignment(COleVariant((long)-4108));   // 設置居中對齊

    // 選擇工作表中 E1-E1 單元格區域
    m_ExcelRange = m_ExcelSheet.get_Range(COleVariant( _T("E1")), COleVariant(_T("E1")));            
    m_ExcelRange.put_Value2(COleVariant( _T("")));                 // 設置 E1 內容
    m_ExcelCols = m_ExcelRange.get_EntireColumn();                   // 選擇整列
    m_ExcelCols.put_HorizontalAlignment(COleVariant((long)-4108));   // 設置居中對齊

    for(int i = 0;i < 20;i++)
    {    
        cellNum.Format(L"%d",i+2);
        cellNum = _T("A") + cellNum;
        // 依次選擇工作表中 A 列 的單元格
        m_ExcelRange = m_ExcelSheet.get_Range(COleVariant(cellNum), COleVariant(cellNum));        
        m_ExcelRange.put_Value2(COleVariant(_T("a")));          // 設置 A 列內容

        cellNum.Format(L"%d",i+2);
        cellNum = _T("B") + cellNum;
        // 依次選擇工作表中 B 列 的單元格
        m_ExcelRange = m_ExcelSheet.get_Range(COleVariant(cellNum), COleVariant(cellNum));        
        m_ExcelRange.put_Value2(COleVariant(ValueArray1[i]));   // 設置 B 列內容

        cellNum.Format(L"%d",i+2);
        cellNum = _T("C") + cellNum;
        // 依次選擇工作表中 C 列 的單元格
        m_ExcelRange = m_ExcelSheet.get_Range(COleVariant(cellNum), COleVariant(cellNum));        
        m_ExcelRange.put_Value2(COleVariant(_T("b")));          // 設置 C 列內容

        cellNum.Format(L"%d",i+2);
        cellNum = _T("D") + cellNum;
        // 依次選擇工作表中 D 列 的單元格
        m_ExcelRange = m_ExcelSheet.get_Range(COleVariant(cellNum), COleVariant(cellNum));        
        m_ExcelRange.put_Value2(COleVariant(ValueArray2[i]));  // 設置 D 列內容

        cellNum.Format(L"%d",i+2);
        cellNum = _T("E") + cellNum;
        // 依次選擇工作表中 E 列 的單元格
        m_ExcelRange = m_ExcelSheet.get_Range(COleVariant(cellNum), COleVariant(cellNum));        
        m_ExcelRange.put_Value2(COleVariant(SumArray[i]));    // 設置 E 列內容

    }

    m_ExcelApp.put_Visible(FALSE);                        // 不顯示 Excel 表格
    m_ExcelApp.put_UserControl(FALSE);                    // 設置表格狀態為用戶不可控制

    m_ExcelBook.SaveCopyAs(COleVariant(m_saveFilePath));  // 保存Excel表格
    m_ExcelBook.put_Saved(TRUE);

    // 釋放對象
    m_ExcelBooks.ReleaseDispatch();
    m_ExcelBook.ReleaseDispatch();
    m_ExcelSheets.ReleaseDispatch();
    m_ExcelSheet.ReleaseDispatch();
    m_ExcelRange.ReleaseDispatch();

    m_ExcelApp.Quit();          // 退出 Excel 程序,注意這里要先退出,后釋放
    m_ExcelApp.ReleaseDispatch();

}

  這段代碼創建了一個 Excel ,然后向 Excel 中添加了 5 列 21 行的數據並保存到本地,最終所得到的 Excel 如下:

  整個代碼不復雜,設置好一切后向 Excel 中添加數據即可,添加完數據后,記得保存表格,並釋放相應的資源,否則程序結束后會有一個 Excel 進程駐留在內存中,這樣重復運行程序時會出錯。


免責聲明!

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



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