7

Microsoft.Office.Interop.Wordを使用して、C#のMSWordウィンドウに表示されるテキストを取得しようとしています。ドキュメント全体やページではないことに注意してください。ユーザーに表示されるのとまったく同じコンテンツ。

次のコードは、単純なドキュメントで機能するようです。

Application word = new Application();
word.Visible = true;
object fileName = @"example.docx";
word.Documents.Add(ref fileName, Type.Missing, Type.Missing, true);

Rect rect = AutomationElement.FocusedElement.Current.BoundingRectangle;

Range r1 = word.ActiveWindow.RangeFromPoint((int)rect.Left, (int)rect.Top);
Range r2 = word.ActiveWindow.RangeFromPoint((int)rect.Left + (int)rect.Width, (int)rect.Top + (int)rect.Height);
r1.End = r2.Start;

Console.WriteLine(r1.Text.Replace("\r", "\r\n"));

ただし、ドキュメントにヘッダーなどの他の構造が含まれている場合は、テキストの一部のみが返されます。

それで、これを達成するための正しい方法は何ですか?

どうもありがとう!

更新されたコード

Rect rect = AutomationElement.FocusedElement.Current.BoundingRectangle;

foreach (Range r in word.ActiveDocument.StoryRanges) {
    int left = 0, top = 0, width = 0, height = 0;
    try {
        try {
            word.ActiveWindow.GetPoint(out left, out top, out width, out height, r);
        } catch {
            left = (int)rect.Left;
            top = (int)rect.Top;
            width = (int)rect.Width;
            height = (int)rect.Height;
        }
        Rect newRect = new Rect(left, top, width, height);
        Rect inter;
        if ((inter = Rect.Intersect(rect, newRect)) != Rect.Empty) {
            Range r1 = word.ActiveWindow.RangeFromPoint((int)inter.Left, (int)inter.Top);
            Range r2 = word.ActiveWindow.RangeFromPoint((int)inter.Right, (int)inter.Bottom);
            r.SetRange(r1.Start, r2.Start);

            Console.WriteLine(r.Text.Replace("\r", "\r\n"));
        }
    } catch { }
}
4

4 に答える 4

4

これにはいくつかの問題があるかもしれません:

  • その信頼性はありません。毎回一貫した結果を本当に得ることができますか? たとえば、単純な "=rand()" ドキュメントで、Word の状態を変更せずにプログラムを 5 回続けて実行します。これを行うと、毎回異なる範囲がコンソールに出力されます。最初にここから始めます。範囲を取得するためのロジックに何か問題があるようです。たとえば、rect.Left は、画面にそのまま残っている同じドキュメントに対して実行するたびに、異なる数値を返し続けます。
  • 他の話ではややこしいです。おそらく、RangeFromPoint は
    複数のストーリーの境界をまたいで拡張することはできません。ただし、そうであると仮定しましょう。各ストーリーを列挙する必要があります。

enumerator = r1.StoryRanges.GetEnumerator(); { while (enumerator.MoveNext() { Range current = (Range) enumerator.Current; } }

Office.Interop.Word.Document オブジェクトの現在表示されているページのテキストをプログラムで抽出する方法を調べてみましたか?

于 2012-06-30T15:29:14.710 に答える
1

おそらく、ページ要素全体での範囲選択の副作用が見られます。
ほとんどの場合、カーソルを画面の左上、画面の右下に移動すると、本文テキストのみが選択されます (ヘッダーやフッターは選択されません)。また、ドキュメントに列があり、それらの列が画面の外で開始または終了する場合、最初の列から最後の列までのテキストを選択すると、画面の外にある場合でもテキストが選択されます。

私の知る限り、矛盾を無視するか、すべてのユースケース (画像、列、テーブルなど) を具体的に処理したい場合を除き、目標を達成する簡単な方法はありません。

何をしようとしているのかを教えていただければ、代替案を提供できます。それ以外の場合は、回答を正しいものとしてマークしてください。

于 2012-06-30T15:46:39.540 に答える