2

.NET 4.0 を実行している VSTO 2010 を使用して .NET プログラムを開発しています。Word 文書のセットで特定の小見出しを見つけ、Word.Interopを使用してその小見出しの下のすべてのコンテンツ(「要件」など) をコピーしています。words に一致する for ループを使用して成功しました。これを使用して、この単語を検索し、次に次のセクションの開始単語 (「機能」など) を検索します。

現在、ドキュメントにはコンテンツ ページも含まれているため、コンテンツ セクションにある最初の出現箇所が返されるため、単純な単語の一致は機能しないことがわかりました。そこで、2 番目の出現を見つけようとしましたが成功しましたが、その単語が副見出しのかなり前に繰り返される可能性さえあることに気付きました。したがって、私はその文を見つけることに頼りました。ここで、両方の単語を見つけることに成功しました(検索文字列を「要件\ r」に変更する必要がありました。これは、そのように読み取られていたためです)。私が今直面している問題は、開始文と終了文を取得した後、文書全体を選択し、 MoveStart と MoveEnd を使用して、選択範囲を縮小してからコピーして別の単語文書に貼り付けたことです。、(RangeまたはBookmarkの使用については知りません)ただし、開始位置の移動に成功し、終了位置は正しいものの、MoveEndは常に実際の10文以上のテキストに移動します。私はこれで2週間になりますが、この問題について何か助けていただければ幸いです. 世界中のすべてのプログラマーを軽視しているわけではありません。私が使用しているコードを示しました。

使用される変数は自明です。//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 など) のみを抽出する方法があれば、非常に感謝しています。質問は私のやり方であり、私はより良い方法にもオープンです. よろしくお願いします。

4

0 に答える 0