當前位置:編程學習大全網 - 源碼下載 - C++ mfc 新建excel文件

C++ mfc 新建excel文件

本文簡略介紹在VC++6.0中如何使用Excel2003的庫函數並對其進行編程。先創建壹個對話框工程,命名為VCExcel。在對話框中添加壹個按鈕,控件ID為ID_RUNEXCEL。?

再在該按鈕上添加消息BN_CLICKED,其消息映射函數為OnRunexcel()。通過壹個實例來說明VC是如何調用Excel2003的接口編程的。?

要編程輸出壹個如下表格。 格式如下:

1、表頭的字體為宋體,加粗,顏色為白色,底色為深藍,垂直水平居中對齊;

2、表中正文內容字體為宋體,顏色為深藍,底色為灰色,垂直水平居中對齊;?

3、全部邊框,文本自動換行。

在BOOL CVCExcelApp::InitInstance()之中,int nResponse = dlg.DoModal()語句之後加入如下代碼:

if(CoInitialize(NULL)==0)//初始化COM庫?

{?

AfxMessageBox("初始化COM失敗!");?

exit(1);?

}

在return FALSE;語句之前加入:::CoUninitialize();//釋放COM庫。

為了能調用Excel的接口我們打開MFC ClassWizard->Automation->Add Class->From a type library,選擇[Excel的安裝路徑]\EXCEL.exe,然後把所有的類都添加進去,頭文件為excel.h,源文件為excel.cpp。當然,妳也可以只把壹些比較常用的類如_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range加進去,因為網上流傳的絕大部分教程都只添加這幾個類,這完全根據妳個人的需要。但在本例中我們至少還要用到Interior類(設置底色),Font類(設置字體),而且這樣做又簡單又方便擴展功能,不管三七二十壹全部弄進去吧!但這樣做會有壹個問題,有可能產生類的名字沖突,例如本來妳自己寫了壹個類叫Font,當妳全部添加時又再次加入了Font類,這樣就重復定義了,不過可以通過名字空間來解決這個問題。再在VCExcelDlg.cpp文件的頭部添加(如果系統已經自動添加就不要重復添加了):

#include?"VCExcel.h"?

#include?"comdef.h"

這樣壹來我們的程序就可以自由調用EXCEL了,壹切準備就緒。

下面先在CVCExcelDlg中添加如下成員變量,用來操控Excel應用程序、工作簿和單元格。?A

Range?m_ExlRge;?

_Worksheet?m_ExlSheet;?

Worksheets?m_ExlSheets;?

_Workbook?m_ExlBook;?

Workbooks?m_ExlBooks;?

_Application?m_Exl

我們利用加載Excel模板來生成要求的表格,在本工程Debug文件夾中建立壹個Excel文件,命名為Template.xls。我們的OnRunexcel()代碼如下(詳見註釋):

void?CVCExcelDlg::OnRunexcel()?

{?

//?TODO:?Add?your?control?notification?handler?code?here?

//用m_ExlApp對象創建Excel2003進程?

if(!m_ExlApp.CreateDispatch("Excel.Application",NULL))?

{?

AfxMessageBox("創建Excel服務失敗!");?

return;?

}?

//設置為可見?

m_ExlApp.SetVisible(TRUE);?

///////////////////下面得到應用程序所在的路徑///////////////////?

CString?theAppPath,theAppName;?

char?Path[MAX_PATH];?

GetModuleFileName(NULL,Path,MAX_PATH);//得到應用程序的全路徑?

theAppPath=(CString)Path;?

theAppName=AfxGetApp()->m_pszAppName;?

theAppName+=".exe";?

//把最後的文件名去掉?

int?length1,length2;?

length1=theAppPath.GetLength();?

length2=theAppName.GetLength();?

theAppPath.Delete(length1-length2,length2);?

////////////////////////////////////////////////////////////////?

CString?TempPath="";?

TempPath=theAppPath+"Template.xls";//EXCEL模板的路徑?

m_ExlBooks.AttachDispatch(m_ExlApp.GetWorkbooks(),TRUE);?

m_ExlBook.AttachDispatch(m_ExlBooks.Add((_variant_t)TempPath),TRUE);//加載EXCEL模板?

m_ExlSheets.AttachDispatch(m_ExlBook.GetSheets(),TRUE);//加載Sheet頁面?

//添加新的Sheet頁面?

m_ExlSheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing);?

//刪除第二個Sheet頁面?

m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)2)),TRUE);?

m_ExlSheet.Delete();?

//把第壹個Sheet頁面的名字改變為TestSheet?

m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(_variant_t((long)1)),TRUE);?

m_ExlSheet.SetName("TestSheet");?

///////合並第壹行單元格A1至D1//////?

//加載要合並的單元格?

m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A1"),_variant_t("D1")),TRUE);?

m_ExlRge.Merge(_variant_t((long)0));?

////////設置表格內容////////?

m_ExlRge.AttachDispatch(m_ExlSheet.GetCells(),TRUE);//加載所有單元格?

m_ExlRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("數學系研究生課程統計"));?

m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)1),_variant_t("課程名"));?

m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)2),_variant_t("課時"));?

m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)3),_variant_t("難度"));?

m_ExlRge.SetItem(_variant_t((long)2),_variant_t((long)4),_variant_t("教學方式"));?

m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)1),_variant_t("泛函分析"));?

m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)2),_variant_t("60"));

m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)3),_variant_t("普通"));?

m_ExlRge.SetItem(_variant_t((long)3),_variant_t((long)4),_variant_t("老師講課"));?

m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)1),_variant_t("微分流形"));?

m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)2),_variant_t("40"));m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)3),_variant_t("變態難"));?

m_ExlRge.SetItem(_variant_t((long)4),_variant_t((long)4),_variant_t("自學"));?

m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)1),_variant_t("二階橢圓型方程與方程組"));?

m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)2),_variant_t("60"));

m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)3),_variant_t("很難"));?

m_ExlRge.SetItem(_variant_t((long)5),_variant_t((long)4),_variant_t("討論"));?

m_ExlRge.AttachDispatch(m_ExlSheet.GetUsedRange());//加載已使用的單元格?

m_ExlRge.SetWrapText(_variant_t((long)1));//設置單元格內的文本為自動換行?

//設置齊方式為水平垂直居中?

//水平對齊:默認=1,居中=-4108,左=-4131,右=-4152?

//垂直對齊:默認=2,居中=-4108,左=-4160,右=-4107?

m_ExlRge.SetHorizontalAlignment(_variant_t((long)-4108));?

m_ExlRge.SetVerticalAlignment(_variant_t((long)-4108));?

///////設置整體的字體、字號及顏色//////?

Font?ft;?

ft.AttachDispatch(m_ExlRge.GetFont());?

ft.SetName(_variant_t("宋體"));//字體?

ft.SetColorIndex(_variant_t((long)11));//字的顏色?

ft.SetSize(_variant_t((long)12));//字號?

///////////設置標題字體及顏色//////////?

m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A1"),_variant_t("D1")));?

ft.AttachDispatch(m_ExlRge.GetFont());?

ft.SetBold(_variant_t((long)1));//粗體?

ft.SetSize(_variant_t((long)13));?

ft.SetColorIndex(_variant_t((long)2));?

CellFormat?cf;?

cf.AttachDispatch(m_ExlRge.GetCells());?

//////////////設置底色/////////////////?

Interior?it;?

it.AttachDispatch(m_ExlRge.GetInterior());?

it.SetColorIndex(_variant_t((long)11));//標題底色?

////表格內容的底色////?

m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(_variant_t("A2"),_variant_t("D5")));?

it.AttachDispatch(m_ExlRge.GetInterior());?

it.SetColorIndex(_variant_t((long)15));?

//////////////為表格設置邊框/////////////?

Range?UnitRge;?

CString?CellName;?

for(int?i=1;i<=4;i++)?

{?

for(int?j=1;j<=4;j++)?

{?

CellName.Format("%c%d",j+64,i);//單元格的名稱?

UnitRge.AttachDispatch(m_ExlRge.GetRange(_variant_t(CellName),_variant_t(CellName)));//加載單元格?

//LineStyle=線型?Weight=線寬?ColorIndex=線的顏色(-4105為自動)?

UnitRge.BorderAround(_variant_t((long)1),_variant_t((long)2),_variant_t((long)-4105),vtMissing);//設置邊框?

}?

}?

//釋放對象(相當重要!)?

m_ExlRge.ReleaseDispatch();?

m_ExlSheet.ReleaseDispatch();?

m_ExlSheets.ReleaseDispatch();?

m_ExlBook.ReleaseDispatch();?

m_ExlBooks.ReleaseDispatch();?

//m_ExlApp壹定要釋放,否則程序結束後還會有壹個Excel進程駐留在內存中,而且程序重復運行的時候會出錯?

m_ExlApp.ReleaseDispatch();?

//退出程序?m_ExlApp.Quit();?

}

  • 上一篇:html登陸界面代碼
  • 下一篇:《天下》手遊開服須知 玩法概括壹覽
  • copyright 2024編程學習大全網