我用VC写了一个操作Word的程序,大致如下:
1.首先,设定一个“模版.doc ”,在其中设定好书签
2.通过读取“模版.doc ”将数据库中的数据按照“模版.doc ”设定的书签位置写入一个新的.doc文件中,这个文件是新建的,之后再保存改文件
(程序中读取“模版.doc”文件时用到Open())问题:
当我再运行程序前,开启任意.doc文件,若不关闭的话,那么程序执行时会报错“Word无法保存此文件,因为它已在别处打开”
我发现此时,进程列表中有两个WINWORD.EXE进程而正常情况下,无论我们打开多少.doc文件,进程列表中都只有一个WINWORD.EXE进程还请各位多多指教,如何解决这个问题?
不胜感激!
1.首先,设定一个“模版.doc ”,在其中设定好书签
2.通过读取“模版.doc ”将数据库中的数据按照“模版.doc ”设定的书签位置写入一个新的.doc文件中,这个文件是新建的,之后再保存改文件
(程序中读取“模版.doc”文件时用到Open())问题:
当我再运行程序前,开启任意.doc文件,若不关闭的话,那么程序执行时会报错“Word无法保存此文件,因为它已在别处打开”
我发现此时,进程列表中有两个WINWORD.EXE进程而正常情况下,无论我们打开多少.doc文件,进程列表中都只有一个WINWORD.EXE进程还请各位多多指教,如何解决这个问题?
不胜感激!
解决方案 »
- 关于类的询问,请多多帮忙,新手上路不容易。
- xp下,鼠标放到文件加上,弹出提示信息框。怎么得到这个框的句柄。
- 请教大家一个关于考认证的问题
- 怎么得到ListControl的某个条目的位置?
- 如何将一个CString对象的内容赋值给一个CByteArray对象?
- 关于OnMouseWheel()
- 在同一台机上运行的client端connect不上server端,进入请看详情
- ADO怎么查询指定表的行数,急求~~~~~~~~~~
- 这个问题如何解决,关于不同线程调用相同一COM接口的问题。
- 怎样控制控件大小
- 程序崩溃Unhandle exception
- VC 实现类似Word的画线功能,能够拖动线条,拉伸线条,该怎么做呢,有什么控件没?
http://www.joyvc.cn/ComponentDevelop/ComponentDevelop00009.html
http://www.joyvc.cn/ComponentDevelop/ComponentDevelop00012.html
http://www.joyvc.cn/ComponentDevelop/ComponentDevelop00015.htmlhttp://www.joyvc.cn/ComponentDevelop/ComponentDevelopGroup00021.html
COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
//开始一个新的Microsoft Word 2000实例
_Application oWordApp;
if(!oWordApp.CreateDispatch("Word.Application",NULL))
{
AfxMessageBox("创建 Word 服务失败!请确认您的系操中已安装了 Microsoft Office 组件。", MB_OK|MB_SETFOREGROUND);
return;
}
//创建一个新的word文档
Documents oDocs;
_Document oDoc;
oDocs=oWordApp.GetDocuments();
oDoc=oDocs.Add(vOpt,vOpt,vOpt,vOpt);
//如果是word 98,则应该带两个参数,如oDocs.Add(vOpt, vOpt)
//把文本添加到word文档
Selection oSel;
oSel=oWordApp.GetSelection();
//保存word文档
_Document oActiveDoc;
oActiveDoc=oWordApp.GetActiveDocument();
oActiveDoc.SaveAs(COleVariant(file_pathname),COleVariant((short)0),vFalse, COleVariant(""), vTrue, COleVariant(""),vFalse, vFalse, vFalse, vFalse, vFalse);
//退出word应用程序
oWordApp.Quit(vOpt, vOpt, vOpt);
//把文本添加到word文档
COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
_Application m_App;//定义Word提供的应用程序对象
oSel.ReleaseDispatch();
oDocs.ReleaseDispatch();//断开关联
m_App.m_bAutoRelease=true;
if(!m_App.CreateDispatch("Word.Application"))
{
AfxMessageBox("创建Word2000服务失败!请确认您的系操中已安装了 Microsoft Office 组件。");
exit(1);
}
//下面是定义VARIANT变量
COleVariant varFilePath(file_pathname);
COleVariant varstrNull("");
COleVariant varZero((short)0);
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);
oDocs.AttachDispatch(m_App.GetDocuments());//将Documents类对象oDocs和Idispatch接口关联起来
oDocs.Open(varFilePath,varFalse,varFalse,varFalse,varstrNull,varstrNull,varFalse,varstrNull,varstrNull,varTrue,varTrue,varTrue);
//打开Word文档;
oSel.AttachDispatch(m_App.GetSelection());//将Selection类对象oSel和Idispatch接口关联起来
oSel.InsertAfter("要写入的文字");
//保存word文件
oDoc=m_App.GetActiveDocument();
oDoc.SaveAs(COleVariant(file_pathname),COleVariant((short)0),vFalse,COleVariant(""),vTrue,COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse);
oSel.ReleaseDispatch();
oDocs.ReleaseDispatch();//断开关联
//退出WORD
m_App.Quit(vOpt,vOpt,vOpt);
m_App.ReleaseDispatch();
当然同样感谢wangminjing提供的代码,不过,你的代码和我目前的代码基本类似,执行时应该会出现同样的问题!
我昨天晚上看了一篇贴子,上面好像有值得我们注意的地方,就是先判断是否已经有WINWORD.EXE,如果有就不再创建。大致的代码如下:
COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);// 缺省对象 CComVariant tpl(lpszFilePath),
NewTemplate(false),
DocType(0),
Visble; CComVariant SaveChanges(false),
OriginalFormat,
RouteDocument;
CApplication oWordApp ;
CDocuments oDocs ;
CDocument0 oDoc ;
HRESULT hr ;
IUnknown *pUnk ;
IDispatch *pDisp ;
CLSID clsid ;
hr = CoInitialize( NULL ); //ASSERT( !FAILED(hr) );
if ( FAILED(hr) ){
AfxMessageBox( TEXT("failed to call CoInitialize()" ));
} CLSIDFromProgID( TEXT("Word.Application"), &clsid );
// 查看是否有已经打开的Word对象
hr = GetActiveObject( clsid, NULL, (IUnknown**)&pUnk );
// 若有word在运行,就得到当前运行word的实例
if ( !FAILED(hr) ){
hr = pUnk->QueryInterface( IID_IDispatch, (void **)&pDisp );
ASSERT( !FAILED(hr) ); oWordApp.AttachDispatch( pDisp, TRUE ); pUnk -> Release();
}
// 若无,则新建一个Word对象
else {
if ( !oWordApp.CreateDispatch( TEXT( "Word.Application" ),NULL) ){ AfxMessageBox( TEXT( "创建ms_word对象失败" ) );
rval = RC_CANCELED_BY_USER ;
goto PROC_END ; }
} // 创建文档
oDocs.AttachDispatch( oWordApp.get_Documents() ); // 打开一个新文档,将文件的内容添加到新文档中
oDoc.AttachDispatch( oDocs.Add( &tpl , &NewTemplate , &DocType , &Visble ) ); //===================================
// 其他处理word文件的代码
//=====================================
// 关闭word文档
//oWordApp.Quit( vFalse, &OriginalFormat, &RouteDocument ); // 若用此方法关闭word,则用户打开的word也被关闭,用close
oDoc.Close( vFalse, &OriginalFormat, &RouteDocument );// vFalse若为vTrue,则新文档不能关闭
这篇文章是huimin yu写的,大家可以去看看:
file:///C:/Documents%20and%20Settings/Administrator/桌面/查看是否有已经打开的Word对象%20-%20yuhuimin111的专栏%20-%20CSDNBlog.mht
她是用VS 2005写的代码
其中的CLSIDFromProgID( TEXT("Word.Application"), &clsid );在我的机器安装的VC 6.0环境下,老是报错,说什么第一个变量无法转换成第二个变数,还请大家帮忙找找原因。谢谢!
兄弟,地址应该是这样的:http://blog.csdn.net/yuhuimin111/archive/2008/09/10/2910260.aspx
忘了我是保存在自己机器上的。
谢谢swjtu_lqb的提示。
忘了我是保存在自己机器上的。
谢谢swjtu_lqb的提示。