该类主要是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; iAddRef(); ///< 不加这句话会挂
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,回到主控文档
}