首页 > 解决方案 > Xceed Docx 返回空白文档

问题描述

菜鸟在这里,我想使用 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");

请帮忙

标签: c#.netdocxxceed

解决方案


问题:

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

推荐阅读