Xceed Docx返回空白文档

时间:2018-04-26 01:29:27

标签: c# .net docx xceed

noob在这里,我想使用xceed docx将报告导出为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 :(得分:2)

问题:

当您的数据已写入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" );