gpt4 book ai didi

c# - 使用 MemoryStream 的 Open XML WordprocessingDocument 为 0KB

转载 作者:行者123 更新时间:2023-12-04 10:13:36 25 4
gpt4 key购买 nike

我正在尝试学习如何使用 Microsoft 的 Open XML SDK。我按照他们关于如何使用 FileStream 创建 Word 文档的步骤进行操作。它工作得很好。现在我想创建一个 Word 文档,但只在内存中,并等待用户指定是否要保存文件。

This document by Microsoft说明如何使用 MemoryStream 处理内存中的文档,但是,文档首先从现有文件加载并“转储”到 MemorySteam .我想要的是完全在内存中创建一个文档(而不是基于驱动器中的文件)。我认为会实现的是这段代码:

// This is almost the same as Microsoft's code except I don't
// dump any files into the MemoryStream
using (var mem = new MemoryStream())
{
using (var doc = WordprocessingDocument.Create(mem, WordprocessingDocumentType.Document, true))
{
doc.AddMainDocumentPart().Document = new Document();
var body = doc.MainDocumentPart.Document.AppendChild(new Body());
var paragraph = body.AppendChild(new Paragraph());
var run = paragraph.AppendChild(new Run());
run.AppendChild(new Text("Hello docx"));

using (var file = new FileStream(destination, FileMode.CreateNew))
{
mem.WriteTo(file);
}
}
}

但结果是一个 0KB 的文件,Word 无法读取。一开始我以为是 MemoryStream的大小所以我为它提供了 1024 的初始大小,但结果是一样的。另一方面,如果我更改 MemoryStream对于 FileStream它完美地工作。

我的问题是我想做的事情是否可行,如果可以,怎么做?我想这一定是可能的,而不是我的做法。如果不可能,我有什么选择?

最佳答案

这里有几件事:

首先,与 Microsoft 的示例不同,我嵌套了 using在创建和修改文件的 block 内将文件写入磁盘的 block 代码。 WordprocessingDocument被保存到流中,直到它被释放或当 Save()方法被调用。 WordprocessingDocument到达 using 末尾时自动处理堵塞。如果我没有嵌套第三个 using 语句,从而到达第二个 using 的末尾在尝试保存文件之前声明,我会允许将文档写入 MemoryStream - 相反,我正在将一个仍然空的流写入磁盘(因此是 0KB 文件)。

假设 调用Save()可能有帮助,但.Net核心(这是我正在使用的)不支持它。您可以查看是否Save()通过检查 CanSave 在您的系统上受支持.

/// <summary>
/// Gets a value indicating whether saving the package is supported by calling <see cref="Save"/>. Some platforms (such as .NET Core), have limited support for saving.
/// If <c>false</c>, in order to save, the document and/or package needs to be fully closed and disposed and then reopened.
/// </summary>
public static bool CanSave { get; }

所以代码最终与微软的代码几乎相同,只是我没有事先读取任何文件,而是从一个空的 MemoryStream 开始。 :
using (var mem = new MemoryStream())
{
using (var doc = WordprocessingDocument.Create(mem, WordprocessingDocumentType.Document, true))
{
doc.AddMainDocumentPart().Document = new Document();
var body = doc.MainDocumentPart.Document.AppendChild(new Body());
var paragraph = body.AppendChild(new Paragraph());
var run = paragraph.AppendChild(new Run());
run.AppendChild(new Text("Hello docx"));
}

using (var file = new FileStream(destination, FileMode.CreateNew))
{
mem.WriteTo(file);
}
}

此外,您无需在保存之前重新打开文档,但如果您确实记得使用 Open()而不是 Create()因为 Create()将清空 MemoryStream你也会以一个 0KB 的文件结束。

关于c# - 使用 MemoryStream 的 Open XML WordprocessingDocument 为 0KB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61196148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com