gpt4 book ai didi

templates - Open XML SDK - 使用 MemoryStream 作为 docx 持有者从模板 (dotx) 创建 docx

转载 作者:行者123 更新时间:2023-12-02 23:57:16 25 4
gpt4 key购买 nike

我正在尝试使用 OpenXML 2.5 库从 Word 模板 (.dotx) 创建 .docx 文件。更确切地说,我正在尝试遵循 this ,但我想使用 MemoryStream 打开文档,而不是文件的路径。

所以在上面的链接中,方法是这样的:将模板文件复制到磁盘上的新文件中。将新文件作为 WordProcessingDocument 打开,将其类型更改为 Document 并添加对模板的引用(我不确定为什么这是必要的......)

我需要的是。从数据库中以字节数组的形式获取我的模板。将数组复制到流并将其作为 WordProcessingDocument 打开。然后执行与上面相同的操作。我不想使用磁盘上的临时文件等。我不明白的是为什么我应该在新文档中引用模板文件(实际上,检查docx存档中的xml文件,它只是添加一个包含模板名称的xml节点......为什么?)

现在,我的问题是,如果我使用 MemoryStream 而不是文件的物理路径,则生成的 docx 会损坏。我收到“Microsoft Office 无法打开此文件,因为某些部分丢失或无效”。如果我使用临时磁盘文件,它就可以工作。为什么会发生这种情况?

简化后,我的代码如下所示:

byte[] result = null;
byte[] templateBytes = System.IO.File.ReadAllBytes("template.dotx");
using (MemoryStream templateStream = new MemoryStream())
{
templateStream.Write(templateBytes, 0, (int)templateBytes.Length);

using (WordprocessingDocument doc = WordprocessingDocument.Open(templateStream, true))
{
doc.ChangeDocumentType(WordprocessingDocumentType.Document);
var mainPart = doc.MainDocumentPart;

//Here I should create an AttachedTemplate object and assign a relationship id to it, which also implies
//setting a "reference" to the template ? I'm not using files so there's nothing to "reference" anyway
// If it's doing more than just putting a visual reference to the template file, then why limit the way of referencing the template
// only by using the Uri to the file? Please take a look at the above link to see what I'm referring to.

//Write some text in the file ....
mainPart.Document.Save();

File.WriteAllBytes("Result.docx", templateStream.ToArray());
}
}

这给我带来了一个损坏的 docx 文件。如果我从 MemoryStream 切换到从磁盘打开新的 docx 文件(使用 WordProcessingDocument 类的其他构造函数),它就可以工作。我没有做错什么(比如在处理内存流后尝试将结果写入文件),所以它应该给我相同的结果。

我的代码有什么问题吗?

谢谢

最佳答案

如果您将代码 File.WriteAllBytes 的最后一行从内部 using block 中取出,它应该可以正常工作。只需将该行放在外部 using block 的右大括号之前即可。

关于templates - Open XML SDK - 使用 MemoryStream 作为 docx 持有者从模板 (dotx) 创建 docx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42079439/

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