大白 VC簡單讀寫EXCEL文件(OLE)

大白 VC簡單讀寫EXCEL文件(OLE)


簡介

作爲剛畢業的菜雞入職後,部門老大讓做一個小程序,要求能夠讀寫EXCEL文件,趕緊百度搜索VC讀寫Excel文件,參照了幾位大佬的博客後終於完成,於是在此寫下大白的一點點收穫以便以後複用。並且這也是大白的第一篇博客呀!

1.導入Excel庫文件

打開Class Wizard,點擊Add class按鈕下的From a type Library導入office安裝目錄下的excel.exe,然後選擇_Application,Workbooks,_Workbook,_Worksheet,Worksheets,Range等類,點擊OK後可以在源文件和頭文件中看到excel.cpp、excel.h兩個文件,在excel.h文件中可以看到剛剛選擇的類,在需要操作Excel的文件中#include “excel.h”就可以了。

2.初始化COM組件

在程序的入口處(CWinApp派生類的InitInstance()方法中)添加如下代碼:

if (!AfxOleInit())
{
    AfxMessageBox("無法初始化COM的動態鏈接庫");
    return FALSE;
}

如果是在其它線程中操作Excel務必在線程中再次初始化COM組件。

3.讀取Excel文件數據

定義如下變量:

_Application excel_app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;

選擇要讀取的Excel文件:

CString excelPathName;
CFileDialog dlg(TRUE, //TRUE爲OPEN對話框,FALSE爲SAVE AS對話框
        NULL,
        NULL,
        OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
        _T("xlsx Files(*.xlsx)|*.xlsx||"), //打開xlsx文件
        NULL);
    if(dlg.DoModal()==IDOK)
    {
        excelPathName=dlg.GetPathName(); //文件名保存在了excelPathName裏
    }

讀取Excel文件:

if (!excel_app.CreateDispatch("Excel.Application"))//創建Excel服務器
{
    AfxMessageBox("無法啓動EXCEL服務器");
}
else
{
    excel_app.SetVisible(TRUE); //使Excel可見
    excel_app.SetUserControl(TRUE); //允許其他用戶控制Excel
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    books.AttachDispatch(excel_app.GetWorkbooks());
    LPDISPATCH lpdis = books.Open(excelPathName, covOptional, covOptional, covOptional, covOptional
                , covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional
                , covOptional, covOptional, covOptional);
    book.AttachDispatch(lpdis);
    sheets.AttachDispatch(book.GetWorksheets());
    sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")));
    range.AttachDispatch(sheet.GetCells());
    _variant_t var;
    CString tmpStr;//存儲每個格子的數據
    int r,c;
    var =range.GetItem(_variant_t((long)r)
            ,_variant_t((long)c));//讀取第r行c列的數據,注意行和列都是從1開始
    tmpStr.Format("%s",(char*)(_bstr_t)var);//轉換成CString
    book.SetSaved(TRUE);//將Workbook的保存狀態設置爲已保存,即不讓系統提示是否人工保存 ,如果沒有這句會導致Excel釋放不掉!
    range.ReleaseDispatch();//注意釋放順序
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    excel_app.ReleaseDispatch();
    excel_app.Quit();
}

寫入數據到Excel文件:

if (!excel_app.CreateDispatch("Excel.Application"))
{
    AfxMessageBox("無法啓動EXCEL服務器");
}
else
{
    excel_app.SetVisible(TRUE);
    excel_app.SetUserControl(TRUE);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    books.AttachDispatch(excel_app.GetWorkbooks());
    book.AttachDispatch(books.Add(covOptional));
    sheets.AttachDispatch(book.GetWorksheets());
    sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")));
    Range range;
    range.AttachDispatch(sheet.GetCells());
    int r,c; //r表示行數,c表示列數
    CString data,savePath;//這裏data存儲要寫入的數據,savePath爲要保存的Excel文件路徑
    range.SetItem(_variant_t((long)r), _variant_t((long)c), _variant_t(data));//在第r行c列寫入數據data,注意行和列都是從1開始
    book.SaveAs(COleVariant(savePath), covOptional, covOptional,
            covOptional, covOptional, covOptional, 0, covOptional,
            covOptional, covOptional, covOptional, covOptional);
    book.SetSaved(TRUE);
    range.ReleaseDispatch();
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    excel_app.ReleaseDispatch();
    excel_app.Quit();
}

好了,一篇簡單讀寫Excel文件的博客就此結束了,大白的第一篇博客呀!雖然簡陋但也是大白第一步,希望自己繼續努力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章