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");
请帮助
答案 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" );