由于项目需要将一个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被使用的对话框,自动保存模板
appclass.NormalTemplate.Saved = true;
下面是主要代码(由于所有代码太多,也没整理,就不贴出来),如果有问题或者不明之处,请与我联系!
doctype.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { savefilename, Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatHTML });//另存为Html格式
//避免弹出normal.dot被使用的对话框,自动保存模板
appclass.NormalTemplate.Saved = true;
object Unknown = Type.Missing;
docs.Close(ref Unknown, ref Unknown, ref Unknown); //关闭
wordtype.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, appclass, null);//退出