3

テキストボックスに関するその問題への追加については、この投稿の最後を見てください!

この方法では、ドキュメントを開き、一部のテキストを置き換えてから、そのままにしておきます。それは機能します、それは誇りに思うことです。:D

public static void replaceInOpenXMLDocument(string pfad, string zuErsetzen, string neuerString)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(pfad, true))
            {
                var res = from bm in doc.MainDocumentPart.Document.Body.Descendants()
                          where bm.InnerText != string.Empty && bm.InnerText.Contains(zuErsetzen) && bm.HasChildren == false
                          select bm;

                foreach (var item in res)
                {
                    item.InsertAfterSelf(new Text(item.InnerText.Replace(zuErsetzen, neuerString)));
                    item.Remove();
                }
                doc.Close();
            }
        }

ただし、特殊文字なしの置換でのみ機能します。例えば:

OSはWindows over 9000に置き換わる

【OS】はそのまま残します。

ケース 1:

ドキュメント内:

どんな目的でも os を使用します。

replaceInOpenXMLDocument("C:\NSA\suspects.docx", "os", "Win 2000");

これは次のようになります。

どんな目的でも Win 2000 を使用します。

ケース 2:

特殊文字で...

[os] は、どんな目的にも使用できます。

replaceInOpenXMLDocument("C:\NSA\suspects.docx", "[os]", "Win 2000");

...それは私を無視するだけです:

[os] は、どんな目的にも使用できます。

いくつかの特殊文字()[]{}などを試しましたが、置き換えられません。

やり忘れたことはありますか?それとも、この方法で特殊文字に置き換えることができないのでしょうか? もしそうなら、簡単な回避策が必要です。

私の絶望を助けてくれる人はいますか?:)

解決策 / 追加 1:

フラワーキングに感謝します!これは私が今使っているコードです:

public static void replaceInOpenXMLDocument(string pfad, string zuErsetzen, string neuerString)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(pfad, true))
            {
                SimplifyMarkupSettings settings = new SimplifyMarkupSettings
                {
                    NormalizeXml = true, // Merges Run's in a paragraph with similar formatting

                };
                MarkupSimplifier.SimplifyMarkup(doc, settings);

                //zuErsetzen = new XElement("Name", zuErsetzen).Value;
                var res = from bm in doc.MainDocumentPart.Document.Body.Descendants()
                          where bm.InnerText != string.Empty && bm.InnerText.Contains(zuErsetzen) && bm.HasChildren == false
                          select bm;
                // bm.InnerText.Contains(zuErsetzen)

                foreach (var item in res)
                {
                    item.InsertAfterSelf(new Text(item.InnerText.Replace(zuErsetzen, neuerString)));
                    item.Remove();
                }

                doc.Close();
            }
        }

(このコードは、通常のテキストを含む通常のドキュメントで機能します!)

解決策/追加 2: textboxesの テキストを置き換えたい場合は、少し回避策を講じる必要がありました。テキストボックスは画像として宣言されているため、上記のコードはそれに触れません。

テキストボックスでも検索する追加のクラス ( link ) を見つけました。ZIP ダウンロードには、理解しやすい例のプログラムが含まれています。

4

1 に答える 1

4

これは、通常、テキストに特殊文字が含まれている場合、次のような Open XML ワードが作成されるためです。

  <w:r w:rsidRPr="00316587">
    <w:rPr>
      <w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:eastAsia="Times New Roman" w:cs="Consolas" />
      <w:color w:val="823125" />
      <w:sz w:val="20" />
      <w:szCs w:val="20" />
      <w:lang w:eastAsia="en-GB" />
    </w:rPr>
    <w:t>[</w:t>
  </w:r>
  <w:proofErr w:type="gramStart" />
  <w:r w:rsidRPr="00316587">
    <w:rPr>
      <w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:eastAsia="Times New Roman" w:cs="Consolas" />
      <w:color w:val="823125" />
      <w:sz w:val="20" />
      <w:szCs w:val="20" />
      <w:lang w:eastAsia="en-GB" />
    </w:rPr>
    <w:t>text-to-replace</w:t>
  </w:r>
  <w:proofErr w:type="gramEnd" />
  <w:r w:rsidRPr="00316587">
    <w:rPr>
      <w:rFonts w:ascii="Consolas" w:hAnsi="Consolas" w:eastAsia="Times New Roman" w:cs="Consolas" />
      <w:color w:val="823125" />
      <w:sz w:val="20" />
      <w:szCs w:val="20" />
      <w:lang w:eastAsia="en-GB" />
    </w:rPr>
    <w:t>]</w:t>
  </w:r>
</w:p>

上記は、テキスト用に作成されたオープン xml を示しています[text-to-replace]。(これは常に当てはまるとは限らないことに注意してください。使用しているクライアントによって異なる場合があります)。

コードの外観では、ドキュメントの本文全体doc.MainDocumentPart.Document.Body.Descendants()のすべてのOpenXmlPartタイプの子孫を取得し、1 つずつ反復するテキストを置き換えようとしています。これにより、実際のテキストは 1 つの部分になり、特殊文字は 2 つの領域に残ります。部品。したがって、コードは必要なものを達成できません。

これを回避するには、さまざまな方法があるかもしれません。

解決:

良い (私の好みの) 解決策は、OpenXml Powertoolsの Markup Simplifier を使用して xml を正規化することです。これにより、開いている xml マークアップを正規化して段落内のテキストを連結し、プログラムによる作業を簡素化します。

コード例:

using (WordprocessingDocument doc =
            WordprocessingDocument.Open("Test.docx", true))
 {
      SimplifyMarkupSettings settings = new SimplifyMarkupSettings
      {
             NormalizeXml = true, // Merges Run's in a paragraph with similar formatting

       };
        MarkupSimplifier.SimplifyMarkup(doc, settings);
  }

使用の詳細については、こちらの回答を参照してくださいMarkupSimplifier

お役に立てれば :)

于 2013-08-29T13:00:49.730 に答える