C#关闭word时,提示“此文件正由另一个应用程序或用户使用” normal.dot - 勤奋的菜鸟

时间:2024-02-25 14:55:12

C#关闭word时,提示“此文件正由另一个应用程序或用户使用” normal.dot

由于项目需要将一个doc文件转换成一个html文件,同时显示在web页面上.在项目开始前期时,做了Demo后,没有发现什么问题,到真正开始时,问题就来了!
第一:在转换成html文件后,打开html时,有时会提示文件正在使用之类的,通过强大的谷歌得到的结果是说,由于内存没有及时释放(运行速度问题吧,因为我是有退出了word对象的),那我就让当前程       序停留半秒Thread.Sleep(500);,果然,问题解决了.一切正常.
第二:隔后以现,第二个问题又出现了,就是当你本地打开了一个word程序(即使不同个文件),然后再用C#去转换成html,再打开html时,又是报了一个正在使用之类的提示.这时就觉得奇怪了,我本地又没有打开页面上打开的文件.最后发现,我只是退出,没有关闭
 
关闭代码:
        object Unknown = Type.Missing;
        docs.Close(ref Unknown, ref Unknown, ref Unknown);
退出代码:
        wordtype.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, appclass, null);//退出
 
加上关闭后,勉强算是可以实现了,为啥说是勉强呢,因为在打开之前页面之前(就是转换成html成功之后,要退出word的时候),会提示“此文件正由另一个应用程序或用户使用” c:\Documents and Settings..\normal.dot
其实他大概的意思就是你更新了模板,要不要替换之类的吧!这时你打开一个word,选择"工具->模板->把自动更新样式的勾去掉"就行了(网上是这样说的,不过本人试了,公司的电脑这样可以解决问题,但本人的笔记本不能解决),最后在ApplicationClass对象里面,有一个可以保存模板的属性,只要将这个属性设置成true就行了.
//避免弹出normal.dot被使用的对话框,自动保存模板
wordApp.NormalTemplate.Saved = true;
 
下面是主要代码
//获得word文件的文本内容
        public string Word2Text(string docFileName)
        {
            //实例化COM
            Microsoft.Office.Interop.Word.ApplicationClass wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
            object fileobj = docFileName;
            object nullobj = System.Reflection.Missing.Value;
            //打开指定文件(不同版本的COM参数个数有差异,一般而言除第一个外都用nullobj就行了)
            Microsoft.Office.Interop.Word._Document doc = wordApp.Documents.Open(ref fileobj, ref nullobj, ref nullobj,
            ref nullobj, ref nullobj, ref nullobj,
            ref nullobj, ref nullobj, ref nullobj,
            ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj
            );
            //取得doc文件中的文本
            string outText = doc.Content.Text;
            //避免弹出文件(normal.dot)被使用的对话框,自动保存模板
            wordApp.NormalTemplate.Saved = true;
            //关闭文件
            doc.Close(ref nullobj, ref nullobj, ref nullobj);
            //关闭COM
            wordApp.Quit(ref nullobj, ref nullobj, ref nullobj);
            //返回
            return outText;
        }