我一直关注下面列出的这些链接,我找到了编写这个SMALL创建Excel和下载功能的最佳方法。 (使用EPPlus for Excel)
每次运行时都会完美地运行代码而不会出错,但不会“踢出”要下载的文件(保存为对话框或w / e)。
public ActionResult ShowReport()
{
using (var stream = new MemoryStream())
{
ExcelPackage pck = new ExcelPackage();
var ws = pck.Workbook.Worksheets.Add("Sample1");
ws.Cells["A1"].Value = "Sample 1";
ws.Cells["A1"].Style.Font.Bold = true;
var shape = ws.Drawings.AddShape("Shape1", eShapeStyle.Rect);
shape.SetPosition(50, 200);
shape.SetSize(200, 100);
shape.Text = "Sample 1 text text text";
var fileDownloadName = "sample.xlsx";
var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";//System.Net.Mime.MediaTypeNames.Application.Octet
var fileStream = new MemoryStream();
pck.SaveAs(fileStream);
fileStream.Position = 0;
var fsr = new FileStreamResult(fileStream, contentType);
fsr.FileDownloadName = fileDownloadName;
byte[] fileBytes = ReadToEnd(fileStream);
string fileName = "example";
return File(fileBytes, contentType, fileName);
}
}
我做错了什么/失踪了? - 我必须自己写那个对话吗?
PN:我也尝试过这种方式
byte[] fileBytes = ReadToEnd(fileStream);
string fileName = "example";
return File(fileBytes, contentType, fileName);
当然,我必须弄清楚如何将Stream转换为Byte,但它也没有显示任何内容。
Chrome网络开发工具的图片 对于小图片(如果你看不到它用ctl + MouseWheel滚动),如果你在支持浏览器中,我们很抱歉。
答案 0 :(得分:3)
(回应上面的评论帖子。)
从发布的图片看起来,实际的文件请求(列表中的最后一个)来自JavaScript代码,而不是来自普通的文档级请求。鉴于此,服务器端代码正常工作并返回正确的响应很可能。
但是,由于它是一个AJAX请求,浏览器实际上并不知道如何处理响应。有一些潜在的解决方案here。理想情况下,您可能希望将此设置为正常请求,并尽可能从图片中删除AJAX。如果这不是一个选项,您仍然可以从JavaScript启动文档级请求。像这样简单:
window.location = '@Url.Action("Method", "Controller")';
这将从当前的JavaScript代码启动,但将用于整个浏览器而不是AJAX请求。这应该可以解决问题。
答案 1 :(得分:-1)
使用内存流,您可以在保存Excel包后将其简单地传递给Response对象
代码:
Response.AddHeader("content-disposition", "attachment;filename=FILENAME.xlsx")
Response.Charset = String.Empty
Response.ContentType = "application/ms-excel"
Response.BinaryWrite(stream.ToArray())
Response.End()