VC2010對Excel的操作


VC2010Excel的操作

1. 創建新的C++工程

創建基於對話框的MFC程序

2. 添加庫、添加Excel類庫

在工程名上右鍵,選擇“添加”“類”(或者點擊菜單欄的“項目”->“添加類”),選擇“TypeLib中的MFC類”(MFC Class From TypeLib

類來源選“注冊表”,在可用的類型庫中選擇“Microsoft Excel 11.0 Object Library<1.5>”在接口列表框中選擇需要的類,在此,我們選擇_Application,_Workbook,Worksheet,Range,Workbooks,Worksheets這六個就可以了。

可以看到,六個類被添加了進來。

3. 修改頭文件

分別將加進來的六個頭文件上面的“#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace”注釋掉。

4. 添加頭文件

stdAfx.h頭文件中添加加進來的這幾個頭文件

#include "CApplication.h"

#include "CRange.h"

#include "CWorkbook.h"

#include "CWorkbooks.h"

#include "CWorksheet.h"

#include "CWorksheets.h"

5. 修改錯誤

編譯,會出現兩個錯誤:

\crange.h(335): warning C4003: DialogBoxW”宏的實參不足

\crange.h(335): error C2059: 語法錯誤:,

雙擊錯誤提示,定位在錯誤行,

VARIANT DialogBox()

{

VARIANT result;

InvokeHelper(0xf5, DISPATCH_METHODVT_VARIANT, (void*)&resultNULL);

return result;

}

將該函數名“DialogBox()前面加“_”下划線,即“_DialogBox()”,這樣就可以編譯成功了。

6. 在對話框中添加一個編輯框,並為其關聯一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();

 

}

}

 

7. 在對話框中添加“寫入”按鈕,實現新建一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!")));

 

//下面是向第二行的前十個單元格中輸入110,十個數字

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(); 

 

}

 

8. 在對話框中添加列表控件,並關聯變量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文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM