asp.net-mvc - 使用MVC打开xml替换word文件中的文本并返回内存流

标签 asp.net-mvc openxml docx openxml-sdk

我有一个包含指定模式文本 {pattern} 的 Word 文件,我想用从数据库读取的新字符串替换这些模式。因此,我使用从 docx 模板文件中打开 xml 读取流来替换我的模式字符串,然后返回到支持下载文件而无需创建临时文件的流。但是当我打开它时,它在 docx 文件上生成了错误。下面是我的示例代码

public ActionResult SearchAndReplace(string FilePath)
{
    MemoryStream mem = new MemoryStream(System.IO.File.ReadAllBytes(FilePath));
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(mem, 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!");

//Instead using this code below to write text back the original file. I write new string back to memory stream and return to a stream download file
        //using (StreamWriter sw = new //StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
        //{
        //    sw.Write(docText);
        //}

        using (StreamWriter sw = new StreamWriter(mem))
                    {
                        sw.Write(docText);
                    }
    }
    mem.Seek(0, SeekOrigin.Begin); 

    return File(mem, "application/octet-stream","download.docx"); //Return to download file
}

请建议我任何解决方案,而不是从Word文件中读取文本并替换那些预期的模式文本,然后将数据写回原始文件。是否有任何解决方案用 WordprocessingDocument 库替换文本?如何返回带有验证docx文件格式的内存流?

最佳答案

您所采取的方法不正确。如果您正在搜索的模式偶然与某些 Open XML 标记相匹配,则会损坏文档。如果您要搜索的文本被分割多次运行,您的搜索/替换代码将找不到该文本并且无法正确运行。如果您想要搜索和替换 WordprocessingML 文档中的文本,可以使用一个相当简单的算法:

  • 将所有运行分解为单个运行 特点。这包括运行 有特殊字符,例如 换行符、回车符或硬符 标签。
  • 这样就很容易找到 与字符匹配的一组运行 在您的搜索字符串中。
  • 一旦您确定了一组匹配的运行, 那么你可以替换那组运行 与新创建的运行(其中有 运行的运行属性 包含第一个字符 与搜索字符串匹配)。
  • 替换单字符运行后 通过新创建的运行,您可以 然后合并相邻的运行 相同的格式。

我写了一篇博文并录制了演示该算法的截屏视频。

博客文章:http://openxmldeveloper.org/archive/2011/05/12/148357.aspx
截屏:http://www.youtube.com/watch?v=w128hJUu3GM

-埃里克

关于asp.net-mvc - 使用MVC打开xml替换word文件中的文本并返回内存流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5671702/

相关文章:

asp.net-mvc - ASP.NET MVC 和 Expression XAML - 如何集成?

asp.net - MVC 条件 必填字段

c# - 模型列表的远程验证

c# - Azure,ClosedXML : Build will NOT include DocumentFormat. OpenXML 在我的应用程序的 bin 文件夹中

c# - 使用 OpenXML 将图像插入 DocX 并设置大小

c# - OpenXML ASP.NET c# : tablecell vertical alignment issues

php - 如何在 phpword 中更改字体(名称、大小、行间距)?

jquery - 为当前菜单设置 css 事件类

c++ - 是否有用于编写 docx 文件的开发工具包/库(用 C 或 C++ 编写)?

java - 是否可以将数据从数据库推送到 .docx 文件中的表中?