Xceed Docx возвращает пустой документ - PullRequest
0 голосов
/ 26 апреля 2018

noob здесь, я хочу экспортировать отчет как файл docx, используя xceed docx, но он возвращает пустой документ (пустой)

MemoryStream stream = new MemoryStream();
        Xceed.Words.NET.DocX document = Xceed.Words.NET.DocX.Create(stream);
        Xceed.Words.NET.Paragraph p = document.InsertParagraph();

        p.Append("Hello World");

        document.Save();

        return File(stream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "DOCHK.docx");

, пожалуйста, помогите

1 Ответ

0 голосов
/ 26 апреля 2018

Проблема:

Пока ваши данные записаны в 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" );
...