1. 程式人生 > >在MFC程式中匯入一個Excel檔案

在MFC程式中匯入一個Excel檔案

這個程式只能讀取一個單元格的值,初始化這些方法是自己廢了好久的力氣才總結出來的,不然哪個沒敲進去,錯誤是上百個,但是隻要寫上了,錯誤也能瞬間消失,在有些經驗貼裡別人說要加這個,然後我就傻乎乎的加了,結果永遠都是上百個錯誤,也不知道自己哪裡出錯了,現在看來還是要多嘗試出錯的地方

試試將它刪了,也許就好了。

操作Excel檔案初始化:
a. project->add class->MFC class from typelib (專案->新增類->Typelib中的MFC類)匯入Excel.exe,一般都在C:/Program Files/Microsoft Office/Office12路徑下(即選擇你的office安裝路徑下的excel.exe加入)
b. 選中以下幾項_Application(最好先加入),_WorkSheet,_WorkBook,WorkSheets,WorkBooks,Range,然後匯入;
c. 匯入後自動在工程中新增CApplication,CWorkSheet,CWorkBook,CWorkSheets,CWorkBooks,CRange這些類;
然後需要把這些類的標頭檔案中的第一句話 #import ".......EXCEL.EXE" nonamespace 刪除;
引入之後如果編譯遇到錯誤,Not enough actual parameters for macro 'DialogBoxW'. 
解決方法是在CRange類中,

VARIANT DialogBox() 

VARIANT result; 
InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL); 
return result; 
}

DialogBox()前面新增下劃線變成_DialogBox(),解決了!

d.如果有錯誤,嘗試在每個標頭檔案,就是CApplication.h,CWorkSheet.h,CWorkBook.h,CWorkSheets.h,CWorkBooks.h,CRange.h,stadfx.裡面加入#include<afxdisp.h>,至此初始化就完成了

然後就是具體的實施過程了

在Dlg.cp檔案的開頭加入#include "stdafx.h"
#include "MFCApplication1.h"
#include "MFCApplication1Dlg.h"
#include "DlgProxy.h"
#include "afxdialogex.h"

在MFC對話方塊裡面加入一個button按鈕,雙擊按鈕進入程式碼,

void CMFCApplication1Dlg::OnBnClickedButton1()
{
// TODO: 在此新增控制元件通知處理程式程式碼
CApplication app;
CWorkbooks books;
CWorkbook book;
CWorksheets sheets;
CWorksheet sheet;
CRange range;
CRange iCell;
LPDISPATCH lpDisp;
COleVariant vResult;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if (!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox(_T("無法啟動Excel伺服器!"));
return;
}
books.AttachDispatch(app.get_Workbooks());
lpDisp = books.Open("E:/GSS-5070-04L-renr.xls",covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional,covOptional); 


  //得到Workbook 
book.AttachDispatch(lpDisp);
//得到Worksheets 
sheets.AttachDispatch(book.get_Worksheets());


//得到當前活躍sheet 
//如果有單元格正處於編輯狀態中,此操作不能返回,會一直等待 
lpDisp = book.get_ActiveSheet();
sheet.AttachDispatch(lpDisp);
//讀取第一個單元格的值 
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)2), COleVariant((long)1)).pdispVal);
/*COleVariant*/ vResult = range.get_Value2();
CString str;
if (vResult.vt == VT_BSTR) //字串 
{
str = vResult.bstrVal;
}
else if (vResult.vt == VT_R8) //8位元組的數字 
{
str.Format(_T("%f", vResult.dblVal));
}


/*else if(vResult.vt==VT_DATE) //時間格式
{
SYSTEMTIME st;
VariantTimeToSystemTime(&vResult.date, &st);
}
else if(vResult.vt==VT_EMPTY) //單元格空的
{
str="";
}*/
books.Close();
app.Quit(); // 退出 
//釋放物件 
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
OnOK();
MessageBox(str);
}

注意在編譯過程中,會發現afx.h檔案有大量錯誤,。這個經驗貼也算解決了我的問題http://blog.csdn.net/cqltbe131421/article/details/52484751,

再來就是一些注意問題,str.Format(_T("%f", vResult.dblVal));這句一開始沒有_T,因為出現錯誤所以去改,發現了這個帖子解決了我的問題,http://blog.csdn.net/xiaopang1122/article/details/53813956

好了,這個程式只能讀取一個單元格的數值,我再研究研究怎麼讀取全部Excel裡面的值吧