编辑OpenXML docx模板并将其作为FileResult

时间:2018-03-20 09:10:01

标签: asp.net asp.net-mvc openxml

我想为我的应用程序的用户提供下载docx文件,该文件包含动态内容,具体取决于他们的请求。 我准备了一个带有标题的模板,否则OpenXML创建在某个地方很痛苦。 现在我在编辑它时遇到了麻烦,并在我的ASP MVC应用程序中将其作为FileResult返回。

我的计划是将文件读取到MemoryStream并将其编辑为WordprocessingDocument,然后返回MemoryStream as Byte[]

我有两个问题:

  1. 如果我直接从没有内存流的文件中读取WordprocessingDocument,我就没有办法将其转换为FileResult()想要的形状。
  2. 如果我使用空WordprocessingDocument创建新的MemoryStream,我可以简单地创建内容并将其作为File返回,但我缺少先前准备的包含所需内容的标题。
  3. 那么,如何修改.docx模板并将其作为FileResult()返回?

2 个答案:

答案 0 :(得分:1)

这是您使用index = nb_col*y + x创建新电子表格文档然后将其保存到angular.module('myApp', []) .directive('myDirective', function() { return { link: function(scope, element, attributes) { element.addClass('some-class'); ... } }; });

的方法
MemoryStream

答案 1 :(得分:0)

在FortyTwo的帮助下,我成功实现了目标。

所以期望的"工作流程"是:

  1. .docx模板(已添加标题或其他内容)复制到内存
  2. 编辑文档内容
  3. 将此文档作为FileResult返回,而不保存对模板的更改
  4. 所以这是代码:

    public FileResult EditDOCXBody()
    {
        // Prepare file path
        string file = "../WordTemplates/EmptyTemplate.docx";
        String fullFilePath = HttpContext.ApplicationInstance.Server.MapPath(file);                   
    
        // Copy file content to MemeoryStream via byte array
        MemoryStream stream = new MemoryStream();                          
        byte[] fileBytesArray = System.IO.File.ReadAllBytes(fullFilePath);  
        stream.Write(fileBytesArray, 0, fileBytesArray.Length);             // copy file content to MemoryStream
        stream.Position = 0;                                                
    
        // Edit word document content
        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(stream, true))  
        {
            MainDocumentPart mainPart = wordDoc.MainDocumentPart;                
            Body body = mainPart.Document.Body;
    
            // add some text to body
            body.Append(new Paragraph(
                        new Run(
                            new Text("Current time is: " + DateTime.Now.ToLongTimeString()))));
    
            // Save changes to reflect on stream object
            mainPart.Document.Save();                
        }
        return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "servedFilename.docx");            
    }
    

    一些重要的注释:

    • 您需要手动将文件字节写入MemoryStream,否则会出现内存流不可扩展错误。更多信息here
    • 您必须使用mainPart.Document.Save()更改才能在MemoryStream
    • 上生效
    • 返回文件时,必须使用.ToArray()否则返回的文件已损坏
相关问题