我想为我的应用程序的用户提供下载docx文件,该文件包含动态内容,具体取决于他们的请求。 我准备了一个带有标题的模板,否则OpenXML创建在某个地方很痛苦。 现在我在编辑它时遇到了麻烦,并在我的ASP MVC应用程序中将其作为FileResult返回。
我的计划是将文件读取到MemoryStream
并将其编辑为WordprocessingDocument
,然后返回MemoryStream as Byte[]
。
我有两个问题:
WordprocessingDocument
,我就没有办法将其转换为FileResult()
想要的形状。WordprocessingDocument
创建新的MemoryStream
,我可以简单地创建内容并将其作为File
返回,但我缺少先前准备的包含所需内容的标题。 那么,如何修改.docx
模板并将其作为FileResult()
返回?
答案 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的帮助下,我成功实现了目标。
所以期望的"工作流程"是:
.docx
模板(已添加标题或其他内容)复制到内存FileResult
返回,而不保存对模板的更改所以这是代码:
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");
}
一些重要的注释:
mainPart.Document.Save()
更改才能在MemoryStream
.ToArray()
否则返回的文件已损坏