#c# #interop #memorystream #word-addins
#c# #взаимодействие #memorystream #word-дополнения
Вопрос:
Я генерирую MemoryStream из строки и передаю его другому методу, который сохранит этот поток при удаленной загрузке в виде .docx
файла.
public static MemoryStream GenerateStreamFromString(string s)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
Приведенный выше код предназначен для преобразования строки в MemoryStream. Строка, которую я передаю вышеуказанному методу, — это XML, который я получаю по Globals.ThisAddIn.Application.ActiveDocument.WordOpenXML
строке.
Файл успешно загружается в удаленное расположение, но когда я загружаю этот файл, MS Word выдает ошибку, которая File is corrupted. Either part of file is missing or invalid
(как показано на рисунке ниже)
Я не могу понять, является ли генерируемый мной поток неправильным / поврежденным или мне нужно выполнить еще какую-то операцию, чтобы сделать этот .docx
файл действительным?
Извините за этот вопрос, подобных вопросов так много, но ни один из них не может быть более полезным.
Комментарии:
1. Проверяли ли вы содержимое файла впоследствии? Вы уверены, что эту строку можно сохранить просто как файл docx и ожидать, что она будет работать?
2. @JonSkeet Я предполагаю, что это был бы способ сохранить файл docx. Поправьте меня, если я ошибаюсь, есть ли другой способ выполнить эту задачу?
3. «Я предполагаю, что это был бы способ сохранить файл docx». Я бы проверил это предположение. (Конечно, файлы docx не обычно являются просто текстовыми XML-файлами.)
4. @JonSkeet Итак, должен ли я временно сохранять файл, читать этот файл и передавать его в поток, это лучший способ справиться с этой проблемой?
5. Прочитайте это, это похоже на то, что вы делаете: blogs.msdn.microsoft.com/mcsuksoldev/2010/04/09 /…
Ответ №1:
XML, переданный таким образом, не является допустимым файлом DOCX. Фактический формат DOCX использует сжатое содержимое с папками. Вам нужно сохранить документ из вашей надстройки во временном расположении (лучше всего использовать GetTempPath), затем прочитать файл с диска в свой поток памяти и загрузить его туда, куда вам нужно.
Комментарии:
1. Таким образом, он работает полностью. Но есть ли способ получить прямой доступ к этому содержимому и передать его в MemoryStream и сохранить как обычный файл Word?
2. Насколько я знаю — это невозможно, потому что, как я уже сказал, содержимое структурируется и сжимается при сохранении в DOCX.