2

ここで説明されているように、docxファイル内の単語を置き換えようとしています:

public static void SearchAndReplace(string document)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        string docText = null;
        using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
        {
            docText = sr.ReadToEnd();
        }

        Regex regexText = new Regex("Hello world!");
        docText = regexText.Replace(docText, "Hi Everyone!");

        using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
        {
            sw.Write(docText);
        }
    }
}

ドキュメント内の SomeTest で次のような結果が得られる場合を除いて、これは正常に機能しています。

    <w:t>
        Some
    </w:t>
</w:r>

<w:r w:rsidR="009E5AFA">
    <w:rPr>
        <w:b/>
        <w:color w:val="365F91"/>
        <w:sz w:val="22"/>
    </w:rPr>
    <w:t>
        Test
    </w:t>
</w:r>

そしてもちろん、交換は失敗します。おそらく、docx で一部の単語を解読不能にする回避策はありますか? それとも、私は間違って置き換えていますか?

4

1 に答える 1

4

これを解決する 1 つの方法は、変換を行う前にドキュメントの xml を正規化することです。これを行うには、 OpenXml Powertoolsを利用できます。

xml を正規化するサンプル コード

 using (WordprocessingDocument doc =
            WordprocessingDocument.Open("Test.docx", true))
        {
            SimplifyMarkupSettings settings = new SimplifyMarkupSettings
            {
                NormalizeXml = true, // Merges Run's in a paragraph with similar formatting
                // Additional settings if required
                AcceptRevisions = true,
                RemoveBookmarks = true,
                RemoveComments = true,
                RemoveGoBackBookmark = true,
                RemoveWebHidden = true,
                RemoveContentControls = true,
                RemoveEndAndFootNotes = true,
                RemoveFieldCodes = true,
                RemoveLastRenderedPageBreak = true,
                RemovePermissions = true,
                RemoveProof = true,
                RemoveRsidInfo = true,
                RemoveSmartTags = true,
                RemoveSoftHyphens = true,
                ReplaceTabsWithSpaces = true
            };
            MarkupSimplifier.SimplifyMarkup(doc, settings);
        }

これにより、Open Xml ドキュメントのマークアップが簡素化され、ドキュメントをプログラムで操作しやすくなります。プログラムで開いている xml ドキュメントを操作する前に、私は常にそれを使用します。

これらのツールの使用に関する詳細については、こちらとブログ記事をご覧ください

于 2013-04-03T15:38:04.950 に答える