替换Word doc中的字符串 - 在MainDocumentPart中工作而不是在HeaderPart中

时间:2009-12-16 18:04:59

标签: c# ms-word openxml

我需要在word文档中进行简单的搜索和替换字符串。我认为这很容易,但不是(至少对我而言)

查看此代码(它需要一个流,打开文档的不同部分,搜索字符串,然后替换它)。

问题是只保存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);
                }
            }
        }
    }

是的,如果有更简单的方法来替换word doc中的字符串,请告诉我。

感谢您的帮助

Larsi

3 个答案:

答案 0 :(得分:4)

我最终使用了DocX。它是一个很棒的lib,并且有一个简单的替换功能。

http://docx.codeplex.com/

答案 1 :(得分:2)

当你在部件上调用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”,则可能无法通过简单的搜索和替换找到它。也许你的标题部分中的文字会以一种奇怪的方式分开。

答案 2 :(得分:2)

就像“MainDocumentPart”有一个保存方法: MainDocumentPart.Document.Save();

您还应该为标题调用Save方法: 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();

        }