小魚兒C++處女作(vc word 操作封裝)
本人先聲明這個程序是參考了 汪自軍
封裝類 來寫的。
如果程序對你有所幫助,我將感到很榮幸。。
期末到了 希望大家都不要掛科哦,反正我只有英語考了,貌似及格沒有壓力啊。。。。
程序代碼:
#ifndef CMYWORD_H
#define CMYWORD_H
#include "msword.h"
#include <ATLBASE.H>
//段落對齊的屬性
enum Alignment{wdAlignParagraphCenter=1,wdAlignParagraphRight,wdAlignParagraphJustify};
//保存Word類型
/*
wdFormatDocument 標准的doc文檔
wdFormatWebArchiv 單個文件網頁
wdFormatHTML 網頁
wdFormatFilteredHTML 去掉一些微軟信息的網頁
wdFormatTemplate 模版
*/
enum SaveType{
wdFormatDocument=0,
wdFormatWebArchive=9,
wdFormatHTML=8,
wdFormatFilteredHTML=10,
wdFormatTemplate=1
};
class CmyWord
{
//一些對象申明
public:
_Application app;//創建word
Documents docs;//word文檔集合
_Document doc;//一個word文件
_Font font;//字體對象
Selection sel;//選擇編輯對象 沒有對象的時候就是插入點
Table tab;//表格對象
Range range;
public:
CmyWord();//構造函數
virtual ~CmyWord();//析構函數
void ShowApp(BOOL flag);
void AppClose();
BOOL InitCOM();//對COM進行初始化
BOOL CreateAPP();//創建一個word程序
BOOL CreateDocument();//創建word文檔
BOOL Create();//創建一個word程序和Word文檔
BOOL Open(CString FileName,BOOL ReadOnly = FALSE,BOOL AddToRecentFiles = FALSE);//打開一個word文檔;
BOOL Close(BOOL SaveChange=FALSE);//關閉一個word文檔
BOOL Save();//保存文檔
BOOL SaveAs(CString FileName,int SaveType=0);//保存類型
//////////////////////////文件寫操作操作/////////////////////////////////////////////
void WriteText(CString Text);//寫入文本
void NewLine(int nCount=1);//回車換N行
void WriteTextNewLineText(CString Text,int nCount=1);//回測換N行寫入文字
//////////////////////////////////////////////////////////////////////////
//////////////////////////字體設置////////////////////////////////////////
void SetFont(CString FontName,int FontSize=9,long FontColor=0,long FontBackColor=0);
void SetFont(BOOL Blod,BOOL Italic=FALSE,BOOL UnderLine=FALSE);
void SetTableFont(int Row,int Column,CString FontName,int FontSize=9,long FontColor=0,long FontBackColor=0);
//void SetTableFont();//統一對表格的文字做出處理.
/////////////////////////表格操作/////////////////////////////////////
void CreateTable(int Row,int Column);
void WriteCellText(int Row,int Column,CString Text);
/////////////////////////////設置對齊屬性///////////////////////////////////////
void SetParaphformat(int Alignment);
/////////////////////////////一些常用操作///////////////////////////////////////
//查找字符串 然后全部替換
void FindWord(CString FindW,CString RelWord);
//獲取Word 純文本內容
void GetWordText(CString &Text);
//Word 打印
void PrintWord();
};
#endif
程序代碼:
#include "StdAfx.h"
#include "CmyWord.h"
//聲明 vOpt 最好用這下面這個 因為我自己喜歡用 CComVariant vOpt;出寫 可能在一些特殊環境會出現錯誤
//COleVariant vOpt(( long )DISP_E_PARAMNOTFOUND, VT_ERROR);
//---------------------------------------------------------------------------------------------------------
// 小魚兒 Word 封裝類初步完成 2012 1,4 2:04
//
//1 我只學習封裝了一些Word中比較使用的東西,后續還會繼續改進,看哪些需要的東西要進來。來方便我們的工作學習
//2 這個我第一次用c++ 來寫程序, 也是我c++入門的程序吧。有什么指點請加我QQ879801208 無聊勿加
//3 程序代碼可能沒有全部測試 如果有問題 謝謝指正。
//4 如果有高手想指點我一下 我是非常高興的。。。。
//---------------------------------------------------------------------------------------------------------
CmyWord::CmyWord()
{
InitCOM();
}
CmyWord::~CmyWord()
{
//釋放資源最好從 小到大的順序來釋放。這個和c里面一些釋放資源的道理是一樣的
//和c+= 先析構兒子 再析構父親是一樣的。
CoUninitialize();
font.ReleaseDispatch();
range.ReleaseDispatch();
tab.ReleaseDispatch();
doc.ReleaseDispatch();
docs.ReleaseDispatch();
app.ReleaseDispatch();
sel.ReleaseDispatch();
}
BOOL CmyWord::InitCOM()
{
if(CoInitialize(NULL)!=S_OK)
{
AfxMessageBox("初始化com庫失敗");
return 0;
}
else
{
return TRUE;
}
}
BOOL CmyWord::CreateAPP()
{
if(!app.CreateDispatch("Word.Application"))
{
AfxMessageBox("你沒有安裝OFFICE");
return FALSE;
}
else
{
app.SetVisible(TRUE);
return TRUE;
}
}
//我的類默認是打開的,而Word 中默認看不見的。
void CmyWord::ShowApp(BOOL flag)
{
if(!app.m_lpDispatch)
{
AfxMessageBox("你還沒有獲得Word對象");
return;
}
else
{
app.SetVisible(flag);
}
}
BOOL CmyWord::CreateDocument()
{
if(!app.m_lpDispatch)
{
AfxMessageBox("Application為空,Documents創建失敗!", MB_OK|MB_ICONWARNING);
return FALSE;
}
else
{
docs=app.GetDocuments();
if(docs.m_lpDispatch==NULL)
{
AfxMessageBox("創建DOCUMENTS 失敗");
return FALSE;
}
else
{
CComVariant Template(_T(""));//創建一個空的模版
CComVariant NewTemplate(false);
CComVariant DocumentType(0);
CComVariant Visible;//不處理 用默認值
doc = docs.Add(&Template,&NewTemplate,&DocumentType,&Visible);
if(!doc.m_lpDispatch)
{
AfxMessageBox("創建word失敗");
return FALSE;
}
else
{
sel = app.GetSelection();//獲得當前Word操作。開始認為是在doc獲得selection。仔細想一下確實應該是Word的接口點
if(!sel.m_lpDispatch)
{
AfxMessageBox("selection 獲取失敗");
return FALSE;
}
else
{
return TRUE;
}
}
}
}
}
BOOL CmyWord ::Create()
{
if(CreateAPP())
{
if(CreateDocument())
{
return TRUE;
}
else
return FALSE;
}
else
return FALSE;
}
BOOL CmyWord::Open(CString FileName,BOOL ReadOnly /* = FALSE */,BOOL AddToRecentFiles /* = FALSE */)
{
CComVariant Read(ReadOnly);
CComVariant AddToR(AddToRecentFiles);
CComVariant Name(FileName);
COleVariant vTrue((short)TRUE), vFalse((short)FALSE);
COleVariant varstrNull("");
COleVariant varZero((short)0);
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);
COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if(!app.m_lpDispatch)
{
if(CreateAPP()==FALSE)
{
return FALSE;
}
}
if(!docs.m_lpDispatch)
{
docs=app.GetDocuments();
if(!docs.m_lpDispatch)
{
AfxMessageBox("DocuMent 對象創建失敗");
return FALSE;
}
}
CComVariant format(0);//打開方式 0 為doc的打開方式
doc=docs.Open(&Name,varFalse,&Read,&AddToR,vOpt,vOpt,
vFalse,vOpt,vOpt,&format,vOpt,vTrue,vOpt,vOpt,vOpt,vOpt);
if(!doc.m_lpDispatch)
{
AfxMessageBox("文件打開失敗");
return FALSE;
}
else
{
sel=app.GetSelection();
if(!sel.m_lpDispatch)
{
AfxMessageBox("打開失敗");
return FALSE;
}
return TRUE;
}
}
BOOL CmyWord::Save()
{
if(!doc.m_lpDispatch)
{
AfxMessageBox("Documents 對象都沒有建立 保存失敗");
return FALSE;
}
else
{
doc.Save();
return TRUE;
}
}
BOOL CmyWord::SaveAs(CString FileName,int SaveType/* =0 */)
{
CComVariant vTrue(TRUE);
CComVariant vFalse(FALSE);
CComVariant vOpt;
CComVariant cFileName(FileName);
CComVariant FileFormat(SaveType);
doc=app.GetActiveDocument();
if(!doc.m_lpDispatch)
{
AfxMessageBox("Document 對象沒有建立 另存為失敗");
return FALSE;
}
else
{
//最好按照宏來寫 不然可能出現問題、 畢竟這個是微軟寫的
/*ActiveDocument.SaveAs FileName:="xiaoyuer.doc", FileFormat:= _
wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
SaveAsAOCELetter:=False*/
doc.SaveAs(&cFileName,&FileFormat,&vFalse,COleVariant(""),&vTrue,
COleVariant(""),&vFalse,&vFalse,&vFalse,&vFalse,&vFalse,&vOpt,&vOpt,&vOpt,&vOpt,&vOpt);
}
return TRUE;
}
BOOL CmyWord::Close(BOOL SaveChange/* =FALSE */)
{
CComVariant vTrue(TRUE);
CComVariant vFalse(FALSE);
CComVariant vOpt;
CComVariant cSavechage(SaveChange);
if(!doc.m_lpDispatch)
{
AfxMessageBox("_Document 對象獲取失敗,關閉操作失敗");
return FALSE;
}
else
{
if(TRUE==SaveChange)
{
Save();
}
//下面第一個參數填vTrue 會出現錯誤,可能是后面的參數也要對應的變化
//但vba 沒有給對應參數 我就用這種方法來保存
doc.Close(&vFalse,&vOpt,&vOpt);
}
return TRUE;
}
void CmyWord::WriteText(CString Text)
{
sel.TypeText(Text);
}
void CmyWord::NewLine(int nCount/* =1 */)
{
if(nCount<=0)
{
nCount = 0;
}
else
{
for(int i=0;i<nCount;i++)
{
sel.TypeParagraph();//新建一段
}
}
}
void CmyWord::WriteTextNewLineText(CString Text,int nCount/* =1 */)
{
NewLine(nCount);
WriteText(Text);
}
void CmyWord::SetFont(BOOL Blod,BOOL Italic/* =FALSE */,BOOL UnderLine/* =FALSE */)
{
if(!sel.m_lpDispatch)
{
AfxMessageBox("編輯對象失敗,導致字體不能設置");
return;
}
else
{
sel.SetText("F");
font=sel.GetFont();//獲得字體編輯對象;
font.SetBold(Blod);
font.SetItalic(Italic);
font.SetUnderline(UnderLine);
sel.SetFont(font);
}
}
void CmyWord::SetFont(CString FontName,int FontSize/* =9 */,long FontColor/* =0 */,long FontBackColor/* =0 */)
{
if(!sel.m_lpDispatch)
{
AfxMessageBox("Select 為空,字體設置失敗!");
return;
}
//這里只是為了獲得一個對象,因為沒有對象你哪里來的設置呢.
//因為是用GetFont來獲取的對象的。
//所以用SetText來獲得字體屬性
sel.SetText("a");
font=sel.GetFont();//獲取字體對象
font.SetSize(20);
font.SetName(FontName);
font.SetColor(FontColor);
sel.SetFont(font);//選擇對象
}
void CmyWord::SetTableFont(int Row,int Column,CString FontName,int FontSize/* =9 */,long FontColor/* =0 */,long FontBackColor/* =0 */)
{
Cell c=tab.Cell(Row,Column);
c.Select();
_Font ft=sel.GetFont();
ft.SetName(FontName);
ft.SetSize(FontSize);
ft.SetColor(FontColor);
Range r=sel.GetRange();
r.SetHighlightColorIndex(FontBackColor);
}
void CmyWord::CreateTable(int Row,int Column)
{
doc=app.GetActiveDocument();
Tables tbs=doc.GetTables();
CComVariant Vopt;
if(!tbs.m_lpDispatch)
{
AfxMessageBox("創建表格對象失敗");
return;
}
else
{
tbs.Add(sel.GetRange(),Row,Column,&Vopt,&Vopt);
tab=tbs.Item(1);//如果有多個表格可以通過這個來找到表格對象。
}
}
void CmyWord::WriteCellText(int Row,int Column,CString Text)
{
Cell c=tab.Cell(Row,Column);
c.Select();//選擇表格中的單元格
sel.TypeText(Text);
}
void CmyWord::SetParaphformat(int Alignment)
{
_ParagraphFormat p=sel.GetParagraphFormat();
p.SetAlignment(Alignment);
sel.SetParagraphFormat(p);
}
void CmyWord::FindWord(CString FindW,CString RelWord)
{
sel=app.GetSelection();
Find myFind=sel.GetFind();
if(!myFind.m_lpDispatch)
{
AfxMessageBox("獲取Find 對象失敗");
return;
}
else
{
//下面三行是按照vba 寫的
myFind.ClearFormatting();
Replacement repla=myFind.GetReplacement();
repla.ClearFormatting();
COleVariant Text(FindW);
COleVariant re(RelWord);
COleVariant vTrue((short)TRUE), vFalse((short)FALSE);
COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CComVariant v(1);
CComVariant v2(2);
CComVariant v3(_T(""));
//下面的Replace 對應的替換的范圍是哪里.
// 1 代表一個 2 代表整個文檔
//myFind.Execute(Text,vFalse,vFalse,vFalse,vFalse,vFalse,vTrue,&v,vFalse,re,&v2,vOpt,vOpt,vOpt,vOpt);
myFind.Execute(Text,vFalse,vFalse,vFalse,vFalse,vFalse,
vTrue,&v,vFalse,&re,&v2,vOpt,vOpt,vOpt,vOpt);
}
}
void CmyWord::GetWordText(CString &Text)
{
//CComVariant vOpt;
COleVariant vOpt(( long )DISP_E_PARAMNOTFOUND, VT_ERROR);
doc=app.GetActiveDocument();//獲得當前激活文檔 就是當前正在編輯文檔
if(!doc.m_lpDispatch)
{
AfxMessageBox("獲取激活文檔對象失敗");
return;
}
else
{
range=doc.Range(vOpt,vOpt);
Text=range.GetText();
AfxMessageBox(Text);
}
}
//打印代碼我直接Cppy 別人的 因為我沒有打印機所以不好做測試
//這里只是為了方便大家
void CmyWord::PrintWord()
{
doc = app.GetActiveDocument();
if(!doc.m_lpDispatch)
{
AfxMessageBox("獲取激活文檔對象失敗");
return;
}
else
{
COleVariant covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
doc.PrintOut(covFalse, // Background.
covOptional, // Append.
covOptional, // Range.
covOptional, // OutputFileName.
covOptional, // From.
covOptional, // To.
covOptional, // Item.
COleVariant((long)1), // Copies.
covOptional, // Pages.
covOptional, // PageType.
covOptional, // PrintToFile.
covOptional, // Collate.
covOptional, // ActivePrinterMacGX.
covOptional, // ManualDuplexPrint.
covOptional, // PrintZoomColumn New with Word 2002
covOptional, // PrintZoomRow ditto
covOptional, // PrintZoomPaperWidth ditto
covOptional); // PrintZoomPaperHeight ditto*/
}
}
void CmyWord::AppClose()
{
COleVariant vOpt(( long )DISP_E_PARAMNOTFOUND, VT_ERROR);
if(!app.m_lpDispatch)
{
AfxMessageBox("獲取Word 對象失敗,關閉操作失敗");
return;
}
else
{
app.Quit(vOpt,vOpt,vOpt);
//這里釋放資源好像不是很好,所以我就在析構函數去處理了。
}
}
我的工程 是vc6 控制台 支持MFC
http://115.com/file/e6gkjtpk#
word操作封裝類.zip