Проблема:
Пока ваши данные записаны в MemoryStream
, внутренний «указатель потока» или курсор (в терминологии старой школы, воспринимайте это как головку ленты)в конце данных, которые вы написали:
До document.Save()
:
stream = [_________________________...]
ptr = ^
После вызова document.Save()
:
stream = [<xml><p>my word document</p><p>the end</p></xml>_________________________...]
ptr = ^
Когда вы звоните Controller.File( Stream, String )
затем он продолжит чтение с текущего ptr
местоположения и будет считывать только пустые данные:
stream = [<xml><p>my word document</p><p>the end</p></xml>from_this_point__________...]
ptr = ^
(На самом деле он вообще ничего не читает, потому что MemoryStream
специально не делаетразрешить чтение сверх его внутреннего предела длины, который по умолчанию является объемом данных, записанных в него до сих пор)
Если вы сбросите ptr
в начало потока, то когда поток прочитает возвращенные данныеначнется с начала записанных данных:
stream = [<xml><p>my word document</p><p>the end</p></xml>_________________________...]
ptr = ^
Решение:
Вам необходимо сбросить MemoryStream в положение 0 перед чтением данных из потока:
using Xceed.Words.NET;
// ...
MemoryStream stream = new MemoryStream();
DocX document = DocX.Create( stream );
Paragraph p = document.InsertParagraph();
p.Append("Hello World");
document.Save();
stream.Seek( 0, SeekOrigin.Begin ); // or `Position = 0`.
return File( stream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "DOCHK.docx" );