用VC對(duì)Office進(jìn)行操作的介紹已經(jīng)不少了,但是從來(lái)沒(méi)有把word,office/9.shtml' target='_blank' class='article'>excel,powerPoint進(jìn)進(jìn)全面的介紹的。
用例子來(lái)說(shuō)明吧,首先創(chuàng)建一個(gè)MFC AppWizard(EXE)工程,然后通過(guò)在VIEW菜單中,選ClassWizard,
選Automation選項(xiàng)卡,選Add Class,選擇From a TypeLibrary, 選中Microsoft Office 2000 類型庫(kù):Excel9.olb,MSPPT9.OLB,MSWORD9.OLB(在Microsoft Office\Office目錄下) 會(huì)將類型庫(kù)中的所有類添加到你的工程中。
然后寫(xiě)一個(gè)類來(lái)操作Office吧!
ObtGuiGcomOfficePrinter.h
#if !defined(AFX_OBTGUIGCOMOFFICEPRINTER_H__03A0C2D8_DFC8_4B51_8ADB_994B86BACB82__INCLUDED_)
#define AFX_OBTGUIGCOMOFFICEPRINTER_H__03A0C2D8_DFC8_4B51_8ADB_994B86BACB82__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "comdef.h"
#include "ObtGuiGcomMsWord9.h"
#include "ObtGuiGcomMsPpt9.h"
#include "ObtGuiGcomExcel9.h"
class AFX_EXT_CLASS ObtGuiGcomOfficePrinter
{
public:
ObtGuiGcomOfficePrinter();
virtual ~ObtGuiGcomOfficePrinter();
//Operator
public:
BOOL WordPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter);
BOOL ExcelPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter);
BOOL PowerPointPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter);
};
#include "stdafx.h"
#include "ObtGuiGcomOfficePrinter.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ObtGuiGcomOfficePrinter::ObtGuiGcomOfficePrinter()
{
}
ObtGuiGcomOfficePrinter::~ObtGuiGcomOfficePrinter()
{
}
BOOL ObtGuiGcomOfficePrinter::PowerPointPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter)
{
_PptApplication m_powerpointApp;
Presentations m_powerpointPres;
_Presentation m_powerpointPre;
m_powerpointPres.ReleaseDispatch();
m_powerpointPre.ReleaseDispatch();
if(!m_powerpointApp.CreateDispatch("PowerPoint.Application"))
{
AfxMessageBox("創(chuàng)建PowerPoint服務(wù)失敗!");
return FALSE;
}
m_powerpointApp.m_bAutoRelease=true;
m_powerpointApp.SetVisible(TRUE);//對(duì)于PowerPoint必須設(shè)置為TRUE
m_powerpointPres.AttachDispatch(m_powerpointApp.GetPresentations());
m_powerpointPres.Open(lpszFileName,-1,-1,-1);
m_powerpointPre.AttachDispatch(m_powerpointApp.GetActivePresentation(),TRUE);
m_powerpointPre.PrintOut(-1,-1,"",long(1),-1);
m_powerpointApp.Quit();
m_powerpointPre.ReleaseDispatch();
m_powerpointPres.ReleaseDispatch();
m_powerpointApp.ReleaseDispatch();
return TRUE;
}
BOOL ObtGuiGcomOfficePrinter::ExcelPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter)
{
_ExcelApplication m_excelApp;//定義Excel提供的應(yīng)用程序?qū)ο?
Workbooks m_excelBooks;
_Workbook m_excelBook;
m_excelBooks.ReleaseDispatch();
m_excelBook.ReleaseDispatch();
m_excelApp.m_bAutoRelease=true;
//創(chuàng)建Excel 2000服務(wù)器(啟動(dòng)Excel)
if (!m_excelApp.CreateDispatch("Excel.Application"))
{
AfxMessageBox("創(chuàng)建Excel服務(wù)失敗!");
return FALSE;
}
m_excelApp.SetVisible(FALSE); //設(shè)置為隱藏
//利用模板文件建立新文檔
m_excelBooks.AttachDispatch(m_excelApp.GetWorkbooks(),true);
m_excelBook.AttachDispatch(m_excelBooks.Add(_variant_t(lpszFileName)));
//m_excelApp.SetActivePrinter(lpszActivePrinter); //設(shè)置當(dāng)前打印機(jī)
COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);//定義打印機(jī)并打印
m_excelBook.PrintOut(covOptional,covOptional,COleVariant(long(1)),covFalse,covOptional,covOptional,covOptional,covOptional);
m_excelApp.Quit();//退出
m_excelBook.ReleaseDispatch();
m_excelBooks.ReleaseDispatch();
m_excelApp.ReleaseDispatch();
return TRUE;
}
BOOL ObtGuiGcomOfficePrinter::WordPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter)
{
_WordApplication m_wordApp;//定義Word提供的應(yīng)用程序?qū)ο?
Documents m_wordDocs;//定義Word提供的文檔對(duì)象
_Document m_wordDoc; //當(dāng)前的的文檔對(duì)象
m_wordDocs.ReleaseDispatch();
m_wordDoc.ReleaseDispatch();
m_wordApp.m_bAutoRelease=true;
if(!m_wordApp.CreateDispatch("Word.Application")) //創(chuàng)建Word應(yīng)用服務(wù)
{
AfxMessageBox("創(chuàng)建Word應(yīng)用服務(wù)失敗!");
return FALSE;
}
m_wordApp.SetVisible(FALSE); //設(shè)置為隱藏
//下面是打開(kāi)文件定義VARIANT變量;
COleVariant varFilePath(lpszFileName);
COleVariant varstrNull("");
COleVariant varZero((short)0);
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);
m_wordDocs.AttachDispatch(m_wordApp.GetDocuments());//將Documents類對(duì)象m_Docs和Idispatch接口關(guān)聯(lián)起來(lái);
m_wordDocs.Open(varFilePath,varFalse,varFalse,varFalse,varstrNull,varstrNull,
varFalse,varstrNull,varstrNull,varTrue,varTrue,varTrue);
m_wordDoc.AttachDispatch(m_wordApp.GetActiveDocument()); //得到當(dāng)前激活的Document對(duì)象
m_wordApp.SetActivePrinter(lpszActivePrinter); //設(shè)置當(dāng)前打印機(jī)
COleVariant covTrue((short)TRUE), covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //定義打印屬性
m_wordDoc.PrintOut(covFalse,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
COleVariant((long)1),
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional);
m_wordApp.Quit(covOptional,covOptional,covOptional);//退出
m_wordDoc.ReleaseDispatch(); //斷開(kāi)關(guān)聯(lián);
m_wordDocs.ReleaseDispatch();
m_wordApp.ReleaseDispatch();
return TRUE;
}
以上是用Office打開(kāi)相應(yīng)的文檔進(jìn)行打印的操作,如果你需要進(jìn)行相應(yīng)的其他操作,
你可以用Office里面的宏進(jìn)行錄制然后轉(zhuǎn)化為相應(yīng)的代碼。
例2:
給企業(yè)開(kāi)發(fā)的項(xiàng)目中,客戶經(jīng)常要求將數(shù)據(jù)匯總顯示并打印。站在程序員的立場(chǎng)上,簡(jiǎn)單數(shù)據(jù)的匯總打印可以采用VB自帶報(bào)表,對(duì)復(fù)雜的數(shù)據(jù)用水晶報(bào)表或第三方打印控件。在企業(yè)中,匯總數(shù)據(jù)另一個(gè)目的是為了便于交流和共享資源,報(bào)表的格式通常固定,內(nèi)容可以自己調(diào)整,他們對(duì) Excel 和 Word 情有獨(dú)鐘。
剛完成的項(xiàng)目中,客戶要求將匯總的數(shù)據(jù)以三種方式進(jìn)行顯示和打印:AutoCad、Excel 和 Word 文檔中。前兩種方式網(wǎng)上資源很多,對(duì) Word 文檔我找到例子不是很多。由于需要和 AutoCad 開(kāi)發(fā)程序結(jié)合,不能將 Word 文檔以 OLE 的方式 嵌入到程序中,文檔只能在內(nèi)存中形成,這將占用大量的CPU資源,另開(kāi)一個(gè)線程進(jìn)行處理,線程間以發(fā)送消息的方式進(jìn)行通信。
首先在VC引入Word, 對(duì)格式相同的地方一定使用模版的方式進(jìn)行處理,這可以大大的提高運(yùn)行速度,Word中的模版為*.dot。加載模版的代碼為:
sDocs=sApp.GetDocuments();
sDocs.AttachDispatch(sApp.GetDocuments(),true);
COleVariant vFalse((long)0),vTrue((long)1);
sDoc.AttachDispatch(sDocs.Add(COleVariant(_variant_t(strFileName)), vFalse,vFalse, vTrue));
需要注意的是,如果Word中使用到表格,VBA錄制的全是Selection對(duì)象的處理方法,在VC中使用Selection對(duì)象的MoveUp和MoveDown函數(shù)時(shí)會(huì)出現(xiàn)不確定現(xiàn)象(如果你知道為什么的話請(qǐng)告訴我)。如果你需要繪制表格,不要用程序來(lái)動(dòng)態(tài)形成,繪制表格的代碼是很繁瑣的,而且在頁(yè)眉中繪制單元格是很難控制的?梢韵仍谀0嬷欣L出你要的表格格式,然后用程序復(fù)制單元格或者直接使用模版中的單元格。由于我做的項(xiàng)目表格的行數(shù)不確定,我采用的是復(fù)制單元格的方式(速度比較慢,誰(shuí)有更好的方法?)。
剩下的處理流程,就是你想做什么操作,先在Word中錄制一段宏,然后查看其VBA代碼,并將其轉(zhuǎn)化到Vc程序中。這就看你Word使用的熟練程度了,例如如何把不同頁(yè)的頁(yè)眉頁(yè)腳設(shè)置不同,如何得到當(dāng)前頁(yè)的頁(yè)數(shù)以及總的文檔的頁(yè)數(shù),具體可以參考程序。
VC中也可以像Excel中調(diào)用模版中存在的宏,代碼如下:
VARIANT vtMissing ;vtMissing.vt =VT_ERROR;
vtMissing.scode =DISP_E_PARAMNOTFOUND;
sApp.Run("AddCell",&vtMissing,&vtMissing,&vtMissing,
&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing);
例3:
#include
#include
#pragma warning (disable:4146 4192 4786 4081)
#define USE_OFFICEXP 1
#ifdef USE_OFFICEXP
#import "C:\Program Files\Common Files\Microsoft Shared\Office10\MSO.DLL"
#import "c:\\Program Files\\Common Files\Microsoft Shared\\VBA\VBA6\VBE6EXT.olb"
#import "c:\Program Files\Microsoft Office\Office10\MSWORD.olb" rename("ExitWindows","ExitWindowsEx")
#import "c:\Program Files\Microsoft Office\Office10\office/9.shtml' target='_blank' class='article'>excel.exe" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") \
rename("DocumentProperties", "DocumentPropertiesXL") exclude("IFont","IPicture")
#else
#import "c:\Program Files\Microsoft Office\Office\MSO9.dll"
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" no_namespace
#import "c:\Program Files\Microsoft Office\Office\MSWORD9.OLB" rename("ExitWindows","_ExitWindows")
#import "c:\Program Files\Microsoft Office\Office\excel9.olb" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") \
rename("DocumentProperties", "DocumentPropertiesXL") exclude("IFont","IPicture")
#endif
int main(int argc, char* argv[])
{
::CoInitialize(NULL);
CLSID clsid;
#if 1
CLSIDFromProgID(L"Word.Application", &clsid);
Word::_ApplicationPtr pApp;
//pApp.GetActiveObject (clsid);
pApp.CreateInstance (clsid,NULL);
pApp ->PutVisible (VARIANT_TRUE);
_variant_t bstrFileName = "C:\\Project\\Îĵµ\\ftp•þÎñÉè¼Æ.doc";
pApp ->GetDocuments() ->Open (&bstrFileName);
//pApp ->GetDocuments() ->Add();
Word::_DocumentPtr pWordDocument =pApp-> GetActiveDocument();
Word::SelectionPtr pSelection = pApp ->GetSelection();
Word::ParagraphsPtr pParagraphs = pWordDocument->GetParagraphs ();
long lParaCnt = pParagraphs ->GetCount ();
Word::ParagraphPtr pTemp;
Word::RangePtr pRange;
for (long iLoop =1;iLoop
pTemp = pParagraphs->Item (iLoop);
pRange = pTemp ->GetRange ();
printf("%s\n",(char*)pRange ->GetText());
printf("%s\n",(char*)(_bstr_t)pTemp->GetStyle ());
}
//pApp ->GetDocuments() ->Close ();
pApp ->Quit ();
#endif
#if 0
_variant_t varItem((long)1);
CLSIDFromProgID(L"Excel.Application", &clsid);
Excel::_ApplicationPtr pApp;
pApp .CreateInstance (clsid,NULL);
pApp ->PutVisible (0,VARIANT_TRUE);
Excel::_WorkbookPtr pWorkbook = pApp ->GetWorkbooks () ->Add ();
Excel::_WorksheetPtr pSheet = pWorkbook ->GetWorksheets () ->GetItem (varItem);
Excel::RangePtr pRange = pSheet ->GetUsedRange(0);
int iColCnt = pRange ->GetColumns() ->GetCount();
printf("used columns is %d\n",iColCnt);
int iRowCnt = pRange ->GetRows() ->GetCount();
printf("used rows is %d\n",iRowCnt);
pRange = pSheet ->GetRange(OLESTR("A1"));
pRange ->Value2 = OLESTR("zheng017");
pSheet ->GetRows ()-
Excel::InteriorPtr pInterior= pRange ->GetInterior ();
varItem.intVal = 0xff0000;
pInterior ->PutColor (varItem);
pSheet ->PrintPreview ();
#endif
::CoUninitialize();
return 0;
}
