循环通过Word文档

时间:2016-05-18 10:17:33

标签: c# ms-word

我有一个以编程方式打开和读取Word文件内容的过程。该程序所花费的时间显然与文件的大小成比例,但平均可在大约8分钟内读取100个文件。偶尔,我收到以下Word错误:

  

该文件正由另一个应用程序或用户使用。   (C:\模板\的Normal.dotm)。通常会遇到此错误   当您尝试打开的文件上设置了读锁定时。

随后程序最终调用无数个Word.exe进程,任务管理器快速填满。

问:如何在启动新的Word进程以读取下一个文件之前改进我的等待过程。现在它似乎取决于读取前一个文件所花费的时间。 - 谢谢

 private void readWordDoc(bool reportMode, string file)
    {
        try
        {
            Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
            object miss = System.Reflection.Missing.Value;

            object path = @file;
            object readOnly = true;
            Microsoft.Office.Interop.Word.Document docs = word.Documents.Open(ref path, ref miss, ref readOnly, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
            string totaltext = "";
            for (int i = 0; i < docs.Paragraphs.Count; i++)
            {
                totaltext += "\n" + docs.Paragraphs[i + 1].Range.Text.ToString();
            }
            docs.Close();
            word.Quit();

            if (!reportMode)
            {
                rtxtDocViewer.Text = totaltext;
            }

            if (reportMode)
            {
                writeReport(totaltext, file);
            }                
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error loading doc. " + ex.Message);
        }
    }

3 个答案:

答案 0 :(得分:0)

尝试等待上一个Word进程在生成下一个进程之前死掉。

请参阅:https://stackoverflow.com/a/19577783/563088

可能需要一段时间才能真正关闭Word进程,如果循环在前一个进程关闭之前启动下一个Word进程,则可能会同时加载相同的模板。

答案 1 :(得分:0)

我建议使用OpenXML(如果使用正确的文件格式保存doc文件)。它将消除填充任务管理器的问题,并且您可以更轻松地使用并行性。

答案 2 :(得分:0)

以下代码行有助于最终纠正这种情况:

 word.NormalTemplate.Saved = true;

 private void readWordDoc(bool reportMode, string file)
    {
        try
        {
            Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
            object miss = System.Reflection.Missing.Value;

            object path = @file;
            object readOnly = true;
            Microsoft.Office.Interop.Word.Document docs = word.Documents.Open(ref path, ref miss, ref readOnly, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
            string totaltext = "";
            for (int i = 0; i < docs.Paragraphs.Count; i++)
            {
                totaltext += "\n" + docs.Paragraphs[i + 1].Range.Text.ToString();
            }
            docs.Close();
            word.NormalTemplate.Saved = true;
            word.Quit();

            if (!reportMode)
            {
                rtxtDocViewer.Text = totaltext;
            }

            if (reportMode)
            {
                writeReport(totaltext, file);
            }                
        }
        catch (Exception ex)
        {
            //MessageBox.Show("Error loading doc. " + ex.Message);
        }
    }