工具: vc++6.0 。
關鍵字: c++ , MFC 。
要求:系統安裝 MS OFFICE 2003 。
過程:
準備工作:
1. 建立一個 MFC(EXE) 工程: MFC AppWizard ( exe ),工程為對話方塊形式(測試用)。
2. 在 CLASS VIEW 頁面建立一個類:類名為: CWordOffice ,類的類型為: Class type : Generic Class 。
3. 在工具列中找到 view -> class wizard -> Automation -> add class -> from a tye library ,然後選中 offfice 安裝的目錄中的 MSWORD.OLB ,然後選中所有列出的類名,點 OK 完成。
4. 最後,這裡給出一個操作word的最簡單的程式源碼wordApp.rar(XP + VC6 + Word2010)
準備工作完成,下面貼出相關部分的代碼:
CWordOffice.h 中的手動寫入的代碼如下(自動產生的沒有加入): #include "atlbase.h"#include "msword.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: //操作 //**********************建立新文檔******************************************* BOOL CreateApp(); //建立一個新的WORD應用程式 BOOL CreateDocuments(); //建立一個新的Word文檔集合 BOOL CreateDocument(); //建立一個新的Word文檔 BOOL Create(); //建立新的WORD應用程式並建立一個新的文檔 void ShowApp(); //顯示WORD文檔 void HideApp(); //隱藏word文檔 //**********************開啟文檔********************************************* BOOL OpenDocument(CString fileName);//開啟已經存在的文檔。 BOOL Open(CString fileName); //建立新的WORD應用程式並開啟一個已經存在的文檔。 BOOL SetActiveDocument(short i); //設定當前啟用的文檔。 //**********************儲存文檔********************************************* BOOL SaveDocument(); //文檔是以開啟形式,儲存。 BOOL SaveDocumentAs(CString fileName);//文檔以建立形式,儲存。 BOOL CloseDocument(); void CloseApp(); //**********************文本書寫操作***************************************** void WriteText(CString szText); //當前游標處寫文本 void WriteNewLineText(CString szText, int nLineCount = 1); //換N行寫字 void WriteEndLine(CString szText); //文檔結尾處寫文本 void WholeStory(); //全選文檔內容 void Copy(); //複製常值內容到剪貼簿 void InsertFile(CString fileName); //將本地的檔案全部內容寫入到當前文檔的游標處。 //**********************圖片插入操作***************************************** void InsertShapes(CString fileName);//在當前游標的位置插入圖片 //**********************超連結插入操作***************************************** void InsertHyperlink(CString fileLink);//超級連結地址,可以是相對路徑。};CWordOffice.cpp中的手寫代碼如下: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. ); //釋放記憶體申請資源 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建立失敗,請確保安裝了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建立失敗!", 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("")); //沒有使用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個是word2003需要的參數。本版本是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 vOptional, vOptional, vOptional, vOptional, vOptional ); 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. ); //釋放記憶體申請資源 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,必需。轉換為超連結的文本或圖形。 vAddress, //Variant 類型,可選。指定的連結的地址。此地址可以是電子郵件地址、網際網路位址或檔案名稱。請注意,Microsoft Word 不檢查該地址的正確性。 vSubAddress, //Variant 類型,可選。目標檔案內的位置名,如書籤、已命名的地區或投影片編號。 vAddress, //Variant 類型,可選。當滑鼠指標放在指定的超連結上時顯示的可用作“工具提示”的文本。預設值為 Address。 vAddress, //Variant 類型,可選。指定的超連結的顯示文本。此參數的值將取代由 Anchor 指定的文本或圖形。 vSubAddress //Variant 類型,可選。要在其中開啟指定的超連結的架構或視窗的名字。 ); vHyperlinks.ReleaseDispatch();}測試部分代碼如下:需要在對話方塊中添加一個按鈕,按鈕的事件方法內添加如下代碼:void CWordOperateDlg::OnButtonWord() { AfxEnableControlContainer(); AfxOleInit(); CWordOffice wd; wd.CreateDocuments(); wd.OpenDocument("d:\\a.doc"); wd.ShowApp(); //顯示word}