前段時間寫個工具需要從excel檔案中讀取資料,excel**資料列數為確定值,行數不確定,從網上搜了些方法嘗試,最終達到目的,總結如下:
1. 新建乙個基於對話方塊的mfc應用程式
2. 新增excel相關類
//#import "d:\\program files (x86)\\microsoft office\\office14\\excel.exe" no_namespace
在stdafx.h中新增:
#include "crange.h"
#include "cworkbook.h"
#include "cworkbooks.h"
#include "cworksheet.h"
#include "cworksheets.h"
4. 編譯出現錯誤:
1>e:\vs2010_project\demo\mfcexcel\crange.h(335): warning c4003: 「dialogboxw」巨集的實參不足
1>e:\vs2010_project\demo\mfcexcel\crange.h(335): error c2059: 語法錯誤:「,」
解決方法:定位錯誤資訊,在crange類中將dialogbox()改為_dialogbox()
variant _dialogbox()
5. 獲取excel檔案路徑全名(包括檔名)
void cofflinedlg::onbnclickedbuttonopenfile()
}
strpath為cstring型別的對話方塊成員變數,用於儲存路徑
6. 讀取excel中資料
新增乙個讀取資料按鈕,按鈕單擊訊息處理函式:
void cofflinedlg::onbnclickedbuttonreaddata()
getdlgitem(idc_button_readdata)->enablewindow(false);
cworkbooks books; //工作簿集合
cworkbook book; //工作簿
cworksheets sheets; //工作表集合
cworksheet sheet; //工作表
crange range; //使用區域
colevariant covoptional((long)disp_e_paramnotfound, vt_error);
book.attachdispatch(books.add(_variant_t(strpath)));//獲取選擇的excel檔案
sheets.attachdispatch(book.get_worksheets(),true);//獲取檔案中的所有sheet
sheet.attachdispatch(sheets.get_item(_variant_t("sheet1")),true);//獲取sheet1區域
vstrcyclesets.clear();
vstrcmdseque.clear();
vstrsenddata.clear();
vstrexpectdata.clear();
vstrtimeout.clear();
vstrcheck.clear();
vstrcyclecnt.clear();
cstring str;
bool bexit = false;
for(int irow=2;!bexit;irow++)
vstrcyclesets.push_back(str);
break;
case 2: str = range.get_value2();
vstrcmdseque.push_back(str);
break;
case 3: str = range.get_value2();
str.replace(" ", "");
vstrsenddata.push_back(str);
break;
case 4: str = range.get_value2();
str.replace(" ", "");
vstrexpectdata.push_back(str);
break;
case 5: str = range.get_value2();
vstrtimeout.push_back(str);
break;
case 6: str = range.get_value2();
vstrcheck.push_back(str);
break;
case 7: str = range.get_value2();
vstrcyclecnt.push_back(str);
break;
default: ;
}if(bexit)
}} range.releasedispatch();//釋放物件
sheet.releasedispatch();
sheets.releasedispatch();
book.releasedispatch();
books.releasedispatch();
if(!vstrcyclesets.empty())
else
getdlgitem(idc_button_readdata)->enablewindow(true);
}
我讀取的excel**資料列數固定為7,資料不確定所以行數不確定,第一行為表頭,所以從第二行a2單元格開始讀,通過ai是否為空來判斷資料是否讀完。採用容器來儲存資料物件比較方便,容器定義為對話方塊成員變數:
//儲存excel讀取的資料
vectorvstrcyclesets;
vectorvstrcmdseque;
vectorvstrsenddata;
vectorvstrexpectdata;
vectorvstrtimeout;
vectorvstrcheck;
vectorvstrcyclecnt;
至此,就完成了從excel中讀取資料。 VS2010 MFC開發學習筆記
做了一段mfc的開發,從零開始真的很難受,倒不是軟體難用,也不是語言難學,主要是好多功能不知道實現的函式,這裡把我用到的函式列出來,僅供參考 控制項操作 控制項顯示getdlgitem idc static display showwindow sw show 控制項隱藏getdlgitem idc...
vs2010 MFC設定控制項背景透明
通常要設定控制項背景色透明,原因是在對話方塊背景中使用了。對於這種情況,在vs2010中應當呼叫setbackgroundimage函式來實現背景的顯示。bool cmfcdlg oninitdialog 因為vs2010中對話方塊是派生cdialogex的,所以可以使用該函式來完成對應功能。呼叫後...
《VS2010 MFC程式設計入門教程》 讀書筆記
推薦兩個比較好的學習 mfc全稱microsoft foundation classes windows sdk software development kit,軟體開發工具包 new project win32 project是win32程式,empty project是空程式,mfc dll用...