《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 设计应用 > 用VC结合Excel实现复杂报表的制作
用VC结合Excel实现复杂报表的制作
陈清华 潘地林
淮南安徽理工大学机械工程系(232001)
摘要: 介绍了在VC中结合Excel创建和打印格式比较复杂的报表的具体方法。
關(guān)鍵詞: 报表设计
Abstract:
Key words :

摘   要: 介紹了在VC中結(jié)合Excel創(chuàng)建和打印格式比較復(fù)雜的報(bào)表的具體方法。
關(guān)鍵詞: VC  Excel  報(bào)表設(shè)計(jì)

   在數(shù)據(jù)庫管理系統(tǒng)的開發(fā)以及一些涉及到報(bào)表制作的應(yīng)用領(lǐng)域,各種復(fù)雜格式的報(bào)表處理是一項(xiàng)煩瑣的工作。目前利用計(jì)算機(jī)輔助制作各種報(bào)表的方法基本都是在VB環(huán)境下操作的。事實(shí)上,VC作為另外一種功能強(qiáng)大的開發(fā)工具,在數(shù)據(jù)管理和操作方面同樣具有強(qiáng)大的功能,并提供了多種方式進(jìn)行報(bào)表處理。例如可以先創(chuàng)建一個(gè)指向打印機(jī)的設(shè)備環(huán)境句柄,通過該句柄調(diào)用相關(guān)的繪圖函數(shù),繪制空報(bào)表模版,并動態(tài)填入數(shù)據(jù),輸出到打印機(jī)上。用這種方法制作格式簡單的報(bào)表時(shí)很方便,但是當(dāng)碰到格式復(fù)雜的報(bào)表時(shí),用Excel的電子表格制作功能結(jié)合VC的強(qiáng)大數(shù)據(jù)處理能力,將大大簡化復(fù)雜表格的設(shè)計(jì)制作工作。
1  實(shí)現(xiàn)方法
1.1 利用Excel創(chuàng)建報(bào)表的模版文件

  Excel具有強(qiáng)大的電子表格制作功能,利用其單元格的拆分、合并和格式設(shè)定,可以方便、快捷地繪制空白表格文檔,并可以隨時(shí)根據(jù)實(shí)際情況,重新設(shè)定報(bào)表格式,生成滿足用戶要求的模版文件。例如,當(dāng)需要打印成百上千張格式一致的學(xué)生信息統(tǒng)計(jì)表時(shí),若需要改變表格格式,只需要將模版文件稍加修改即可。
生成的工作表中每個(gè)單元格都有相應(yīng)的編號,如“A9”和“G3”分別代表工作表中的A列第9行和G列第3行所對應(yīng)的單元格。像這樣記錄要填充內(nèi)容的單元格編號與要填充的數(shù)據(jù)字段是必要的。例如,設(shè)計(jì)一個(gè)學(xué)生信息卡,其格式如圖1所示。

  工作表中需要填姓名、性別和民族數(shù)據(jù)的單元格對應(yīng)列為C列,年齡、籍貫和政治面貌對應(yīng)E列,入學(xué)時(shí)間、所在系別和專業(yè)對應(yīng)G列,其中行的編號為4~6,這樣就形成了一個(gè)模版文件。
  在程序中不需要直接操作模版文件,只需要將模版文件拷貝到一個(gè)副本中進(jìn)行操作即可。在VC中進(jìn)行文件操作不如在VB中方便。一種方法是直接利用CFile 類的操作成員函數(shù)來實(shí)現(xiàn),但操作復(fù)雜。另一種有效的方法是利用Win32 API函數(shù)來實(shí)現(xiàn)對于文件的操作,例如要向第1列空白單元格填充學(xué)生姓名、性別和民族數(shù)據(jù),則具體實(shí)現(xiàn)代碼如下:
  int nOk;
  char strSrc[ ]=″...\\student.xls\0″; //源文件路徑,省略號代表文件所在的相對路徑
  char strDst[ ]=″...\\studentbak.xls\0″; //目標(biāo)文件路徑
  char strTitle[ ]=″File copying″; //進(jìn)度題頭
  SHFILEOPSTRUCT FileOp;
  FileOp.hwnd=m_hWnd;
  FileOp.wFunc=FO_COPY;  //執(zhí)行文件拷貝,將模版文件拷貝到臨時(shí)文件中
  FileOp.pFrom=strSrc;
  FileOp.pTo=strDst;
  FileOp.fFlags=FOF_ALLOWUNDO;
  FileOp.hNameMappings=NULL;
  FileOp.lpszProgressTitle=strTitle;
  nOk=SHFileOperation(&FileOp);
  if(nOk)
  TRACE(″There is an error:%d\n″,nOk);
  else
  TRACE(″SHFileOperation finished successfully\n″);
  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報(bào)表文檔的程序代碼所在的.Cpp文件頭,加入下面的代碼:
  #import <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
  同時(shí)要在VC工具欄的工具菜單中點(diǎn)擊“選擇菜單”項(xiàng),在彈出的選擇對話框中選擇目錄標(biāo)簽,指定mso9.dll、vbe6ext.olb和Excel9.olb文件所在的目錄,否則程序?qū)幾g錯(cuò)誤,提示找不到這些庫文件。默認(rèn)情況下mso9.dll和Excel9.olb文件在Office安裝目錄下,而vbe6ext.olb文件在系統(tǒng)文件夾的共享文件中的VBA目錄下。
  (2)聲明并建立對Excel應(yīng)用程序、工作簿和工作表對象變量的引用。
  using namespace Excel;
  _ApplicationPtr pXL;
  pXL->CreateInstance(L″Excel.Application.9″);
                 //創(chuàng)建Excel應(yīng)用實(shí)例
  pXL->Visible=VARIANT_TRUE;
  _WorkbooksPtr pBooks=pXL->Workbooks;
  _WorkbookPtr pBook=pBooks->Open(″..\\studentbak.xls″);
                 //打開已創(chuàng)建的臨時(shí)模版文件
  _WorksheetPtr pSheet=pXL->ActiveSheet;//設(shè)定當(dāng)前
                 //工作表
  pSheet->Name=″student″;//命名當(dāng)前工作表
  (3)將數(shù)據(jù)填入工作表相應(yīng)單元格。
  如果要操作的數(shù)據(jù)在學(xué)生信息數(shù)據(jù)庫的學(xué)生信息表中,則定義1個(gè)CRecordSet對象變量m_bSet,并用該變量操作數(shù)據(jù)庫中的數(shù)據(jù)(有關(guān)數(shù)據(jù)庫操作的細(xì)節(jié)見相關(guān)書籍)。給單元格賦值的具體代碼如下:
  m_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)化,否則將出錯(cuò)
  _variant_t na,ma,ph;
  na=(_variant_t) (nsc);
  ma=(_variant_t) (ahd);
  ph=(_variant_t) (ymn);
  pSheet->Range[na]->Value=(_variant_t) (m_bSet.Stuname);
               //填充學(xué)生姓名數(shù)據(jù)
  pSheet->Range[ma]->Value=(_variant_t) (m_bSet.Stusex);
               //填充學(xué)生性別
  pSheet->Range[ph]->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  報(bào)表打印
   試驗(yàn)報(bào)表數(shù)據(jù)填寫完成后的打印工作可以用下面的語句直接實(shí)現(xiàn)。但注意在打印之前應(yīng)對Excel臨時(shí)文件執(zhí)行一次保存操作。
  pBook->Saved=VARIANT_TRUE;//保存文件
  pSheet->PrintOut( );//打印報(bào)表
  pBook->Close( );//關(guān)閉表單
  pXL->Quit( );//退出Excel
  由于打印工作是后臺操作,因此用戶看不到具體實(shí)現(xiàn)過程,只能看到報(bào)表從打印機(jī)中被打印出來。
2  結(jié)束語
  報(bào)表制作和打印的方法多種多樣,本文介紹了用VC結(jié)合Excel實(shí)現(xiàn)復(fù)雜報(bào)表制作的具體方法,該方法能高效、快捷地解決實(shí)際問題。
參考文獻(xiàn)
1   徐雄.在VB中調(diào)用Excel實(shí)現(xiàn)票據(jù)套打.計(jì)算機(jī)應(yīng)用, 2001;(9)
2   北京源江科技開發(fā)公司制作.Visual C++編程資源大全(光 盤版).北京:北京萬水電子信息有限公司出版社,2001
3   官章全,唐小衛(wèi).Visual C++ 6.0編程實(shí)例詳解.北京:電子工業(yè)出版社,2001
 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。

相關(guān)內(nèi)容