




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、VC中利用Excel2003生成圖文報表(內(nèi)部資料 請勿外傳)編 寫:邵江日 期:2011-2-21檢 查:日 期:審 核:日 期:批 準(zhǔn):日 期:武漢東健科技有限公司版權(quán)所有 不得復(fù)制文檔變更記錄序號變更(+/-)說明作者版本號日期批準(zhǔn)12參考資料1.1 VC利用EXCEL模板實現(xiàn)報表打印的九大步驟#include "excel9.h" /使用EXCEL類需要包含的頭文件#include "comdef.h" /使用EXCEL類需要包含的頭文件(注:需要"excel9.h"和"excel9.cpp",是通過類向?qū)?/p>
2、添加新類中的from a type library 到office安裝目錄下加載olb 文件 注意excel加載exe文件)第二步:創(chuàng)建對象_Application ExcelApp;Workbooks wbsMyBooks;_Workbook wbMyBook;Worksheets wssMysheets;_Worksheet wsMysheet;Range rgMyRge;第三步:創(chuàng)建EXCEL服務(wù)器/*創(chuàng)建EXCEL服務(wù)器*/if (!ExcelApp.CreateDispatch("Excel.Application", NULL)AfxMessageBox(&qu
3、ot;創(chuàng)建EXCEL服務(wù)器失敗!");return;第四步:利用EXCEL模板創(chuàng)建EXCEL文檔/strPath為模板的全路徑名wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(), true);trywbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(strPath);catch(.)AfxMessageBox("EXCEL模板打開失敗,請檢查文件是否存在!", MB_OK | MB_ICONSTOP);ExcelApp.Quit();return;第五步:關(guān)聯(lián)對象/*
4、得到Worksheets*/wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(), true);/*得到Worksheet1*/wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1"), true);/*得到全部Cells,此時,rgMyRge是cells的集合*/ rgMyRge.AttachDispatch(wsMysheet.GetCells(),true); 第六步:設(shè)置單元格的值rgMyRge.SetItem(_variant_t(long)
5、1),_variant_t(long)1),_variant_t("姓名"); /1*1rgMyRge.SetItem(_variant_t(long)1),_variant_t(long)2),_variant_t("QQ號"); /1*2rgMyRge.SetItem(_variant_t(long)2),_variant_t(long)1),_variant_t("風(fēng)云在線"); rgMyRge.SetItem(_variant_t(long)2),_variant_t(long)2),_variant_t("2788
6、00584"); 第七步:打印預(yù)覽ExcelApp.SetVisible(true);wbMyBook.PrintPreview(_variant_t(false); 第八步:退出EXCEL應(yīng)用程序/*設(shè)置保存標(biāo)志為已保存,則不會彈出保存模板對話框,實際上并未保存,只是認(rèn)為的標(biāo)志保存了,因為這里不需要保存*/wbMyBook.SetSaved(true);/*退出EXCEL應(yīng)用程序*/ExcelApp.Quit();第九步:釋放對象/*釋放對象*/ rgMyRge.ReleaseDispatch(); wsMysheet.ReleaseDispatch(); wssMysheets.
7、ReleaseDispatch(); wbMyBook.ReleaseDispatch(); wbsMyBooks.ReleaseDispatch(); ExcelApp.ReleaseDispatch();1.2 VC操作EXCELExcel為發(fā)人員提供了強(qiáng)大的外部接口,方便開發(fā)人員進(jìn)行二次開發(fā)。最近筆者就采用excel 的automation技術(shù)成功地解決了excel報表的自動生成功能首先給大家介紹一下報表創(chuàng)建模塊的組成,如下圖所示模版文件。由于筆者設(shè)計的報表都是周期性的固定報表,做成模版更適合數(shù)據(jù)的讀寫操作和圖表的生成,所以將全部的報表歸納整理生成了幾類模版。 模版描述文件。主要紀(jì)錄數(shù)據(jù)
8、寫在那個行那個列,那個圖表對應(yīng)什么類型的數(shù)據(jù)。它跟隨模版文件的變更一起變更,時刻與模版文件保持同步,這樣可以不必修改程序就能夠更改輸出報表的格式。 數(shù)據(jù)源描述文件。主要描述對應(yīng)文件的源數(shù)據(jù)所在的那種數(shù)據(jù)庫。 接下來給大家介紹一下程序操作excel的流程:一、插入類型庫1、 在一個已有的MFC工程按Ctrl + W 彈出ClassWizard對話框。2、 Add Class.From a type Library. 在 Office 目錄中,找到你想使用的Excel類型庫。若你安裝的是Offce2000則選擇安裝目錄下的EXCEL9.OLB文件進(jìn)行倒入,生成的倒入文件名稱叫做excel9.h和e
9、xcel9.cpp;若你安裝的時office2003則選擇。選擇安裝目錄下EXCEL.exe進(jìn)行到入,生成的倒入文件時excel.h和excel.cpp。兩者的部分接口有所不同。3、 在彈出的對話框中選擇要添加的類,具體選那些類要根據(jù)實際情況而定。當(dāng)然你也可以全選 說明:類型庫會給出Excel的全部接口類,可以根據(jù)需要挑選自己需要的類,但是一般情況下的EXCEL文的操作都會涉及以下的幾個類:_Application、WorkBooks、_WorkBook、WorkSheets、_WorkSheet、Range。若涉及圖表的操作還會涉及如下的幾個類:ChartObjects、ChartObjec
10、t、_Chart、Series 二、服務(wù)的啟動和關(guān)閉 服務(wù)器的啟動 _Workbook excelBook; Worksheets excelSheets; _Application excelApp; BOOL CreateApplication() . if (!excelApp.CreateDispatch("Excel.Application",NULL) . AfxMessageBox("創(chuàng)建Excel服務(wù)失敗!"); return FALSE; excelApp.SetVisible(FALSE); excelApp.SetDisplayAl
11、erts(FALSE); return TRUE; 說明: 在此之前要添加CoInitialize(NULL)函數(shù)初始化Com接口。 關(guān)鍵詞"Excel.Application"是啟動Excel的COM服務(wù)的唯一標(biāo)示。SetVisible函數(shù)表示運行的進(jìn)程是否可見。SetDisplayAlerts函數(shù)表示是否忽略警告信息,比如提示“文件xxx.xls已經(jīng)存在是否覆蓋?”,若SetDisplayAlerts的參數(shù)為FALSE則不出現(xiàn)提示信并默認(rèn)覆蓋。 服務(wù)的關(guān)閉 void DestroryApplication() . excelApp.Quit(); excelApp.Re
12、leaseDispatch(); 三、文件的打開與保存 文件的打開 BOOL Open(char* pFileName) . Workbooks excelBooks; excelBooks.AttachDispatch(excelApp.GetWorkbooks(); LPDISPATCH lpDisp = excelBooks.Add(SV(pFileName); if(lpDisp = NULL) return FALSE; excelBook.AttachDispatch(lpDisp); excelSheets.AttachDispatch(excelBook.GetWorkshee
13、ts(); return TRUE; 文件的保存 void Save(char* pFile,_Worksheet exceSheet) . exceSheet.SaveAs(pFile,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing, vtMissing,vtMissing,vtMissing); 說明: 對于文件的保存2000版和2003版有所區(qū)別,2000版比2003版少了一個參數(shù)。四、操作的退出上面提到得服務(wù)的退出不代表文件就關(guān)閉了,當(dāng)服務(wù)停止后內(nèi)存中依然駐留著一個Excel.exe進(jìn)程必須殺掉該進(jìn)程才算完整的退出。實現(xiàn)代碼如下: K
14、illProgram(“Excel.exe”);BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam) . DWORD dwID; GetWindowThreadProcessId(hwnd,&dwID); if(dwID = (DWORD)lParam) . PostMessage(hwnd, WM_QUIT, 0, 0); return FALSE; return TRUE; void KillProgram(LPCSTR ExeName) . LPCSTR File; HANDLE hProcessSnap; PROCESSENTR
15、Y32 pe32; MODULEENTRY32 me32; if(!ExeName | !ExeName0) return; File = strrchr(ExeName, ''); if(File!=0) ExeName = File + 1; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(hProcessSnap = (HANDLE)-1) return; memset(&pe32, 0, sizeof(pe32); pe32.dwSize = sizeof(PROCESSENT
16、RY32); if(Process32First(hProcessSnap, &pe32) . do . memset(&me32, 0, sizeof(me32); me32.dwSize = sizeof(me32); File = strrchr(pe32.szExeFile, ''); File = File ? File+1 : pe32.szExeFile; if(strcmpi(File,ExeName) = 0) EnumWindows(WNDENUMPROC)EnumWinProc, pe32.th32ProcessID); while(Pro
17、cess32Next(hProcessSnap,&pe32); CloseHandle(hProcessSnap); 數(shù)據(jù)操作 1獲取sheet。void GetSheet(char* pSheetName,_Worksheet& excelSheet) excelSheet.AttachDispatch(excelSheets.GetItem(_variant_t(pSheetName); _Worksheet dataSheet;GetSheet("數(shù)據(jù)",dataSheet);注意:sheet名稱必須在文件中存在,否則程序拋出異常。為了適應(yīng)不同文件的操
18、作,此處的sheet名稱可通過配置文件進(jìn)行動態(tài)配置。2.獲取rangevoid GetRange(_Worksheet excelSheet,Range& excelRange) excelRange.AttachDispatch(excelSheet.GetCells();Range dataRange;GetRange(dataSheet,dataRange);3指定行列的數(shù)據(jù)獲取#define LV(x) _variant_t(long(x)#define SV(x) _variant_t(x)。bool GetData(int row,int col)range.AttachD
19、ispatch(dataSheet.GetCells(); range.AttachDispatch(range.GetItem(LV(row),LV(col).pdispVal); COleVariant vResult =range.GetValue2();if(vResult.vt=VT_EMPTY) return false;return true;4.數(shù)據(jù)的填寫Void SetValue(int row,int col,char* pData) dataRange.SetItem(LV(row),LV(col),SV(pData); 5.數(shù)據(jù)區(qū)域的拷貝假如有一個表格高度變量是dTab
20、leHeight,寬度變量是dTableWidth,將其拷貝若干份,每個表格之間相隔一行實現(xiàn)代碼如下:Int row = 1Range rgMyRge2, rgMyRge3For(int I = 0 ; I < n;i+)rgMyRge2.AttachDispatch( dataRange.GetItem( COleVariant(long)(row) , COleVariant(long)1).pdispVal, true); rgMyRge3.AttachDispatch(rgMyRge2.GetResize(COleVariant(long)dTableHeight ),COleV
21、ariant(long) dTableWidth) ); rgMyRge3.Copy( dataRange.GetItem(LV(long)( row + dTableHeight),LV( long(1) ) ) );row = row + dTableHeight + 1;圖表操作Excel提供了功能強(qiáng)大的圖表處理功能,我們可以輕而易舉的繪制各類統(tǒng)計報表。如下圖所示我們將對局有固定模版的圖表進(jìn)行處理。 1 獲得圖表_Worksheet chartSheet;GetSheet("曲線圖",chartSheet); void GetChart(_Worksheet exce
22、lSheet,int dChatNo,_Chart& excelChart) ChartObjects objCharts; ChartObject objChart; COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR); objCharts = excelSheet.ChartObjects(vOpt); objChart = objCharts.Item(COleVariant(short)dChatNo); excelChart.AttachDispatch( objChart.GetChart(),true);_Chart resu
23、ltchart;GetChart(chartSheet,ChartNo,resultchart); 注意:變量ChartNo表示圖表的排序值,即屬于一個sheet中的第幾個圖表,該排序值是根據(jù)用戶創(chuàng)建圖表的順序自動生成的。2 設(shè)定曲線要實現(xiàn)曲線的,就必須準(zhǔn)確的描述曲線。曲線描述信息是一個序列化的字符串,它包含四個部分,每個部分之間依靠逗號分隔:1 圖表的title.2 圖表的x周描述信息3 顯示曲線所基于的數(shù)據(jù)區(qū)域描述4 單一圖表內(nèi)的曲線排序值(曲線id)其中某些項目可以不設(shè),系統(tǒng)將取默認(rèn)值,最終形成的序列化格式如下:=SERIES("示例",數(shù)據(jù)!$A$4:$A$34,數(shù)
24、據(jù)!$C$4:$C$34,1),也可以省略指定x坐標(biāo)=SERIES("示例", ,數(shù)據(jù)!$C$4:$C$34,1)。void SetChartSeriesSource( _Chart excelChart , short series_id , char *pParamLine) Series oSeries; oSeries = excelChart.SeriesCollection(COleVariant(short)series_id); oSeries.SetFormula(pParamLine); char szParamLine1024; sprintf(rgn
25、line,"=SERIES("%s",%s!$%s$%d:$%s$%d,%d)", "數(shù)據(jù)",pDataName,pCol,row,pCol,dIndexRowi , 1);SetChartSeriesSource(excelChart , 1 , szParamLine);注意:設(shè)定的數(shù)據(jù)內(nèi)不得出現(xiàn)沒有值得現(xiàn)象。比如基于數(shù)據(jù)區(qū)域a1:a100形成一條曲線,若a30的位置無數(shù)據(jù)(指的是區(qū)域空而非零)則程序拋出異常。1.3 用VC結(jié)合Excel實現(xiàn)復(fù)雜報表的制作關(guān)鍵詞:報表設(shè)計 摘 要: 介紹了在VC中結(jié)合Exc
26、el創(chuàng)建和打印格式比較復(fù)雜的報表的具體方法。關(guān)鍵詞: VC Excel 報表設(shè)計 在數(shù)據(jù)庫管理系統(tǒng)的開發(fā)以及一些涉及到報表制作的應(yīng)用領(lǐng)域,各種復(fù)雜格式的報表處理是一項煩瑣的工作。目前利用計算機(jī)輔助制作各種報表的方法基本都是在VB環(huán)境下操作的。事實上,VC作為另外一種功能強(qiáng)大的開發(fā)工具,在數(shù)據(jù)管理和操作方面同樣具有強(qiáng)大的功能,并提供了多種方式進(jìn)行報表處理。例如可以先創(chuàng)建一個指向打印機(jī)的設(shè)備環(huán)境句柄,通過該句柄調(diào)用相關(guān)的繪圖函數(shù),繪制空報表模版,并動態(tài)填入數(shù)據(jù),輸出到打印機(jī)上。用這種方法制作格式簡單的報表時很方便,但是當(dāng)碰到格式復(fù)雜的報表時,用Excel的電子表格
27、制作功能結(jié)合VC的強(qiáng)大數(shù)據(jù)處理能力,將大大簡化復(fù)雜表格的設(shè)計制作工作。1 實現(xiàn)方法1.1 利用Excel創(chuàng)建報表的模版文件Excel具有強(qiáng)大的電子表格制作功能,利用其單元格的拆分、合并和格式設(shè)定,可以方便、快捷地繪制空白表格文檔,并可以隨時根據(jù)實際情況,重新設(shè)定報表格式,生成滿足用戶要求的模版文件。例如,當(dāng)需要打印成百上千張格式一致的學(xué)生信息統(tǒng)計表時,若需要改變表格格式,只需要將模版文件稍加修改即可。生成的工作表中每個單元格都有相應(yīng)的編號,如“A9”和“G3”分別代表工作表中的A列第9行和G列第3行所對應(yīng)的單元格。像這樣記錄要填充內(nèi)容的單元格編號與要填充的數(shù)據(jù)字段是必要的。例如,設(shè)
28、計一個學(xué)生信息卡,其格式如圖1所示。工作表中需要填姓名、性別和民族數(shù)據(jù)的單元格對應(yīng)列為C列,年齡、籍貫和政治面貌對應(yīng)E列,入學(xué)時間、所在系別和專業(yè)對應(yīng)G列,其中行的編號為46,這樣就形成了一個模版文件。 在程序中不需要直接操作模版文件,只需要將模版文件拷貝到一個副本中進(jìn)行操作即可。在VC中進(jìn)行文件操作不如在VB中方便。一種方法是直接利用CFile 類的操作成員函數(shù)來實現(xiàn),但操作復(fù)雜。另一種有效的方法是利用Win32 API函數(shù)來實現(xiàn)對于文件的操作,例如要向第1列空白單元格填充學(xué)生姓名、性別和民族數(shù)據(jù),則具體實現(xiàn)代碼如下:int nOk;char strSrc =.student.xls0;/源
29、文件路徑,省略號代表文件所在的相對路徑char strDst =.studentbak.xls0;/目標(biāo)文件路徑char strTitle =File copying;/進(jìn)度題頭SHFILEOPSTRUCT FileOp;FileOp.hwnd=m_hWnd;FileOp.wFunc=FO_COPY;/執(zhí)行文件拷貝,將模版文件拷貝到臨時文件中FileOp.pFrom=strSrc;FileOp.pTo=strDst;FileOp.fFlags=FOF_ALLOWUNDO;FileOp.hNameMappings=NULL;FileOp.lpszProgressTitle=strTitle;nO
30、k=SHFileOperation(&FileOp);if(nOk)TRACE(There is an error:%dn,nOk);elseTRACE(SHFileOperation finished successfullyn);if(FileOp.fAnyOperationsAborted)TRACE(Operation was aborted!n);1.2 將數(shù)據(jù)放入模版文件副本相應(yīng)單元格中(1)在程序中導(dǎo)入mso9.dll、vbe6ext.olb和Excel9.olb庫文件。在需要調(diào)用Excel報表文檔的程序代碼所在的.Cpp文件頭,加入下面的代碼:#import
31、 <mso9.dll> no_namespace rename(Document-Properties,DocumentPropertiesXL)#import <vbe6ext.olb> no_namespace#import <Excel9.olb> rename(DialogBox,DialogBoxXL)rename(RGB,RBGXL) rename(DocumentProperties,DocumentPropertiesXL) no_dual_interfaces同時要在VC工具欄的工具菜單中點擊“選擇菜單”項,在彈出的選擇對話框中選擇目錄標(biāo)簽
32、,指定mso9.dll、vbe6ext.olb和Excel9.olb文件所在的目錄,否則程序?qū)幾g錯誤,提示找不到這些庫文件。默認(rèn)情況下mso9.dll和Excel9.olb文件在Office安裝目錄下,而vbe6ext.olb文件在系統(tǒng)文件夾的共享文件中的VBA目錄下。(2)聲明并建立對Excel應(yīng)用程序、工作簿和工作表對象變量的引用。using namespace Excel;_ApplicationPtr pXL;pXL->CreateInstance(LExcel.Application.9);/創(chuàng)建Excel應(yīng)用實例pXL->Visible=VARIANT_TRUE;_
33、WorkbooksPtr pBooks=pXL->Workbooks;_WorkbookPtr pBook=pBooks->Open(.studentbak.xls);/打開已創(chuàng)建的臨時模版文件_WorksheetPtr pSheet=pXL->ActiveSheet;/設(shè)定當(dāng)前/工作表pSheet->Name=student;/命名當(dāng)前工作表(3)將數(shù)據(jù)填入工作表相應(yīng)單元格。如果要操作的數(shù)據(jù)在學(xué)生信息數(shù)據(jù)庫的學(xué)生信息表中,則定義1個CRecordSet對象變量m_bSet,并用該變量操作數(shù)據(jù)庫中的數(shù)據(jù)(有關(guān)數(shù)據(jù)庫操作的細(xì)節(jié)見相關(guān)書籍)。給單元格賦值的具體代碼如下:m_
34、bSet.MoveFirst( );do CString row;char h 20;_itoa(k,h,10);/將整形變量轉(zhuǎn)換為字符變量row=h;CString nsc=C+4;/填充姓名的單元格編號CString ahd=C+5;/填充性別的單元格編號CString ymn=C+6;/填充民族的單元格編號/在將上述字符串變量作為單元格編號使用以前,需要進(jìn)/行強(qiáng)制類型轉(zhuǎn)化,否則將出錯_variant_t na,ma,ph;na=(_variant_t) (nsc);ma=(_variant_t) (ahd);ph=(_variant_t) (ymn);pSheet->Rangena
35、->Value=(_variant_t) (m_bSet.Stuname);/填充學(xué)生姓名數(shù)據(jù)pSheet->Rangema->Value=(_variant_t) (m_bSet.Stusex);/填充學(xué)生性別pSheet->Rangeph->Value=(_variant_t) (m_bSet.Stunation);/填充學(xué)生民族m_bSet.MoveNext( ); while(!m_bSet.IsEOF( );m_bSet.Close( );程序?qū)⒁恢眻?zhí)行,直到把數(shù)據(jù)庫中的數(shù)據(jù)讀取完畢。1.3 報表打印 試驗報表數(shù)據(jù)填寫完成后的打印工作可以用下面的語句直接實現(xiàn)。但注意在打印之前應(yīng)對Excel臨時文件執(zhí)行一次保存操作。pBook->Saved=VARIANT_TRUE;/保存文件pSheet->PrintOut( );/打印報表pBook->Close( );/關(guān)閉表單pXL->Quit( );/退出Excel由于打印工作是后臺操作,因此用戶看不到具體實現(xiàn)過程,只能看到報表從打印機(jī)中被打印出來。2 結(jié)束語報表制作和打印的方法多種多樣,本文介紹了用VC結(jié)合Excel實現(xiàn)復(fù)雜報表制作的具體方法,該方法能高效、
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 確定年度目標(biāo)的關(guān)鍵步驟計劃
- 養(yǎng)殖生產(chǎn)合同樣本
- 數(shù)字藝術(shù)在學(xué)校教育中的創(chuàng)新應(yīng)用計劃
- 公路代建合同標(biāo)準(zhǔn)文本
- 人瑞合同樣本
- 凍品進(jìn)口合同樣本
- 二建項目管理合同樣本
- 關(guān)于土建合同樣本
- 農(nóng)場餐具租賃合同樣本
- 俄羅斯再生能源合同樣本
- 辦公樓弱電系統(tǒng)設(shè)計方案
- 私募投資學(xué)試題及答案
- 2025屆山東省青島市高三下學(xué)期一模讀后續(xù)寫+替補隊員+講義
- 藥物臨床試驗科普
- 2025年合肥二模數(shù)學(xué)試題及答案
- 不要慌太陽下山有月光二部合唱簡譜
- DB37-T 4612-2023 化妝品生產(chǎn)企業(yè)批生產(chǎn)記錄常用管理規(guī)范
- 干凈整潔的個人衛(wèi)生習(xí)慣
- 光伏補貼申請流程
- 廚師操作安全培訓(xùn)
- 小數(shù)與單位換算(說課稿)-2023-2024學(xué)年四年級下冊數(shù)學(xué)人教版
評論
0/150
提交評論