使用 OpenXML 和 MemoryStream 在 ASP.NET 程序中编辑和保存 .docx

Posted

技术标签:

【中文标题】使用 OpenXML 和 MemoryStream 在 ASP.NET 程序中编辑和保存 .docx【英文标题】:Editing & saving .docx in ASP.NET program using OpenXML & MemoryStream 【发布时间】:2016-08-23 14:20:23 【问题描述】:

我正在编写一个项目,它允许您直接从站点编辑 .docx 文档(我有一个需要编辑的模板)并将它们保存到您的计算机上。 我无法将已编辑的所有信息保存在文件中。

using (MemoryStream memoryStream = new MemoryStream())

    memoryStream.Write(byteArray, 0, byteArray.Length);
    using (WordprocessingDocument wDoc = WordprocessingDocument.Open(memoryStream, true))
    
        string docText = null;
        using (StreamReader sr = new StreamReader(wDoc.MainDocumentPart.GetStream()))
        
            docText = sr.ReadToEnd();
        

        var senderData = Sender_Textbox.Text;
        var receiverData = Receiver_Textbox.Text;
        var subjectData = Subject_Textbox.Text;
        var contentData = Content_Textbox.Text;

        docText = ReplaceData(docText, "receiver", receiverData);
        docText = ReplaceData(docText, "sender", senderData);
        docText = ReplaceData(docText, "subject", subjectData);
        docText = ReplaceData(docText, "content", contentData);

        using (StreamWriter sw = new StreamWriter(wDoc.MainDocumentPart.GetStream(FileMode.Create)))
        
            sw.Write(docText);
        
    
    Session["ByteArray"] = memoryStream.ToArray();


static string ReplaceData(string docText, string oldText, string newText)

    var regexText = new Regex(oldText);
    return regexText.Replace(docText, newText);

我使用了 Office 开发中心的 this 教程,它在离线解决方案中运行良好。带有 StreamWriter 的部分不起作用,我下载了一个完全没有变化的文档。如何将我在线编辑的所有信息保存在 wDoc 中?

【问题讨论】:

【参考方案1】:

您正在将更新的文档文本写入StreamWriter sw,但随后没有对其进行任何操作。然后,您将会话变量设置为原始的、未编辑的字节数组 memoryStream(这可能是您返回没有更改的文档的原因)。

您需要将sw 转换为字节数组并将其放入Session["ByteArray"]

此外,会话变量中的大字节数组似乎不是一个非常好的主意。

【讨论】:

以上是关于使用 OpenXML 和 MemoryStream 在 ASP.NET 程序中编辑和保存 .docx的主要内容,如果未能解决你的问题,请参考以下文章

Open XML SDK - 使用 MemoryStream 作为 docx 持有者从模板 (dotx) 创建 docx

使用 MemoryStream 和 CryptoStream 满足代码分析处置规则 [重复]

不同的线程访问 MemoryStream

使用 OpenXML 和 Regex 在 Word Docx 中查找和替换撇号(')的问题

使用OpenXML操作Office文档

dotnet OpenXML 聊聊文本段落对齐方式