|
Posted on 2012-12-29 16:00 盛勝 閱讀(294) 評(píng)論(0) 編輯 收藏 引用
轉(zhuǎn)載請(qǐng)注明出處:(鼓手)http://www.cnitblog.com/lifw/articles/vcpp_officeword.html
最近根據(jù)項(xiàng)目需要,需要我去用 vc++6.0 作一個(gè) ActiveX web 組件。自己從來(lái)沒(méi)有接觸過(guò)這方面的編程,這次是頭一遭!所以咱就做了,不過(guò)倒很出乎我的意料,比我想象的要快很多就完成了。現(xiàn)將 vc++6.0 操作 word 部分的關(guān)鍵代碼部分帖出來(lái),共享給大家。 因?yàn)槲以陂_(kāi)發(fā)的時(shí)候遇到了很多問(wèn)題,并且網(wǎng)上的資料很少,基本都是最基本的操作。所以帖出來(lái),希望能讓大家在開(kāi)發(fā)的過(guò)程少走些彎路! 工具: vc++6.0 。 關(guān)鍵字: c++ , MFC 。 要求:系統(tǒng)安裝 MS OFFICE 2000 。 過(guò)程: 準(zhǔn)備工作: 1. 創(chuàng)建一個(gè) MFC(EXE) 工程: MFC AppWizard ( exe ),工程為對(duì)話框形式(測(cè)試用)。 2. 在 CLASS VIEW 頁(yè)面創(chuàng)建一個(gè)類:類名為: CWordOffice ,類的類型為: Class type :Generic Class 。 3. 在工具欄中找到 view -> class wizard -> Automation -> add class -> from a tye library ,然后選中 offfice 安裝的目錄中的 MSWORD9.OLB ,然后選中所有列出的類名,點(diǎn) OK完成。 準(zhǔn)備工作完成,下面貼出相關(guān)部分的代碼: CWordOffice.h 中的手動(dòng)寫入的代碼如下(自動(dòng)生成的沒(méi)有加入): #include "atlbase.h"
#include "msword9.h"

class CWordOffice
{
private:
_Application m_wdApp;
Documents m_wdDocs;
_Document m_wdDoc;
Selection m_wdSel;
Range m_wdRange;
InlineShapes m_wdInlineShapes;
InlineShape m_wdInlineShape;

public:
CWordOffice();
virtual ~CWordOffice();

public:
//操作
//**********************創(chuàng)建新文檔*******************************************
BOOL CreateApp(); //創(chuàng)建一個(gè)新的WORD應(yīng)用程序
BOOL CreateDocuments(); //創(chuàng)建一個(gè)新的Word文檔集合
BOOL CreateDocument(); //創(chuàng)建一個(gè)新的Word文檔
BOOL Create(); //創(chuàng)建新的WORD應(yīng)用程序并創(chuàng)建一個(gè)新的文檔
void ShowApp(); //顯示W(wǎng)ORD文檔
void HideApp(); //隱藏word文檔

//**********************打開(kāi)文檔*********************************************
BOOL OpenDocument(CString fileName);//打開(kāi)已經(jīng)存在的文檔。
BOOL Open(CString fileName); //創(chuàng)建新的WORD應(yīng)用程序并打開(kāi)一個(gè)已經(jīng)存在的文檔。
BOOL SetActiveDocument(short i); //設(shè)置當(dāng)前激活的文檔。

//**********************保存文檔*********************************************
BOOL SaveDocument(); //文檔是以打開(kāi)形式,保存。
BOOL SaveDocumentAs(CString fileName);//文檔以創(chuàng)建形式,保存。
BOOL CloseDocument();
void CloseApp();

//**********************文本書寫操作*****************************************
void WriteText(CString szText); //當(dāng)前光標(biāo)處寫文本
void WriteNewLineText(CString szText, int nLineCount = 1); //換N行寫字
void WriteEndLine(CString szText); //文檔結(jié)尾處寫文本
void WholeStory(); //全選文檔內(nèi)容
void Copy(); //復(fù)制文本內(nèi)容到剪貼板
void InsertFile(CString fileName); //將本地的文件全部?jī)?nèi)容寫入到當(dāng)前文檔的光標(biāo)處。
//**********************圖片插入操作*****************************************
void InsertShapes(CString fileName);//在當(dāng)前光標(biāo)的位置插入圖片
//**********************超鏈接插入操作*****************************************
void InsertHyperlink(CString fileLink);//超級(jí)鏈接地址,可以是相對(duì)路徑。
}; CWordOffice.c中的手寫代碼如下: CWordOffice::CWordOffice()
{

}

CWordOffice::~CWordOffice()
{
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//m_wdDoc.Save();
m_wdApp.Quit(vFalse, // SaveChanges.
vTrue, // OriginalFormat.
vFalse // RouteDocument.
);
//釋放內(nèi)存申請(qǐng)資源
m_wdInlineShape.ReleaseDispatch();
m_wdInlineShapes.ReleaseDispatch();
//m_wdTb.ReleaseDispatch();
m_wdRange.ReleaseDispatch();
m_wdSel.ReleaseDispatch();
//m_wdFt.ReleaseDispatch();
m_wdDoc.ReleaseDispatch();
m_wdDocs.ReleaseDispatch();
m_wdApp.ReleaseDispatch();
}

//操作
BOOL CWordOffice::CreateApp()
{
if (FALSE == m_wdApp.CreateDispatch("Word.Application"))
{
AfxMessageBox("Application創(chuàng)建失敗,請(qǐng)確保安裝了word 2000或以上版本!", MB_OK|MB_ICONWARNING);
return FALSE;
}
return TRUE;
}

BOOL CWordOffice::CreateDocuments()
{
if (FALSE == CreateApp())
{
return FALSE;
}
m_wdDocs.AttachDispatch(m_wdApp.GetDocuments());
if (!m_wdDocs.m_lpDispatch)
{
AfxMessageBox("Documents創(chuàng)建失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
return TRUE;
}

BOOL CWordOffice::CreateDocument()
{
if (!m_wdDocs.m_lpDispatch)
{
AfxMessageBox("Documents為空!", MB_OK|MB_ICONWARNING);
return FALSE;
}

COleVariant varTrue(short(1),VT_BOOL),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CComVariant Template(_T("")); //沒(méi)有使用WORD的文檔模板
CComVariant NewTemplate(false),DocumentType(0),Visible;

m_wdDocs.Add(&Template,&NewTemplate,&DocumentType,&Visible);

//得到document變量
m_wdDoc = m_wdApp.GetActiveDocument();
if (!m_wdDoc.m_lpDispatch)
{
AfxMessageBox("Document獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//得到selection變量
m_wdSel = m_wdApp.GetSelection();
if (!m_wdSel.m_lpDispatch)
{
AfxMessageBox("Select獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//得到Range變量
m_wdRange = m_wdDoc.Range(vOptional,vOptional);
if(!m_wdRange.m_lpDispatch)
{
AfxMessageBox("Range獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}

return TRUE;
}

BOOL CWordOffice::Create()
{
if (FALSE == CreateDocuments())
{
return FALSE;
}
return CreateDocument();
}

void CWordOffice::ShowApp()
{
m_wdApp.SetVisible(TRUE);
}

void CWordOffice::HideApp()
{
m_wdApp.SetVisible(FALSE);
}

BOOL CWordOffice::OpenDocument(CString fileName)
{
if (!m_wdDocs.m_lpDispatch)
{
AfxMessageBox("Documents為空!", MB_OK|MB_ICONWARNING);
return FALSE;
}

COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
vZ((short)0);
COleVariant vFileName(_T(fileName));
//得到document變量
m_wdDoc.AttachDispatch(m_wdDocs.Open(
vFileName, // FileName
vTrue, // Confirm Conversion.
vFalse, // ReadOnly.
vFalse, // AddToRecentFiles.
vOptional, // PasswordDocument.
vOptional, // PasswordTemplate.
vOptional, // Revert.
vOptional, // WritePasswordDocument.
vOptional, // WritePasswordTemplate.
vOptional, // Format. // Last argument for Word 97
vOptional, // Encoding // New for Word 2000/2002
vOptional // Visible
/*如下4個(gè)是word2003需要的參數(shù)。本版本是word2000。
//vOptional, // OpenAndRepair
//vZ, // DocumentDirection wdDocumentDirection LeftToRight
//vOptional, // NoEncodingDialog
//vOptional
*/
) // Close Open parameters
); // Close AttachDispatch
if (!m_wdDoc.m_lpDispatch)
{
AfxMessageBox("Document獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//得到selection變量
m_wdSel = m_wdApp.GetSelection();
if (!m_wdSel.m_lpDispatch)
{
AfxMessageBox("Select獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//得到全部DOC的Range變量
m_wdRange = m_wdDoc.Range(vOptional,vOptional);
if(!m_wdRange.m_lpDispatch)
{
AfxMessageBox("Range獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
return TRUE;
}

BOOL CWordOffice::Open(CString fileName)
{
if (FALSE == CreateDocuments())
{
return FALSE;
}
return OpenDocument(fileName);
}

BOOL CWordOffice::SetActiveDocument(short i)
{
COleVariant vIndex(_T(i)),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

m_wdDoc.AttachDispatch(m_wdDocs.Item(vIndex));
m_wdDoc.Activate();
if (!m_wdDoc.m_lpDispatch)
{
AfxMessageBox("Document獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//得到selection變量
m_wdSel = m_wdApp.GetSelection();
if (!m_wdSel.m_lpDispatch)
{
AfxMessageBox("Select獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//得到全部DOC的Range變量
m_wdRange = m_wdDoc.Range(vOptional,vOptional);
if(!m_wdRange.m_lpDispatch)
{
AfxMessageBox("Range獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
HideApp();
return TRUE;
}

BOOL CWordOffice::SaveDocument()
{
if (!m_wdDoc.m_lpDispatch)
{
AfxMessageBox("Document獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
m_wdDoc.Save();
return TRUE;
}

BOOL CWordOffice::SaveDocumentAs(CString fileName)
{
if (!m_wdDoc.m_lpDispatch)
{
AfxMessageBox("Document獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant vFileName(_T(fileName));

m_wdDoc.SaveAs(
vFileName, //VARIANT* FileName
vOptional, //VARIANT* FileFormat
vOptional, //VARIANT* LockComments
vOptional, //VARIANT* Password
vOptional, //VARIANT* AddToRecentFiles
vOptional, //VARIANT* WritePassword
vOptional, //VARIANT* ReadOnlyRecommended
vOptional, //VARIANT* EmbedTrueTypeFonts
vOptional, //VARIANT* SaveNativePictureFormat
vOptional, //VARIANT* SaveFormsData
vOptional //VARIANT* SaveAsAOCELetter
);
return TRUE;
}

BOOL CWordOffice::CloseDocument()
{
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_wdDoc.Close(vFalse, // SaveChanges.
vTrue, // OriginalFormat.
vFalse // RouteDocument.
);
m_wdDoc.AttachDispatch(m_wdApp.GetActiveDocument());
if (!m_wdDoc.m_lpDispatch)
{
AfxMessageBox("Document獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//得到selection變量
m_wdSel = m_wdApp.GetSelection();
if (!m_wdSel.m_lpDispatch)
{
AfxMessageBox("Select獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
//得到全部DOC的Range變量
m_wdRange = m_wdDoc.Range(vOptional,vOptional);
if(!m_wdRange.m_lpDispatch)
{
AfxMessageBox("Range獲取失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
return TRUE;
}

void CWordOffice::CloseApp()
{
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_wdDoc.Save();
m_wdApp.Quit(vFalse, // SaveChanges.
vTrue, // OriginalFormat.
vFalse // RouteDocument.
);
//釋放內(nèi)存申請(qǐng)資源
m_wdInlineShape.ReleaseDispatch();
m_wdInlineShapes.ReleaseDispatch();
//m_wdTb.ReleaseDispatch();
m_wdRange.ReleaseDispatch();
m_wdSel.ReleaseDispatch();
//m_wdFt.ReleaseDispatch();
m_wdDoc.ReleaseDispatch();
m_wdDocs.ReleaseDispatch();
m_wdApp.ReleaseDispatch();
}

void CWordOffice::WriteText(CString szText)
{
m_wdSel.TypeText(szText);
}

void CWordOffice::WriteNewLineText(CString szText, int nLineCount /* = 1 */)
{
int i;
if (nLineCount <= 0)
{
nLineCount = 0;
}
for (i = 0; i < nLineCount; i++)
{
m_wdSel.TypeParagraph();
}
WriteText(szText);
}

void CWordOffice::WriteEndLine(CString szText)
{
m_wdRange.InsertAfter(szText);
}

void CWordOffice::WholeStory()
{
m_wdRange.WholeStory();
}

void CWordOffice::Copy()
{
m_wdRange.CopyAsPicture();
}

void CWordOffice::InsertFile(CString fileName)
{
COleVariant vFileName(fileName),
vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
vNull(_T(""));
/*
void InsertFile(LPCTSTR FileName, VARIANT* Range, VARIANT* ConfirmConversions, VARIANT* Link, VARIANT* Attachment);
*/
m_wdSel.InsertFile(
fileName,
vNull,
vFalse,
vFalse,
vFalse
);
}

void CWordOffice::InsertShapes(CString fileName)
{
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_wdInlineShapes=m_wdSel.GetInlineShapes();
m_wdInlineShape=m_wdInlineShapes.AddPicture(fileName,vFalse,vTrue,vOptional);
}

void CWordOffice::InsertHyperlink(CString fileLink)
{
COleVariant vAddress(_T(fileLink)),vSubAddress(_T(""));
Range aRange = m_wdSel.GetRange();
Hyperlinks vHyperlinks(aRange.GetHyperlinks());

vHyperlinks.Add(
aRange, //Object,必需。轉(zhuǎn)換為超鏈接的文本或圖形。
vAddress, //Variant 類型,可選。指定的鏈接的地址。此地址可以是電子郵件地址、Internet 地址或文件名。請(qǐng)注意,Microsoft Word 不檢查該地址的正確性。
vSubAddress, //Variant 類型,可選。目標(biāo)文件內(nèi)的位置名,如書簽、已命名的區(qū)域或幻燈片編號(hào)。
vAddress, //Variant 類型,可選。當(dāng)鼠標(biāo)指針?lè)旁谥付ǖ某溄由蠒r(shí)顯示的可用作“屏幕提示”的文本。默認(rèn)值為 Address。
vAddress, //Variant 類型,可選。指定的超鏈接的顯示文本。此參數(shù)的值將取代由 Anchor 指定的文本或圖形。
vSubAddress //Variant 類型,可選。要在其中打開(kāi)指定的超鏈接的框架或窗口的名字。
);
vHyperlinks.ReleaseDispatch();
} 上邊的代碼是主要的核心代碼,有些代碼沒(méi)有進(jìn)行優(yōu)化,請(qǐng)各位批判的看!
測(cè)試部分代碼如下:
需要在對(duì)話框中添加一個(gè)按鈕,按鈕的事件方法內(nèi)添加如下代碼: COfficeProjectDlg::OnButton1()

{

AfxEnableControlContainer();

AfxOleInit();

CWordOffice wd;

wd.CreateDocuments();

wd.OpenDocument("d:\\a.doc");

wd.ShowApp(); //顯示word

}
|