工具: 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 类型,可选。指定的链接的地址。此地址可以是电子邮件地址、Internet 地址或文件名。请注意,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
}
http://www.cnblogs.com/joeblackzqq/archive/2010/11/07/1871374.html
|