我试图在codeplex上使用神奇的DocX库来创建一个word文档.
当用户单击按钮时,文档已创建,我希望能够通过响应立即将其发送给用户.我现在正在做类似的事情:
根据建议编辑代码
using (DocX Report = DocX.Create(string.Format("Report-{0}.doc", DateTime.Now.Ticks)))
{
Paragraph p = Report.InsertParagraph();
p.Append("Title").FontSize(30).Bold()
.Append("Sub title").FontSize(28)
.AppendLine()
.Append(DateTime.Now.Date)
;
MemoryStream ms = new MemoryStream();
Report.SaveAs(ms);
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".docx\"");
Response.ContentType = "application/msword";
Response.Write(ms);
Response.End();
}
Run Code Online (Sandbox Code Playgroud)
我尝试了一些这方面的变化..但我无法实现我想要的东西.. 看看这个答案我可以将文件保存在服务器上并用io流打开..但我想避免那个额外的步骤(然后我也需要删除文件)
我没有看到创建一个文件几毫秒的重点..必须有一种方法来保存内容并将它们发送到响应流..对吗?
我怎么去的?谢谢..
编辑:我当前的代码要么抛出无法打开文件(访问被拒绝)错误如果我正在使用文件流,或者下载没有任何内容的空文档文件(有时,响应的类型写入文档)
System.IO.MemoryStream内容的MS Word文档.
好的,这是最终的工作解决方案:
出于某种原因,DocX库不想Response.OutputStream直接保存,所以我不得不将其保存到内存流并将内存流写入响应,就像Neil和Daniel建议的那样.这对我有用:
MemoryStream ms = new MemoryStream()
Report.SaveAs(ms);
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".doc\");
Response.ContentType = "application/msword";
ms.WriteTo(Response.OutputStream);
Response.End();
Run Code Online (Sandbox Code Playgroud)
这可能有点晚了,但我找到了一种方法来使用FileStreamResult:
public FileStreamResult DownloadDocument()
{
using (DocX document = DocX.Create(@"Test.docx"))
{
// Insert a new Paragraphs.
Paragraph p = document.InsertParagraph();
p.Append("I am ").Append("bold").Bold()
.Append(" and I am ")
.Append("italic").Italic().Append(".")
.AppendLine("I am ")
.Append("Arial Black")
.Font(new FontFamily("Arial Black"))
.Append(" and I am not.")
.AppendLine("I am ")
.Append("BLUE").Color(Color.Blue)
.Append(" and I am")
.Append("Red").Color(Color.Red).Append(".");
var ms = new MemoryStream();
document.SaveAs(ms);
ms.Position = 0;
var file = new FileStreamResult(ms, "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
{
FileDownloadName = string.Format("test_{0}.docx", DateTime.Now.ToString("ddMMyyyyHHmmss"))
};
return file;
}
}
Run Code Online (Sandbox Code Playgroud)
重要的一点是将内存流的位置设置为0,否则它似乎在最后,文件返回空.