将互操作对象的字转换为字节 [],而无需物理保存

本文关键字:保存 对象 互操作 转换 字节 | 更新日期: 2023-09-27 17:56:41

我使用Microsoft.Office.InteropMicrosoft.Office.Word以及所有创建的段落,表格等在内存中创建了一个对象。我需要这个对象来生成一个内容字节 [] 来输入表中一个相同类型的字段。我无法使用oDoc.Save("路径")以任何方式物理保存它的问题,以便使用FileStream并解决我的问题。

已经尝试了几种解决方案以及如何使用剪贴板,但没有奏效。有什么解决办法吗?

将互操作对象的字转换为字节 [],而无需物理保存

你真的必须使用Microsoft.Office.InteropMicrosoft.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 文档。