我在内存中有一个System.IO.Packaging.Package(它是一个WordprocessingDocument),并希望将其流式传输到浏览器以保存它。 word文档已被基于MVC的应用程序修改,结果文件已针对当前请求进行了修改。
据我所知,该软件包代表一个包含许多部分的“zip”文件。这些部分包括页眉,页脚和主体文档。我已经单独修改了每个,现在想要将包流回给用户。
我可以获得单个部分流... package.GetPart(new Uri(“/ word / document.xml”,UriKind.Relative))。GetStream()
但是我不知道如何在整个文档(包)上获得输出流 - 而无需写入文件系统。
提前致谢
不 - 我认为我需要的是这样的......我已经在模板文档中读过并在内存中进行了修改。现在,我想将修改后的文档(未触摸模板)流回用户。
MemoryStream stream = new MemoryStream();
WordprocessingDocument docOut =
WordprocessingDocument.Create( stream, WordprocessingDocumentType.Document);
foreach (var part in package.GetParts())
{
using (StreamReader streamReader = new StreamReader(part.GetStream()))
{
PackagePart newPart = docOut.Package.CreatePart(
part.Uri, part.ContentType );
using (StreamWriter streamWriter = new StreamWriter(newPart.GetStream(FileMode.Create)))
{
streamWriter.Write(streamReader.ReadToEnd());
}
}
}
不幸的是 - 这会产生一个'腐败的'word文档......
答案 0 :(得分:0)
OpenXmlPackage.Close Method将所有部分中的所有更改保存到基础商店。如果您从流中打开了包,只需使用该流:
public Stream packageStream() {
var ms = new MemoryStream();
var wrdPk = WordprocessingDocument.Create(ms, WordprocessingDocumentType.Document);
// Build the package ...
var docPart = wrdPk.AddMainDocumentPart();
docPart.Document = new Document(
new Body(new Paragraph(new Run(new Text("Hello world.")))));
// Flush all changes
wrdPk.Close();
return ms;
}