将interop对象的Word转换为byte [],而不进行物理保存

时间:2011-05-16 20:51:39

标签: c# interop ms-word byte

我使用 Microsoft.Office.Interop Microsoft.Office.Word 以及所有已创建的段落,表格等在内存中创建了一个对象。我需要这个对象来生成一个内容byte []来为表中的一个相同类型的字段提供信息。 我无法以任何方式使用oDoc.Save(“path”)以任何方式保存它以便使用FileStream并解决我的问题。

尝试了几种解决方案以及如何使用剪贴板,但没有奏效。任何解决方案?

2 个答案:

答案 0 :(得分:2)

您真的必须使用Microsoft.Office.InteropMicrosoft.Office.Word吗?

如果没有必要,可以使用OpenXML SDK libraries来操作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();

答案 1 :(得分:1)

像这样的声音是动态创建的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);
    } 
}

有关更多信息,请参见How can I form a Word document using stream of bytes