Selection.MoveEnd在使用Word Interop和C#操作Word文档时不起作用

时间:2013-06-24 09:10:07

标签: c# .net ms-word ms-office office-interop

我正在使用运行.NET 4.0的VSTO 2010开发.NET程序,以在一组word文档中查找特定的子标题,并使用<复制该子标题下的所有内容(比如“要求”)强> Word.Interop 即可。我通过 for循环匹配单词成功,使用它我搜索这个单词,然后搜索下一部分的起始单词(比如“功能”)。

现在文档也有一个内容页面,所以我发现简单的单词匹配不会,因为它会返回第一个看到的出现,肯定是在内容部分。所以我试着找到第二次成功但是后来意识到这个词甚至可能在副标题之前重复出现。因此我求助于找到这句话。在这里我成功地找到了这两个词(我不得不将搜索字符串修改为“要求\ r \ n”,因为这就是它的读取方式) 无论如何。我现在面临的问题是,在我得到起始和结束句子之后,我选择整个文档并使用MoveStart和MoveEnd,我在复制之前减少了选择并将其粘贴到另一个word文档中 ,(因为我不知道使用范围或书签)  然而,虽然我成功地移动了开始并且虽然结束位置是正确的,但 MoveEnd总是移动到一些文本,这个文本至少比实际多10个句子。我已经在这里待了两个星期了,对此事的任何帮助都将不胜感激。我并不是说对世界上所有程序员都有任何不尊重。 我已经展示了我正在使用的代码。

使用的变量是不言自明的。 // SourceApp和SourceDoc - 读取发行说明源的Word应用程序 // DestinationApp和DestinationDoc =写入新文档的Word应用程序

    private void btnGenerate_Click(object sender, EventArgs e)
    {
        int startpos = findpos(SourceDoc, 1, starttext, sentencecount);
        int endpos = findpos(SourceDoc, startpos, endtext, sentencecount);

        object realstart = startpos - 1; // To retain the subheading
        object realend = -(sentencecount - (endpos - 1)); // to subtract the next subheading

        SourceDoc.Activate();
        SourceDoc.ActiveWindow.Selection.WholeStory();
        SourceDoc.ActiveWindow.Selection.MoveStart(WdUnits.wdSentence, realstart);
        SourceDoc.ActiveWindow.Selection.MoveEnd(WdUnits.wdSentence, realend); // the problematic bit
        SourceDoc.ActiveWindow.Selection.Copy();
        IDataObject data = Clipboard.GetDataObject();
        string allText = data.GetData(DataFormats.Text).ToString();

        DestinationDoc.Activate();
        DestinationDoc.ActiveWindow.Selection.WholeStory();
        DestinationDoc.ActiveWindow.Selection.Delete();
        DestinationDoc.ActiveWindow.Selection.Paste();
        DestinationDoc.Save();

        ((_Application)SourceApp).Quit();
        ((_Application)DestinationApp).Quit();
        textBox1.AppendText(allText);

    }


    int findpos(Document docx, int startpos, string txt, int sentencecount)
    {
        int pos = 0;
        string text;
        for (int i = startpos; i <= sentencecount; i++)
        {
            text = docx.Sentences[i].Text;
            if (string.Equals(text, txt))
            {
                pos = i;
                break;
            }
        }

        return pos;
    }

如果有办法提取特定的子标题(如3.1,5.2.3等),我也非常感激,这正是我想要实现的。问题只是我的做事方式,我也对更好的方式持开放态度。 提前谢谢了。

0 个答案:

没有答案