2

我需要对 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 文档中的字符串,请告诉我。

谢谢你的帮助

拉尔西

4

3 回答 3

3

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

http://docx.codeplex.com/

于 2009-12-18T13:40:28.780 回答
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”,则使用简单的搜索和替换可能找不到它。也许您的标题部分中的文本以一种奇怪的方式被拆分。

于 2009-12-16T21:52:15.343 回答
2

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

您还应该调用 Header 的 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();

        }
于 2011-07-29T00:46:52.340 回答