2

Word文書内のテキストプレースホルダーを見つけて置き換える機能があります。これは、短いテキスト文字列でうまく機能します。ただし、より大きなテキスト文字列、つまりテキストの段落に置き換えようとすると、何もしません。

DocReplaceField(ref Word.Document objDoc, string Field, string Value)
{
   object missing = System.Reflection.Missing.Value;

   Word.Range range = objDoc.Content;

   object findtext = Field;
   object f = false;
   object findreplacement = Value;
   object findforward = false;
   object findformat = true;
   object findwrap = WdFindWrap.wdFindContinue;
   object findmatchcase = false;
   object findmatchwholeword = false;
   object findmatchwildcards = false;
   object findmatchsoundslike = false;
   object findmatchallwordforms = false;
   object findreplace = WdReplace.wdReplaceAll;

   range.Find.Execute(
       findtext,
       findmatchcase,
       findmatchwholeword,
       findmatchwildcards,
       findmatchsoundslike,
       findmatchallwordforms,
       findforward,
       findwrap,
       findformat,
       findreplacement,
       findreplace,
       missing,
       missing,
       missing,
       missing);
}

これは、「[プレースホルダー]」を「何か」に置き換えようとすると機能しますが、「[プレースホルダー]」を「何か」に置き換えるにはどうすればよいですか

"Nullam non lorem sapien, et imperdiet sapien. Curabitur vestibulum justo eu enim bibendum vulputate. Integer vel velit non elit molestie auctor non ut nisi. Suspendisse potential. Donec augue nulla, beforetibulum a pulvinar id, scelerisque quis mauris. Integer eget ullamcorper velit. Sed at purus sit amet felis pulvinar dictum at non neque. Praesent laoreet mauris id sem venenatis pellentesque."

例えば

アップデート:

問題は、単語の検索と置換で 255 文字を超える文字を置換できないことです。検索はプレースホルダーと一致していますが、実際にテキストを置き換えることはできません。find を呼び出してプレースホルダーを見つけた後、手動でテキストを選択して新しいテキストを挿入する例はありますか? 検索と置換という言葉を使用する代わりに。

4

6 に答える 6

2

私がしていることは、置換文字列を小さな断片に分割し、最後のものを除くすべての文字列の最後にプレースホルダーを追加してから、文字列の断片と同じ回数だけ置換コマンドを繰り返すことです。小さい文字列でも機能するため、別の方法を使用する必要はありません。

string acierto; // where acierto is my placeholder
string[] cadenas;
cadenas = BSV.Funciones.ParteCadenas(valor, 170); // function to split a string into 170 character pieces

for (int xx = 0; xx < cadenas.Length; xx++)
{
    if (xx < cadenas.Length - 1) cadenas[xx] += acierto;
    parrafo.Range.Find.Execute(acierto, nulo, nulo, nulo, nulo, nulo, nulo, nulo, nulo, cadenas[xx], WdReplace.wdReplaceAll, nulo, nulo, nulo, nulo);
}
于 2015-11-09T12:45:42.580 に答える
2

テキストを置き換えるのは非常に簡単です。テキストが見つかったら、ドキュメントの見つかった部分が範囲オブジェクトに含まれます。最初に見つかったテキストを削除してから、新しいテキストを挿入する必要があります。

range.Find.Execute(findtext, findmatchcase, findmatchwholeword, 
    findmatchwildcards, findmatchsoundslike, findmatchallwordforms, findforward, 
    findwrap, findformat, findreplacement, findreplace, missing, 
    missing, missing, missing);

range.Delete();
range.Text = "This is the new content.";
于 2013-01-08T13:31:26.200 に答える
0

検索と置換の代わりに Word のブックマークを使用してみてください。

スニッパーの例 -

object oBookMark = "MyBookmark";
oDoc.Bookmarks.Item(ref oBookMark).Range.Text = "Some Text Here";
于 2013-01-08T12:54:56.623 に答える
0

あなたの問題は、おそらく複数行のテキストの検索です。

行をまたぐたびに「\r\n」を追加してみてください。また、そのような複数行の文字列を作成することはできません。最初に @ を使用する必要があります。

@"firstLine\r\n
second";

それ以外には、execute メソッドに複数行のオプションはありません。execute メソッドの引数にはすべてデフォルト値があることに注意してください。名前付きパラメーターを使用して、使用しないパラメーターを除外することができます。

また、複数の行が実際に問題を引き起こしている質問を編集してください。

編集:置換テキストを引数として指定する代わりに、後で設定する必要があります。 http://social.msdn.microsoft.com/forums/en-US/vsto/thread/9c50450e-9579-4e89-8e9c-8c84c8319d0b

range.Execute(... arguments ...);
range.Text = "Replacement text more than 255 characters";

もう 1 つのオプションは、置換テキストとして ^c を使用することです。これにより、Word は、クリップボードに配置されたテキストを置換テキストとして使用するようになります。 http://word.tips.net/T000021_Replaceing_Long_Blocks_of_Text.html

System.Windows.Forms.Clipboard.SetText("Replacement text longer than 255 chars");
range.Execute(... replacementText: "^c ...); // don't actually know where you enter your replacement text :P
于 2013-01-08T13:02:38.807 に答える