3

Word Interop API を使用して、特定の色で強調表示されたテキストを削除するドキュメントがあります。要約すると、ロジックは次のようになります。

if(range.HighlightColorIndex == WdColorIndex.wdYellow)
{
    range.Delete();
}

range.HighlightColorIndex一部のドキュメントでは、値が返されることに気付きました: 999999.

WdColorIndex列挙型 (HighlightColorIndexプロパティの型) を調べると、列挙型が から-1までの間隔で値が割り当てられた要素で実装されていることがわかります。これは、返される数値16を説明していません999999

さらに、Word を使用して、奇妙な動作に気付きました。黄色で強調表示された 2 つの行 (最初の行にはテキストとハイパーリンクが含まれ、2 番目の行にはテキストのみが含まれます) を持つ新しいドキュメントを作成します。

  • 文書を保存して初めて閉じる前に、Word は各行を 1 つずつ選択するときに黄色で強調表示されていることを認識します。
  • ドキュメントを保存して閉じ、再度開いた後、Word はテキストとハイパーリンクを含む行を強調表示されていると認識しなくなりますが、テキストのみの行は強調表示されていると認識されます。

ドキュメントを開いた後の Word のハイライト認識のスクリーンショットを次に示します。

可能性のある単語の強調表示のバグ

この調査から、これは Word のバグである可能性があるようですが、ここで何かが欠けていないことを確認したいので、基本的に、これが意図された動作なのかバグなのか、さらには何なのか、誰にもわかりません。適切なアプローチは、特定のケースで Word Interop を使用するときにそれに対処することでしょうか?

このシナリオでは、Office 2010 とバージョン 14 の Word Interop API を実行しています。

4

1 に答える 1

2

値 999999 は、現在の選択範囲にそれぞれの書式が複数含まれていることを示すために Word で使用されます。

あなたの例では、ハイパーリンクは強調表示された実行を含むWordフィールド(Alt-F9を押してコードビューを切り替える)として表されます。ドキュメントを再度開いた後、フィールド自体には強調表示が適用されません。これは必ずしも Word のバグではありません。(ハイパーリンク) フィールドがフィールド レベルの書式設定を覚えていないだけの動作です。

ただし、実際のタスクは、強調表示されたテキストをドキュメントから削除することのようです。これは通常Range.Find、Word のオブジェクトを使用してより適切に行うことができます。

range.Find.ClearFormatting();
range.Find.ClearAllFuzzyOptions();
range.Find.Highlight = 1;
range.Find.Replacement.ClearFormatting();
range.Find.Replacement.Text = "";
range.Find.Wrap = Word.WdFindWrap.wdFindContinue;
range.Find.Execute(Replace: Word.WdReplace.wdReplaceAll);

ハイライトを削除するために使用できる完全なサンプル プログラムを次に示します。

using System;
using System.Linq;
using Word = Microsoft.Office.Interop.Word;


class Program
{
    static void Main(string[] args)
    {
        var fileName = args[0];

        var wordApp = new Word.Application();
        wordApp.Visible = true;
        var document = wordApp.Documents.Open(fileName);
        RemoveHighlightingEverywhere(document);
    }

    static void RemoveHighlightingEverywhere(Word.Document document)
    {
        foreach (Word.Range storyRange in document.StoryRanges)
        {
            var range = storyRange;
            while (range != null)
            {
                RemoveHighlightingFromRange(range);

                if (range.ShapeRange.Count > 0)
                {
                    foreach (Word.Shape shape in range.ShapeRange)
                    {
                        if (shape.TextFrame.HasText != 0)
                        {
                            RemoveHighlightingFromRange(
                                shape.TextFrame.TextRange);
                        }
                    }
                }
                range = range.NextStoryRange;
            }
        }
    }

    static void RemoveHighlightingFromRange(Word.Range range)
    {
        range.Find.ClearFormatting();
        range.Find.ClearAllFuzzyOptions();
        range.Find.Highlight = 1;
        range.Find.Replacement.ClearFormatting();
        range.Find.Replacement.Text = "";
        range.Find.Wrap = Word.WdFindWrap.wdFindContinue;
        range.Find.Execute(Replace: Word.WdReplace.wdReplaceAll);
    }
}
于 2012-12-21T13:46:29.533 に答える