(转)另一篇:VC导出数据到EXCEL
另一篇:VC導出數據到EXCEL??
2010-08-28 17:03:47|??分類: 默認分類 |??標簽: |字號大中小?訂閱
我們制作應用軟件的時候,經常要把結果以報表的形式輸出,當前使用較為廣泛的當然是Excel表格,本文簡略介紹在VC++6.0中如何使用Excel2003的庫函數并對其進行編程。先創建一個對話框工程,命名為VCExcel。在對話框中添加一個按鈕,控件ID為ID_RUNEXCEL,界面如下(是不是很搞笑哇,不過沒關系,它照樣能實現強大的功能!)。
????再在該按鈕上添加消息BN_CLICKED,其消息映射函數為OnRunexcel(),下面我們的工作就是要完成這個OnRunexcel()函數。在這里我們通過一個實例來說明VC是如何調用Excel2003的接口編程的。
我們要編程輸出一個如下表格。
???? 1、表頭的字體為宋體,加粗,顏色為白色,底色為深藍,垂直水平居中對齊;
???? 2、表中正文內容字體為宋體,顏色為深藍,底色為灰色,垂直水平居中對齊;??
???? 3、全部邊框,文本自動換行。
在BOOL CVCExcelApp::InitInstance()之中,int nResponse = dlg.DoModal()語句之后加入如下代碼:
(轉載者注:應該是在語句之前,否則有什么用呀!)
if(!AfxOleInit())///初始化COM庫
???????? {
?????????????????? AfxMessageBox("初始化COM失敗");
?????????????????? return FALSE;
???????? }
????為了能調用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應用程序、工作簿和單元格。
?????? Range m_ExlRge;
?????? _Worksheet m_ExlSheet;
?????? Worksheets m_ExlSheets;
?????? _Workbook m_ExlBook;
?????? Workbooks m_ExlBooks;
?????? _Application m_ExlApp;
我們利用加載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();
}
小結:一年前就想寫這個東西了,因為網上講VC與Office編程的資料實在是太少了,即使有也很片面(VB講這方面的東西卻又多又全,郁悶~),想當初做這個東西的時候上網查資料快查瘋掉了,最后還是一堆問題沒有解決。哈哈,現在無聊靜下心來一研究發現原來VC蹂躪Excel也不是一件難事啊,在這個例子里面包含了很多常用的功能,相信做一般的報表是沒什么問題的。要是做更復雜的報表怎么辦呢?一個例子也不可能包括方方面面呀,那確實,因此有很多東西是需要讀者自己探討的。下面我告訴大家一個方法,細心的讀者可能已經發現有些參數不知道是從哪里蹦出來的,例如:水平對齊:默認=1,居中=-4108,左=-4131,右=-4152。這就要用到Office的宏錄制功能(什么?你沒聽過?網上去查吧^__^),把你要的操作用宏錄制下來,然后用VB打開,單步調試的時候就能發現這些秘密了!上面例子中的參數都是DoDo在宏里面找到滴,哈哈,是不是很簡單?快去試試吧~
轉載于:https://www.cnblogs.com/yxsylyh/archive/2011/09/07/vcexportexcel.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的(转)另一篇:VC导出数据到EXCEL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chm文件无法正常显示
- 下一篇: Silverlight入门系列]使用MV