我使用 Microsoft.Office.Interop 和 Microsoft.Office.Word 以及所有已创建的段落,表格等在内存中创建了一个对象。我需要这个对象来生成一个内容byte []来为表中的一个相同类型的字段提供信息。 我无法以任何方式使用oDoc.Save(“path”)以任何方式保存它以便使用FileStream并解决我的问题。
尝试了几种解决方案以及如何使用剪贴板,但没有奏效。任何解决方案?
答案 0 :(得分:2)
您真的必须使用Microsoft.Office.Interop
和Microsoft.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。