Заменить строку в Word документ - Работает в MainDocumentPart не в HeaderPart - PullRequest
2 голосов
/ 16 декабря 2009

Мне нужно сделать простой поиск и заменить строку в текстовом документе. Я думал, что это будет довольно легко, но это не так (по крайней мере, для меня)

Проверьте этот код (он принимает поток, открывает другую часть документа, ищет строку, а затем заменяет ее).

Проблема в том, что сохраняется только то, что находится внутри MainDocumentPart и FooterPart. HeaderPart не сохраняется. Странно ...

        public static void ProcessDocument(Dictionary<string, string> properties, Stream fs)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open(fs, true))
        {
            string docText = null;
            using (StreamReader sr = new StreamReader(doc.MainDocumentPart.GetStream()))
            {
                docText = sr.ReadToEnd();
            }
            docText = DoTheReplace(properties, docText);
            using (StreamWriter sw = new StreamWriter(doc.MainDocumentPart.GetStream(FileMode.Create)))
            {
                sw.Write(docText);
            }
            foreach (FooterPart footer in doc.MainDocumentPart.FooterParts)
            {
                string footerText = null;
                using (StreamReader sr = new StreamReader(footer.GetStream()))
                {
                    footerText = sr.ReadToEnd();
                }
                footerText = DoTheReplace(properties, footerText);
                using (StreamWriter sw = new StreamWriter(footer.GetStream(FileMode.Create)))
                {
                    sw.Write(footerText);
                }
            }
            foreach (HeaderPart header in doc.MainDocumentPart.HeaderParts)
            {
                string headerText = null;
                using (StreamReader sr = new StreamReader(header.GetStream()))
                {
                    headerText = sr.ReadToEnd();
                }
                headerText = DoTheReplace(properties, headerText);
                using (StreamWriter sw = new StreamWriter(header.GetStream(FileMode.Create)))
                {
                    sw.Write(headerText);
                }
            }
        }
    }

И да, если есть более простые способы замены строки в слове doc, пожалуйста, дайте мне знать.

Спасибо за любую помощь

Larsi

Ответы [ 3 ]

4 голосов
/ 18 декабря 2009

В итоге я использовал DocX. Это отличная библиотека и простая функция замены.

http://docx.codeplex.com/

2 голосов
/ 29 июля 2011

Как и в «MainDocumentPart» есть метод для сохранения: MainDocumentPart.Document.Save ();

Вы также должны вызвать метод Save для Header: header.Header.Save ();

        foreach (HeaderPart header in doc.MainDocumentPart.HeaderParts)
        {
            string headerText = null;
            using (StreamReader sr = new StreamReader(header.GetStream()))
            {
                headerText = sr.ReadToEnd();
            }
            headerText = DoTheReplace(properties, headerText);
            using (StreamWriter sw = new StreamWriter(header.GetStream(FileMode.Create)))
            {
                sw.Write(headerText);
            }

            //Save Header
            header.Header.Save();

        }
2 голосов
/ 17 декабря 2009

Когда вы вызываете GetStream () для части, я считаю, что она возвращает всю XML-структуру части, а не только текстовую область. И Microsoft Word иногда разделяет слова в странных местах, поэтому строка типа

Hello World!

может выглядеть как

<w:p><w:r><w:t>Hel</w:t><w:t>lo </w:t><w:t>World!</w:t></w:r><w:p>

Так что, если вы пытаетесь заменить «Hello», он может не найти его с помощью простого поиска и замены. Возможно, текст в заголовке разделен таким странным образом.

...