MFC对word操作-封装好的类

该类主要是copy的其他人的成果,页码部分由笔者自己查找资料添加。

class _wordClass
{
public:
	_wordClass();
	~_wordClass();

public:
	void ShowApp(BOOL flag);
	BOOL InitCOM();											///< 对COM进行初始化

	BOOL CreateAPP();										///< 创建一个word程序
	BOOL CreateDocument();									///< 创建word文档
	BOOL Create();											///< 创建一个word程序和Word文档
	void AppClose();

	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 EndLine();											///< 移动到尾行
	void PageBreak();										///< 分页


	//////////////////////////字体设置////////////////////////////////////////
	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);

	////////////////////////输出标题///////////////////////
	/*
	level值,1:正文,2:一级标题,3:二级标题,4:............
	*/
	void WriteTile(CString title, CString fontName = _T("微软雅黑"), int fontSize = 16, unsigned int level = 2);

	/////////////////////输出页脚的页码///////////////////////
	/*
	应使用非Unicode编码
	*/
	void WritePageNum();




	/////////////////////////表格操作/////////////////////////////////////

	/**
	*	设置表格背景样色
	*	@param[in]	Row				行
	*	@param[in]	Column			列
	**/
	void CreateTable(int Row, int Column);

	/**
	*	设置表格背景样色
	*	@param[in]	Row				行
	*	@param[in]	Column			列
	*	@param[in]	Text			文本内容
	**/
	void WriteCellText(int Row, int Column, CString Text);

	/**
	*	设置表格背景样色
	*	@param[in]	Row				行
	*	@param[in]	Row				列
	*	@param[in]	ShaingColor		背景颜色
	**/
	void SetTableShading(int Row, int Column, long ShaingColor = 0);





	/////////////////////////标签、超链接操作/////////////////////////////////////

	/**
	*	创建书签
	*	@param[in] bmarkName 书签名称
	**/
	void CreateBookMark(CString bmarkName);

	/**
	*	创建文档内部超链接
	*	@param[in] hlinkName 超链接名称
	*	@param[in] bmarkName 书签名称
	**/
	void CreateHyperLink(CString hlinkName, CString bmarkName);

	/**
	*	重定位文档内部超链接
	*	@param[in] hlinkName 超链接名称
	*	@param[in] bmarkName 书签名称
	**/
	void RepositionHyperLink(CString hlinkName, CString bmarkName);




	/////////////////////////////图片操作///////////////////////////////////////
	/**
	*	插入图片
	*	@param[in] fileName 图片路径
	**/
	void InsertShapes(CString fileName);

	/**
	*	插入图片
	*	@param[in] pBitmap  bitmap图片
	**/
	void InsertShapes(CBitmap *pBitmap);


	/////////////////////////////设置文档属性///////////////////////////////////////

	/**
	*	设置对齐属性
	*	@param[in] Alignment 对其方式.
	*	- 1 居中
	*	- 2	右对齐
	*   - 3	左对齐
	**/
	void SetParaphformat(int Alignment = 3);

	/**
	*	设置页面属性
	*	@param[in] LeftMargin	左边距
	*	@param[in] RightMargin	右边距
	*	@param[in] TopMargin	上边距
	*	@param[in] BottonMargin	下边距
	**/
	void SetPageSetup(int LeftMargin = 45, int RightMargin = 45, int TopMargin = 45, int BottonMargin = 45);


protected:

	//获得当前段落,以便设置当前段落格式
	CParagraph GetCurParagraph(CDocument0& curDoc);
};
CApplication	m_app;					///< 创建word
CDocuments		m_docs;					///< word文档集合
CDocument0		m_doc;					///< 一个word文件
CFont0			m_font;					///< 字体对象
CSelection		m_sel;					///< 选择编辑对象 没有对象的时候就是插入点
CTables0		m_tabs;
CTable0			m_tab;					///< 表格对象
CBookmarks		m_bmarks;
CBookmark0		m_bmark;				///< 标签
CHyperlinks		m_hlinks;
CHyperlink		m_hlink;				///< 超连接
CnlineShapes	m_ishapes;
CnlineShape		m_ishape;				///< 图片

_wordClass::_wordClass()
{
}


_wordClass::~_wordClass()
{
}

BOOL _wordClass::CreateAPP()
{
	if (!m_app.CreateDispatch(_T("Word.Application")))
	{
		AfxMessageBox(_T("服务创建失败,请确定已经安装了Office 2000或以上版本."), MB_OK | MB_SETFOREGROUND);
		return FALSE;
	}
	else
	{
		//m_app.put_Visible(TRUE);
		//m_app.put_Visible(FALSE);
		//m_app.put_DisplayAlerts(FALSE);
		return TRUE;
	}
}


BOOL _wordClass::CreateDocument()
{
	if (!m_app.m_lpDispatch)
	{
		AfxMessageBox(_T("Application为空,Documents创建失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	else
	{
		m_docs = m_app.get_Documents();
		if (m_docs.m_lpDispatch == NULL)
		{
			AfxMessageBox(_T("创建DOCUMENTS 失败"));
			return FALSE;
		}
		else
		{
			COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
			m_doc = m_docs.Add(vOpt, vOpt, vOpt, vOpt);

			if (!m_doc.m_lpDispatch)
			{
				AfxMessageBox(_T("创建word失败"));
				return FALSE;
			}
			else
			{
				m_sel = m_app.get_Selection();//获得当前Word操作。开始认为是在doc获得selection。仔细想一下确实应该是Word的接口点
				if (!m_sel.m_lpDispatch)
				{
					AfxMessageBox(_T("selection 获取失败"));
					return FALSE;
				}
				else
				{
					return TRUE;
				}
			}
		}
	}
}


BOOL _wordClass::Create()
{
	if (CreateAPP())
	{
		if (CreateDocument())
		{
			return TRUE;
		}
		else
			return FALSE;
	}
	else
		return FALSE;
}


BOOL _wordClass::Open(CString FileName, BOOL ReadOnly /* = FALSE */, BOOL AddToRecentFiles /* = FALSE */)
{
	CComVariant Read(ReadOnly), AddToR(AddToRecentFiles), Name(FileName);
	CComVariant format(0);		//打开方式 0 为doc的打开方式
	COleVariant vTrue((short)TRUE), vFalse((short)FALSE);
	COleVariant varstrNull(_T(""));
	COleVariant varFalse(short(0), VT_BOOL);
	COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	if (!m_app.m_lpDispatch)
	{
		if (CreateAPP() == FALSE)
			return FALSE;
	}
	if (!m_docs.m_lpDispatch)
	{
		m_docs = m_app.get_Documents();
		if (!m_docs.m_lpDispatch)
		{
			AfxMessageBox(_T("DocuMent 对象创建失败"));
			return FALSE;
		}
	}
	m_doc = m_docs.Open(&Name, varFalse, &Read, &AddToR, vOpt, vOpt,
		vFalse, vOpt, vOpt, &format, vOpt, vTrue, vOpt, vOpt, vOpt, vOpt);
	if (!m_doc.m_lpDispatch)
	{
		AfxMessageBox(_T("文件打开失败"));
		return FALSE;
	}
	else
	{
		m_sel = m_app.get_Selection();
		if (!m_sel.m_lpDispatch)
		{
			AfxMessageBox(_T("打开失败"));
			return FALSE;
		}
		return TRUE;
	}
}

BOOL _wordClass::Save()
{
	if (!m_doc.m_lpDispatch)
	{
		AfxMessageBox(_T("Documents 对象都没有建立 保存失败"));
		return FALSE;
	}
	else
	{
		m_doc.Save();
		return TRUE;
	}
}

BOOL _wordClass::SaveAs(CString FileName, int SaveType/* =0 */)
{
	CComVariant vTrue(TRUE);
	CComVariant vFalse(FALSE);
	CComVariant vOpt;
	CComVariant cFileName(FileName);
	CComVariant FileFormat(SaveType);
	m_doc = m_app.get_ActiveDocument();
	if (!m_doc.m_lpDispatch)
	{
		AfxMessageBox(_T("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*/


		m_doc.SaveAs(&cFileName, &FileFormat, &vFalse, COleVariant(_T("")), &vTrue,
			COleVariant(_T("")), &vFalse, &vFalse, &vFalse, &vFalse, &vFalse, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt);

	}
	return TRUE;
}

BOOL _wordClass::Close(BOOL SaveChange/* =FALSE */)
{
	CComVariant vTrue(TRUE);
	CComVariant vFalse(FALSE);
	CComVariant vOpt;
	CComVariant cSavechage(SaveChange);
	if (!m_doc.m_lpDispatch)
	{
		AfxMessageBox(_T("_Document 对象获取失败,关闭操作失败"));
		return FALSE;
	}
	else
	{
		if (TRUE == SaveChange)
		{
			Save();
		}
		//下面第一个参数填vTrue 会出现错误,可能是后面的参数也要对应的变化
		//但vba 没有给对应参数 我就用这种方法来保存

		m_doc.Close(&vFalse, &vOpt, &vOpt);
	}
	return TRUE;
}





void _wordClass::WriteText(CString Text)
{
	m_sel.TypeText(Text);
}

void _wordClass::NewLine(int nCount/* =1 */)
{
	if (nCount <= 0)
	{
		nCount = 0;
	}
	else
	{
		for (int i = 0; i<nCount; i++)
		{
			m_sel.TypeParagraph();//新建一段
		}
	}
}

void _wordClass::WriteTextNewLineText(CString Text, int nCount/* =1 */)
{
	NewLine(nCount);
	WriteText(Text);
}

void _wordClass::EndLine()
{
	m_sel = m_app.get_Selection();
	m_sel.EndKey(COleVariant((short)6), COleVariant((short)0));//将光标移动到最后一行

}

void _wordClass::PageBreak()
{
	m_sel = m_app.get_Selection();
	m_sel.InsertBreak(COleVariant((long)7));//插入分页符
}


void _wordClass::SetFont(BOOL Blod, BOOL Italic/* =FALSE */, BOOL UnderLine/* =FALSE */)
{
	if (!m_sel.m_lpDispatch)
	{
		AfxMessageBox(_T("编辑对象失败,导致字体不能设置"));
		return;
	}
	else
	{
		m_sel.put_Text(_T("F"));
		m_font = m_sel.get_Font();//获得字体编辑对象;
		m_font.put_Bold(Blod);
		m_font.put_Italic(Italic);
		m_font.put_Underline(UnderLine);
		m_sel.put_Font(m_font);
	}
}

void _wordClass::SetFont(CString FontName, int FontSize/* =9 */, long FontColor/* =0 */, long FontBackColor/* =0 */)
{
	if (!m_sel.m_lpDispatch)
	{
		AfxMessageBox(_T("Select 为空,字体设置失败!"));
		return;
	}
	//这里只是为了获得一个对象,因为没有对象你哪里来的设置呢.
	//因为是用get_Font来获取的对象的。
	//所以用put_Text来获得字体属性
	m_sel.put_Text(_T("a"));
	m_font = m_sel.get_Font();//获取字体对象
	m_font.put_Size(FontSize);
	m_font.put_Name(FontName);
	m_font.put_Color(FontColor);
	m_sel.put_Font(m_font);//选择对象
}



void _wordClass::SetTableFont(int Row, int Column, CString FontName, int FontSize/* =9 */, long FontColor/* =0 */, long FontBackColor/* =0 */)
{
	CCell c = m_tab.Cell(Row, Column);
	c.Select();
	CFont0 ft = m_sel.get_Font();
	ft.put_Name(FontName);
	ft.put_Size(FontSize);
	ft.put_Color(FontColor);
	CRange r = m_sel.get_Range();
	r.put_HighlightColorIndex(FontBackColor);

}




void _wordClass::CreateTable(int Row, int Column)
{
	m_doc = m_app.get_ActiveDocument();
	m_tabs = m_doc.get_Tables();
	CComVariant DefaultBehavior(1), AutoFitBehavior(2);
	if (!m_tabs.m_lpDispatch)
	{
		AfxMessageBox(_T("创建表格对象失败"));
		return;
	}
	else
	{
		m_tabs.Add(m_sel.get_Range(), Row, Column, &DefaultBehavior, &AutoFitBehavior);
		m_tab = m_tabs.Item(m_tabs.get_Count());//如果有多个表格可以通过这个来找到表格对象。
	}
}

void _wordClass::WriteCellText(int Row, int Column, CString Text)
{
	CCell c = m_tab.Cell(Row, Column);
	c.Select();//选择表格中的单元格
	m_sel.TypeText(Text);

}


void _wordClass::SetTableShading(int Row, int Column, long ShaingColor/* =0 */)
{
	CCell c = m_tab.Cell(Row, Column);
	c.Select();
	CShading s = c.get_Shading();
	s.put_BackgroundPatternColor(ShaingColor);

}




void _wordClass::CreateBookMark(CString bmarkName)
{
	m_doc = m_app.get_ActiveDocument();
	m_sel = m_app.get_Selection();
	m_bmarks = m_doc.get_Bookmarks();

	if (!m_bmarks.m_lpDispatch)
	{
		AfxMessageBox(_T("创建标签对象失败"));
		return;
	}
	else
	{
		COleVariant vOpt;
		CRange aRange = m_sel.get_Range();
		aRange.m_lpDispatch->AddRef();				///< 不加这句话会挂
		vOpt.vt = VT_DISPATCH;						//指定vt的类型
		vOpt.pdispVal = aRange;						//把range对象的m_lpDispatch赋值给vt
		m_bmark = m_bmarks.Add(bmarkName, &vOpt);	//插入一个叫bmarkName的书签
	}
}

void _wordClass::CreateHyperLink(CString hlinkName, CString bmarkName)
{
	COleVariant     vAddress(_T("")), vSubAddress(bmarkName), vScreenTip(_T("")), vTextToDisplay(hlinkName);

	m_doc = m_app.get_ActiveDocument();
	CRange aRange = m_sel.get_Range();

	m_hlinks = m_doc.get_Hyperlinks();
	m_hlinks.Add(
		aRange,				//Object,必需。转换为超链接的文本或图形。
		vAddress,			//Variant 类型,可选。指定的链接的地址。此地址可以是电子邮件地址、Internet 地址或文件名。请注意,Microsoft Word 不检查该地址的正确性。
		vSubAddress,		//Variant 类型,可选。目标文件内的位置名,如书签、已命名的区域或幻灯片编号。
		vScreenTip,			//Variant 类型,可选。当鼠标指针放在指定的超链接上时显示的可用作“屏幕提示”的文本。默认值为 Address。
		vTextToDisplay,		//Variant 类型,可选。指定的超链接的显示文本。此参数的值将取代由 Anchor 指定的文本或图形。
		vSubAddress			//Variant 类型,可选。要在其中打开指定的超链接的框架或窗口的名字。

		);
}

void _wordClass::RepositionHyperLink(CString hlinkName, CString bmarkName)
{
	COleVariant     vSubAddress(bmarkName), vTextToDisplay(hlinkName);
	m_hlinks = m_doc.get_Hyperlinks();

	m_hlink = m_hlinks.Item(&vTextToDisplay);
	m_hlink.put_SubAddress(bmarkName);
}



void _wordClass::InsertShapes(CString fileName)
{
	COleVariant vTrue((short)TRUE),

		vFalse((short)FALSE),

		vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	m_ishapes = m_sel.get_InlineShapes();

	m_ishape = m_ishapes.AddPicture(fileName, vFalse, vTrue, vOpt);

}


void _wordClass::InsertShapes(CBitmap *pBitmap)
{
	if (OpenClipboard(NULL))
	{
		EmptyClipboard();
		SetClipboardData(CF_BITMAP, pBitmap->m_hObject);
		CloseClipboard();
		m_sel.Paste();
	}
}


void _wordClass::SetParaphformat(int Alignment)
{
	CParagraphFormat p = m_sel.get_ParagraphFormat();
	p.put_Alignment(Alignment);
	m_sel.put_ParagraphFormat(p);
}



void _wordClass::SetPageSetup(int LeftMargin/*= 20*/, int RightMargin/*= 20*/, int TopMargin/*= 20*/, int BottonMargin/*= 20*/)
{
	m_doc = m_app.get_ActiveDocument();
	CPageSetup p = m_doc.get_PageSetup();
	p.put_LeftMargin(LeftMargin);
	p.put_RightMargin(RightMargin);
	p.put_TopMargin(TopMargin);
	p.put_BottomMargin(BottonMargin);
}


void _wordClass::AppClose()
{
	COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	if (!m_app.m_lpDispatch)
	{
		AfxMessageBox(_T("获取Word 对象失败,关闭操作失败"));
		return;
	}
	else
	{
		m_app.Quit(vOpt, vOpt, vOpt);
		//这里释放资源好像不是很好,所以我就在析构函数去处理了。

		CoUninitialize();
		m_ishape.ReleaseDispatch();
		m_ishapes.ReleaseDispatch();
		m_bmark.ReleaseDispatch();
		m_bmarks.ReleaseDispatch();
		m_hlink.ReleaseDispatch();
		m_hlinks.ReleaseDispatch();
		m_font.ReleaseDispatch();
		m_tab.ReleaseDispatch();
		m_tabs.ReleaseDispatch();
		m_doc.ReleaseDispatch();
		m_docs.ReleaseDispatch();
		m_app.ReleaseDispatch();
		m_sel.ReleaseDispatch();
	}
}

void _wordClass::WriteTile(CString title, CString fontName/* = _T("微软雅黑")*/, int fontSize/* = 16*/, unsigned int level/* = 2*/)
{
	m_sel.TypeText(title);
	m_sel.HomeKey(COleVariant((short)5), COleVariant((short)1)); // wdLine=5,返回当前行首,并选择当前行
	m_sel.put_Style(COleVariant((short)-level));// 设置为“标题1“样式,wdStyleHeading1=-2
	// 设置选择区域字体,一定要放在样式后,否则格式会被样式的覆盖
	m_font = m_sel.get_Font();
	m_font.put_Name(fontName);
	m_font.put_Size(fontSize);	// 必须选择该行才可以修改,即必须有HomeKey那行
	// 获得当前段落,并设置对齐方式
	CParagraph lastPara = GetCurParagraph(m_doc);
	lastPara.put_Alignment(0);	// wdAlignParagraphLeft=0, wdAlignParagraphCenter=1,wdAlignParagraphRight=2
	// 结束当前段落编辑,移动光标到段落后
	m_sel.EndOf(COleVariant((short)4), COleVariant((short)0));	// wdParagraph=4,wdMove=0
}

CParagraph _wordClass::GetCurParagraph(CDocument0& curDoc)
{
	CParagraphs paragraphs = curDoc.get_Paragraphs();
	CParagraph lastPara = paragraphs.get_Last();
	return lastPara;
}

void _wordClass::WritePageNum()
{
	//获取页眉页脚
	CWindow0 oWind = m_doc.get_ActiveWindow();
	CPane0 oPane = oWind.get_ActivePane();	// 一定将CPane改为CPane0或其他
	CView0 oView = oPane.get_View();
	//输出
	oView.put_SeekView(10);	// wdSeekCurrentPageFooter=10
	CFont0 font = m_sel.get_Font();	// 设置选择区域字体,一定要放在样式后,否则格式会被样式的覆盖
	font.put_Name(_T("华文楷体"));
	font.put_Size(9);
	CParagraphFormat lastPara = m_sel.get_ParagraphFormat();	// 默认为居中
	lastPara.put_Alignment(1);	// wdAlignParagraphLeft=0, wdAlignParagraphCenter=1, wdAlignParagraphRight=2
	// 添加页码
	COleVariant	covZero((short)0), covTrue((short)TRUE);
	m_sel.TypeText(_T("/"));
	m_sel.MoveLeft(COleVariant((short)1), COleVariant((short)1), &covZero);
	CFields fields = m_sel.get_Fields();
	fields.Add(m_sel.get_Range(), COleVariant((short)33), COleVariant(_T("PAGE  ")), &covTrue);	// 增加页码域,当前页码
	m_sel.MoveRight(COleVariant((short)1), COleVariant((short)1), &covZero);
	fields.Add(m_sel.get_Range(), COleVariant((short)26), COleVariant(_T("NUMPAGES  ")), &covTrue);	// 增加页码域,总页数
	oView.put_SeekView(0);	// 关闭页眉页脚,wdSeekMainDocument=0,回到主控文档
}

猜你喜欢

转载自blog.csdn.net/qq_16334327/article/details/82840401
今日推荐