Преобразовать Word объекта взаимодействия в byte [] без физического сохранения - PullRequest
3 голосов
/ 17 мая 2011

У меня есть объект, созданный в памяти с использованием Microsoft.Office.Interop и Microsoft.Office.Word и со всеми созданными абзацами, таблицами и т.п. Мне нужен этот объект для генерации байта содержимого [] для подачи одного поля того же типа в таблице. Проблема в том, что я никак не могу физически сохранить его с помощью oDoc.Save («путь»), чтобы использовать FileStream и решить мою проблему.

Перепробовал несколько решений и как использовать буфер обмена, так и не получилось. Любое решение?

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Вы действительно должны использовать 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();
1 голос
/ 15 ноября 2018

Похоже, это динамически созданный документ 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, используя поток байтов для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...