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

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

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

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

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

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