大白 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文件的博客就此結束了,大白的第一篇博客呀!雖然簡陋但也是大白第一步,希望自己繼續努力。