Xceed Docx returns 空白文档

Xceed Docx returns blank document

菜鸟,我想使用 xceed docx 将报告导出为 docx 文件,但它 returns 空白文档(空)

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");

请帮忙

问题:

虽然您的数据已写入 MemoryStream,但内部 "stream pointer" 或游标(在老派术语中,将其视为磁头)位于您写入的数据:

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" );