- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习如何使用 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);
}
}
}
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/
我使用 openxml-sdk 创建了一个大型(约 1000 页)word 文档。当我第一次使用 word 应用程序打开它时,它在状态栏中显示“Word 正在对 test.docx 的页面重新编号”,
我对此有疑问: using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true)) { } 使用上
我正在尝试打开一个 Word 文档,更改一些文本,然后将更改保存到一个新文档中。我可以使用下面的代码完成第一步,但我不知道如何将更改保存到新文档(指定路径和文件名)。 using System; us
我想从 Word 文档中删除 XMLSchemaReference。运行 VBA 代码时,这很简单: ActiveDocument.XMLSchemaReferences("ActionsPane3"
我是 open xml sdk 的新手,我对文字处理文档的关系如何工作不太了解。我想从包含 webtask-pane 的现有文档中删除 webtask-pane 并通过编程方式添加它。 使用 open
我有以下代码通过“另存为”通过 OpenXML SDK 将 Word 文档保存到新文档中。然后我想尝试读取从 ASP.Net 创建的文件,但是我无法这样做,因为文件被锁定并且在应用程序池重新启动之前不
我有一个代码是我用 System.IO 读取字节数组格式的 docx 文档。后来我制作了一个 docx 字节数组流,并使用 WordprocessingDocument 来编辑 docx 流。 我编辑
我正在寻找一种方法来识别 DOCX 文件(如果它们被移动或重命名)。原因很明显,我正在使用 Open XML SDK,构建一个超链接检查器。 工作完美,至少可以添加或更新文档中的超链接。 问题是,如果
我正在尝试学习如何使用 Microsoft 的 Open XML SDK。我按照他们关于如何使用 FileStream 创建 Word 文档的步骤进行操作。它工作得很好。现在我想创建一个 Word 文
目前,我基于 Microsoft 站点上的“在文档部分 (Open XML SDK) 中搜索和替换文本”。我意识到在文件下载到我的驱动器后代码出现了问题。 所以我打开那个文件并收到一条消息 MEMOR
我是一名优秀的程序员,十分优秀!