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