MFC操作Word
更新时间:2024-07-10 09:52:01 阅读量: 综合文库 文档下载
【MFC/C++操作word】Word篇
分类: MFC操作office2013-01-25 21:30 4372人阅读 评论(10) 收藏 举
报
MFC操作Word
一.初始化操作
最近根据项目需要,需要我去用 vc++6.0 作一个 ActiveX web 组件。自己从来没有接触过这方面的编程,这次是头一遭!所以咱就做了,不过倒很出乎我的意料,比我想象的要快很多就完成了。现将 vc++6.0 操作 word 部分的关键代码部分帖出来,共享给大家。
因为我在开发的时候遇到了很多问题,并且网上的资料很少,基本都是最基本的操作。所以帖出来,希望能让大家在开发的过程少走些弯路!
工具: vc++6.0 。 关键字: c++ , MFC 。
要求:系统安装 MS OFFICE 2000 。 过程: 准备工作:
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 安装的目录中的 MSWORD9.OLB ,然后选中所有列出的类名,点 OK完成。
准备工作完成,下面贴出相关部分的代码:
CWordOffice.h 中的手动写入的代码如下(自动生成的没有加入):
1.导入类库
下面的操作基于Word2003
点击查看->建立类向导-> Add Class...\\From a type Library...-> C:\\Program Files\\Microsoft Office\\Office\\MSWORD9.OLB,接下来就可以看到导入的类msword.h, msword.cpp。 2.初始化COM
找到App的InitInstance()函数,在其中添加 AfxOleInit()函数的调用,如: if (!AfxOleInit()) {
AfxMessageBox(\注册COM出错!\ return FALSE; }
二.我自己写的Word操作类
你写的时候可以直接使用这个类,在它的基础上修改一下。我参考自http://www.cnitblog.com/lifw/articles/vcpp_officeword.html,对其进行了改编:
WordOperate.h #include \
#define wdCharacter 1 #define wdLine 5 #define wdCell 12 #define wdExtend 1 #define wdMove 0 using namespace myword; #include \
class CWordOperate { public:
CWordOperate();
virtual ~CWordOperate();
private: _Application m_wdApp; Documents m_wdDocs; _Document m_wdDoc; Selection m_wdSel; Range m_wdRange;
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); //将本地的文件全部内容写入到当前文档的光标处。
//----------------------add by zxx--------------------------------------
//***********************光标操作********************************************
//上下按行选择
void SelectMoveDown(short lineCount, short unit);//有选择
操作的移动
void NoneSelectMoveDown(short lineCount, short unit);//仅
仅移动光标,不选中
void SelectMoveUp(short lineCount, short unit);//有选择操
作的移动
void NoneSelectMoveUp(short lineCount, short unit);//仅仅
移动光标,不选中
//左右按列选择
void SelectMoveLeft(short charCount, short unit);//有选择操
作的移动
void NoneSelectMoveLeft(short charCount, short unit);// void SelectMoveRight(short charCount, short unit);//有选择
操作的移动
void MoveToFirst(); void MoveToNextPage(); void TypeParagraph(); void PasteAndFormat(); void Paste();
void NoneSelectMoveRight(short charCount, short unit);//
};
void TypeBackspace(int count);
WordOperate.cpp
CWordOperate::CWordOperate() { }
CWordOperate::~CWordOperate() { } //操作
BOOL CWordOperate::CreateApp() {
COleException pe;
if (!m_wdApp.CreateDispatch(_T(\
&pe)) {
AfxMessageBox(\创建失败,请确保安装了word 2000或以上版本!\
pe.ReportError(); throw &pe;
return FALSE; }
return TRUE; }
BOOL CWordOperate::CreateDocuments()
{
if (FALSE == CreateApp()) {
return FALSE; }
m_wdDocs.AttachDispatch(m_wdApp.GetDocuments()); if (!m_wdDocs.m_lpDispatch) {
AfxMessageBox(\创建失败!\MB_OK|MB_ICONWARNING); return FALSE; }
return TRUE; }
BOOL CWordOperate::CreateDocument()
{
if (!m_wdDocs.m_lpDispatch) {
AfxMessageBox(\为空!\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(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
//得到selection变量
m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) {
AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
//得到Range变量
m_wdRange = m_wdDoc.Range(vOptional,vOptional); if(!m_wdRange.m_lpDispatch) {
AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
return TRUE; }
BOOL CWordOperate::Create() {
if (FALSE == CreateDocuments()) {
return FALSE; }
return CreateDocument(); }
void CWordOperate::ShowApp() {
m_wdApp.SetVisible(TRUE); }
void CWordOperate::HideApp()
{
m_wdApp.SetVisible(FALSE); }
BOOL CWordOperate::OpenDocument(CString fileName) {
if (!m_wdDocs.m_lpDispatch) {
AfxMessageBox(\为空!\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(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
// // //得到selection变量
m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) {
AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
//得到全部DOC的Range变量
m_wdRange = m_wdDoc.Range(vOptional,vOptional); if(!m_wdRange.m_lpDispatch) {
AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
return TRUE; }
BOOL CWordOperate::Open(CString fileName) {
if (FALSE == CreateDocuments()) {
return FALSE; }
//HideApp();
return OpenDocument(fileName); }
BOOL CWordOperate::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(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
//得到selection变量
m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) {
AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
//得到全部DOC的Range变量
m_wdRange = m_wdDoc.Range(vOptional,vOptional); if(!m_wdRange.m_lpDispatch) {
AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
HideApp(); return TRUE; }
BOOL CWordOperate::SaveDocument() {
if (!m_wdDoc.m_lpDispatch) {
AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
m_wdDoc.Save(); return TRUE; }
BOOL CWordOperate::SaveDocumentAs(CString fileName) {
if (!m_wdDoc.m_lpDispatch) {
AfxMessageBox(\获取失败!\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, //VARIANT*
ReadOnlyRecommended
vOptional, //VARIANT* EmbedTrueTypeFonts
vOptional, //VARIANT* SaveNativePictureFormat
vOptional, //VARIANT* SaveFormsData vOptional //VARIANT* SaveAsAOCELetter ); return TRUE; }
BOOL CWordOperate::CloseDocument() {
COleVariant vTrue((short)TRUE), vFalse((short)FALSE),
vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_wdDoc.Close(vFalse, // SaveChanges. vTrue, // OriginalFormat.
vFalse // RouteDocument. );
//AfxMessageBox(\
m_wdDoc.AttachDispatch(m_wdApp.GetActiveDocument()); if (!m_wdDoc.m_lpDispatch) {
AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
// AfxMessageBox(\ //得到selection变量
m_wdSel = m_wdApp.GetSelection(); if (!m_wdSel.m_lpDispatch) {
AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
// AfxMessageBox(\
//得到全部DOC的Range变量
m_wdRange = m_wdDoc.Range(vOptional,vOptional); if(!m_wdRange.m_lpDispatch) {
AfxMessageBox(\获取失败!\MB_OK|MB_ICONWARNING); return FALSE; }
// AfxMessageBox(\ return TRUE; }
void CWordOperate::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_wdRange.ReleaseDispatch(); m_wdSel.ReleaseDispatch();
m_wdDoc.ReleaseDispatch(); m_wdDocs.ReleaseDispatch(); m_wdApp.ReleaseDispatch(); }
void CWordOperate::WriteText(CString szText) {
m_wdSel.TypeText(szText); }
void CWordOperate::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 CWordOperate::WriteEndLine(CString szText) {
m_wdRange.InsertAfter(szText); }
void CWordOperate::WholeStory()
{
m_wdRange.WholeStory(); }
void CWordOperate::Copy() {
m_wdSel.Copy(); }
void CWordOperate::TypeParagraph() {
m_wdSel.TypeParagraph(); }
//m_wdSel.CopyFormat();
void CWordOperate::PasteAndFormat() { }
void CWordOperate::Paste() { }
void CWordOperate::TypeBackspace(int count) {
for(int i = 0; i < count; i++) m_wdSel.TypeBackspace(); m_wdSel.Paste(); //m_wdSel.PasteFormat(); m_wdSel.PasteAndFormat(0);
}
三.可能遇到的问题
1.问题:CreateDispatch 没有注册类别 解答:使用静态编译即可。
测试部分代码如下:
需要在对话框中添加一个按钮,按钮的事件方法内添加如下代码:
COfficeProjectDlg::OnButton1() {
AfxEnableControlContainer();
AfxOleInit();
CWordOffice wd;
wd.CreateDocuments();
wd.OpenDocument(\
wd.ShowApp(); //显示word
}
其他方法就不一一帖出测试方法了。可以自己根据方法说明做测试。
正在阅读:
MFC操作Word07-10
付出与回报作文450字06-19
工程监管停检点、必检点初步统计11-02
一通三防技术业务管理制度06-09
星级酒店餐厅菜单之认识07-11
夜不归宿3000字检讨书05-27
2014年天津市选调生考试真题01-12
段喜贵与石改荣人身损害赔偿纠纷案04-19
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 操作
- Word
- MFC
- 江苏省无锡市长安中学2012-2013学年七年级上学期数学2.3《绝对值
- 安源区政区大典
- CA6140车床法兰盘加工工艺及夹具设计最终版
- 人大考研法理学基础理论91-02
- 济南市专项化学用品生产企业调查报告2018版
- XX设计院ISO质量管理体系认证材料——质量手册
- Java技术笔试题集(附答案)(基础必备)
- 2010年高考物理备考选择题题型限时强化训练(二十四)
- 二年级语文下册第二三单元试题
- 《名师同步导学》2014高考物理一轮复习单元卷 - - 人教版选修3-
- 西安市中小学骨干班主任培训对象登记表
- 铁路工地试验室和混凝土拌和站人员岗位资格培训考试管理办法(试
- 古人探索地球的资料
- 语文人教版七年级下册斑羚飞渡第二课时教案
- 广联达图形算量软件GCL2008学习手册
- 高一物理下学期教学工作总结
- 2010年中考生物一轮复习 - 第十九讲生物的生殖和发育
- 苏州人力资源考试大纲
- 让学生社团为中等职业学校校园文化注入活力
- 调薪工作总结(2011.6)(3500字)