MSWord自动化:保存后获取文件内容

时间:2010-03-17 05:32:28

标签: c# automation ms-word

我有一个使用MSWord自动化编辑某些文档的应用程序,保存并关闭后我需要抓取修改后的文件并将其放回存储库,只有一种情况我不能让它工作,那就是 当用户对文件进行更改时,选择关闭单词并选择是以保存文件

我正在使用2个事件:  DocumentBeforeSave  退出

在Quit事件上我正在尝试从磁盘加载.docx文件但是在这个特殊情况下我得到一个IOException,因为该文件仍在使用中,不知怎的,我需要等到Quit事件处理完毕后,当Word实际关闭且文件不再使用时

现在我正在使用此

      word.Visible = true; 
        while (!wordDone) { //gets changed to true on the Quit event
            System.Threading.Thread.Sleep(100);
        }
        bool error = false;
        do {
            try { //need to load the contents of the modified file
                ls.Content = System.IO.File.ReadAllBytes(provider.GetFileName());
                error = false;
            }
            catch (System.IO.IOException) {
                error = true;
                System.Threading.Thread.Sleep(200);
            }
        } while (error);

虽然这很有效,但我需要一种方法来处理Quit事件后触发事件,或者在word仍在运行时阻止当前线程,或者在文档保存后获取事件,底线是我需要一个干净的方式来加载文件后保存和关闭单词。 DocumentAfterSave会很棒,但似乎不存在。

我也尝试解除Quit处理程序并在Quit处理程序上调用word.Quit,这没什么区别

我也正在调查ManualResetEvent或相关类的使用,到目前为止它几乎可以正常工作,但我仍然需要在发出信号后暂停,以确保word被关闭且文件不再使用

2 个答案:

答案 0 :(得分:2)

我过去也遇到过类似的问题。我不认为有任何干净的方式,但不是像上面那样做,如何考虑这个(如果你有一个受控的环境将适合)

  • 创建word app
  • 使用与Winword匹配的GetProcesses立即获取进程ID,列表返回中的最后一个应该是您所追求的。这在多用户环境中并非100%可靠。
  • 单词退出后,使用Thread.Sleep循环确保PID不再存在。
  • 阅读自定义操作的docx

答案 1 :(得分:1)

我曾经遇到过同样的问题。在所有与COM相关的对象上使用ReleaseComObject就可以了(即在Word文档对象和Word.Application对象上)。这样,您可以确保在销毁COM对象后删除所有脏锁。使用Interop API关闭文档和应用程序。我用:

   var localWordapp = new Word.Application();
   localWordapp.Visible = false;
   Word.Document doc = null;
   // ...
    if (doc != null)
    {
      doc.Close();
      System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
    }
    localWordapp.Quit();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(localWordapp);