標籤:list 選中 輸入 項目 ade 添加 研發 edit 風格
https://wenku.baidu.com/view/d7383548767f5acfa1c7cd30.html
只看這個就夠了
copy版
VC2010對Excel的操作
- 建立新的C++工程
建立基於對話方塊的MFC程式
- 添加庫、添加Excel類庫
在工程名上右鍵,選擇“添加”—“類”(或者點擊功能表列的“項目”->“添加類”),選擇“TypeLib中的MFC類”(MFC Class From TypeLib)
類來源選“註冊表”,在可用的類型庫中選擇“Microsoft Excel 11.0 Object Library<1.5>”在介面列表框中選擇需要的類,在此,我們選擇_Application,_Workbook,Worksheet,Range,Workbooks,Worksheets這六個就可以了。
可以看到,六個類被添加了進來。
- 修改標頭檔
分別將加進來的六個標頭檔上面的“#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace”注釋掉。
- 添加標頭檔
在stdAfx.h標頭檔中添加加進來的這幾個標頭檔
#include "CApplication.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
- 修改錯誤
編譯,會出現兩個錯誤:
…\crange.h(335): warning C4003: “DialogBoxW”宏的實參不足
…\crange.h(335): error C2059: 語法錯誤:“,”
雙擊錯誤提示,定位在錯誤行,
VARIANT DialogBox()
{
VARIANT result;
InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);
return result;
}
將該函數名“DialogBox()”前面加“_”底線,即“_DialogBox()”,這樣就可以編譯成功了。
- 在對話方塊中添加一個編輯框,並為其關聯一CEdit類型變數m_Path,添加“開啟”按鈕,實現開啟一已經存在的Excel檔案。並將路徑顯示在編輯框中。實現代碼如下。
void CExportToExcelDlg::OnBnClickedButtonOpen()
{
CFileDialog file(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
_T("EXCEL檔案t(*.xls;*.xlsx)|*.xls;*.xlsx||"),AfxGetMainWnd());
if(file.DoModal()==IDOK)
{
CString strPath=file.GetPathName();
m_Path.SetWindowTextW(strPath);
CApplication app;
CWorkbook book;
CWorkbooks books;
if (!app.CreateDispatch(_T("Excel.Application")))
{
MessageBox(_T("Error!Creat Excel Application Server Faile!"));
exit(1);
}
//books.AttachDispatch(app.get_Workbooks(),true);
//book.AttachDispatch(books.Add(_variant_t(strPath)));
books = app.get_Workbooks();
book = books.Add(_variant_t(strPath));
app.put_Visible(true);
//結尾,釋放
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
app.Quit();
}
}
- 在對話方塊中添加“寫入”按鈕,實現建立一Excel檔案(存在則覆蓋),並向檔案中寫入資料。實現代碼如下。
void CExportToExcelDlg::OnBnClickedButtonWrite()
{
CString strFile = _T("D:\\WriteToExcelTest.xlsx");
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CApplication app;
CWorkbook book;
CWorkbooks books;
CWorksheet sheet;
CWorksheets sheets;
CRange range;
CFont font;
if (!app.CreateDispatch(_T("Excel.Application")))
{
MessageBox(_T("Error!Creat Excel Application Server Faile!"));
}
books = app.get_Workbooks();
//books.AttachDispatch(app.get_Workbooks());可代替上面一行
book = books.Add(covOptional);
//book.AttachDispatch(books.Add(covOptional),true); 可代替上面一行
sheets=book.get_Worksheets();
//sheets.AttachDispatch(book.get_Worksheets(),true); 可代替上面一行
sheet = sheets.get_Item(COleVariant((short)1));
//sheet.AttachDispatch(sheets.get_Item(_variant_t("sheet1")),true); 可代替上面一行
//下面兩行,是向A1中寫入"Yeah!I can write data to excel!"
range = sheet.get_Range(COleVariant(_T("A1")),COleVariant(_T("A1")));
range.put_Value2(COleVariant(_T("Yeah!I can write data to excel!")));
//下面是向第二行的前十個儲存格中輸入1到10,十個數字
for(long i=1;i<11;i++)
range.put_Item(_variant_t((long)2),_variant_t((long)i),_variant_t((long)i));
//設定列寬
range = sheet.get_Range(COleVariant(_T("A1")),COleVariant(_T("J1")));
range.put_ColumnWidth(_variant_t((long)5));
//顯示表格
app.put_Visible(TRUE);
//儲存
book.SaveCopyAs(COleVariant(strFile));
book.put_Saved(true);
//結尾,釋放
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
app.Quit();
}
- 在對話方塊中添加清單控制項,並關聯變數m_Grid,並設定顯示為報表樣式。在對話方塊中添加“寫入列表”按鈕,實現將對話方塊中已有的表寫入到Excel中。實現代碼如下。
在初始化函數中,先初始化列表。
//設定列表視圖的擴充風格
m_Grid.SetExtendedStyle(LVS_EX_FLATSB //扁平風格顯示捲軸
|LVS_EX_FULLROWSELECT //允許整行選中
|LVS_EX_HEADERDRAGDROP //允許整列拖動
|LVS_EX_ONECLICKACTIVATE //單擊選中項
|LVS_EX_GRIDLINES); //畫出網格線
//設定表頭
m_Grid.InsertColumn(0,_T("編號"),LVCFMT_LEFT,100,0);
m_Grid.InsertColumn(1,_T("姓名"),LVCFMT_LEFT,100,1);
m_Grid.InsertColumn(2,_T("所屬部門"),LVCFMT_LEFT,100,2);
//向列表中插入資料
int count = 0;
m_Grid.InsertItem(count,_T("001"));
m_Grid.SetItemText(count,1,_T("張一"));
m_Grid.SetItemText(count++,2,_T("銷售部"));
m_Grid.InsertItem(count,_T("002"));
m_Grid.SetItemText(count,1,_T("列二"));
m_Grid.SetItemText(count++,2,_T("研發部"));
m_Grid.InsertItem(count,_T("003"));
m_Grid.SetItemText(count,1,_T("宇三"));
m_Grid.SetItemText(count++,2,_T("採購部"));
m_Grid.InsertItem(count,_T("004"));
m_Grid.SetItemText(count,1,_T("宙四"));
m_Grid.SetItemText(count,2,_T("宣傳部"));
再編寫按鈕的響應函數
void CExportToExcelDlg::OnBnClickedButtonWritelist()
{
// TODO: 在此添加控制項通知處理常式代碼
CString strFile = _T("D:\\WriteListToExcelTest.xlsx");
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CApplication app;
CWorkbook book;
CWorkbooks books;
CWorksheet sheet;
CWorksheets sheets;
CRange range;
if (!app.CreateDispatch(_T("Excel.Application")))
{
MessageBox(_T("Error!Creat Excel Application Server Faile!"));
exit(1);
}
books = app.get_Workbooks();
book = books.Add(covOptional);
sheets = book.get_Worksheets();
sheet = sheets.get_Item(COleVariant((short)1));
//得到全部Cells
range.AttachDispatch(sheet.get_Cells());
CString sText[]={_T("編號"),_T("姓名"),_T("所屬部門")};
for (int setnum=0;setnum<m_Grid.GetItemCount()+1;setnum++)
{
for (int num=0;num<3;num++)
{
if (!setnum)
{
range.put_Item(_variant_t((long)(setnum+1)),_variant_t((long)(num+1)),
_variant_t(sText[num]));
}
else
{
range.put_Item(_variant_t((long)(setnum+1)),_variant_t((long)(num+1)),
_variant_t(m_Grid.GetItemText(setnum-1,num)));
}
}
}
//儲存
book.SaveCopyAs(COleVariant(strFile));
book.put_Saved(true);
app.put_Visible(true);
//釋放對象
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
app.Quit();
}
最終結果如下。
按【開啟】按鈕,出現開啟對話方塊,可選擇Excel開啟。
按【寫入】按鈕,開啟Excel檔案。
按下【寫入列表】,開啟Excel檔案。
MFC讀入匯出到EXCEL