将互操作对象的字转换为字节 [],而无需物理保存
本文关键字:保存 对象 互操作 转换 字节 | 更新日期: 2023-09-27 17:56:41
我使用Microsoft.Office.Interop和Microsoft.Office.Word以及所有创建的段落,表格等在内存中创建了一个对象。我需要这个对象来生成一个内容字节 [] 来输入表中一个相同类型的字段。我无法使用oDoc.Save("路径")以任何方式物理保存它的问题,以便使用FileStream并解决我的问题。
已经尝试了几种解决方案以及如何使用剪贴板,但没有奏效。有什么解决办法吗?
你真的必须使用Microsoft.Office.Interop
和Microsoft.Office.Word
吗?
如果不是真的有必要,您可以使用 OpenXML SDK 库来操作 WordDocument 的内容。
OpenXML SDK 包含一个类WordprocessingDocument
,该类可以操作包含 WordDocument 内容的内存流。并且MemoryStream
可以使用ToArray()
转换为byte[]
。
作为代码示例:
byte[] templateContent = File.ReadAllBytes(templateFile);
MemoryStream stream = new MemoryStream();
stream.Write(templateContent, 0, templateContent.Length);
WordprocessingDocument wordDoc = WordprocessingDocument.Open(stream, true);
// When done
byte[] contentOfWordFile = stream.toArray();
听起来这是一个
动态创建的Word文档。
由于文档采用 Document
对象的形式,因此您应该能够通过执行以下操作来获取其 XML 字符串,然后是字节:
Microsoft.Office.Interop.Word.Document d = new Microsoft.Office.Interop.Word.Document();
// All of your building of the document was here
// The object must be updated with content
string docText = d.WordOpenXML; // this assumes content is here
byte[] bytes = Encoding.UTF8.GetBytes(docText);
我不认为首先将对象保存到文件系统是必需的,因为您已经在内存中拥有了所有动态构建的对象。 这应该只是一个问题 访问其WordOpenXML
.
如果您从文件系统中获取文件,它看起来几乎相同,除了文档首先打开的方式:
string sourceFilePath = @"C:'test.docx";
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
var document = wordApp.Documents.Open(sourceFilePath);
string docText = document.WordOpenXML;
byte[] bytes = Encoding.UTF8.GetBytes(docText);
如果要将这些字节下载回文档中,则需要执行以下操作:
string documentPath = @"C:'test.docx"; // can be modified with dynamic paths, file name from database, etc.
byte[] contentBytes = null;
// … Fill contentBytes from the database, then...
// Create the Word document using the path
using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(documentPath, true))
{
// This should get you the XML string...
string docText = System.Text.Encoding.UTF8.GetString(contentBytes);
// Then we write it out...
using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
{
sw.Write(docText);
}
}
有关详细信息,请参阅如何使用字节流形成 Word 文档。