我有一个包含指定模式文本 {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/