2

我一直在关注下面列出的这些链接,我找到了编写这个 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 滚动),我们深表歉意。

4

2 回答 2

3

(回应上面的评论线程。)

从发布的图片来看,实际的文件请求(列表中的最后一个)似乎来自 JavaScript 代码,而不是来自正常的文档级请求。鉴于此,服务器端代码很可能正常工作并返回正确的响应。

然而,由于它是一个 AJAX 请求,浏览器实际上并不知道如何处理响应。这里有一些潜在的解决方案。理想情况下,您会希望将此作为正常请求并尽可能从图片中删除 AJAX。如果这不是一个选项,您仍然可以从 JavaScript 发起文档级请求。像这样简单的事情:

window.location = '@Url.Action("Method", "Controller")';

这将像当前一样从 JavaScript 代码启动,但将针对整个浏览器而不是 AJAX 请求。这应该够了吧。

于 2013-09-24T13:38:21.093 回答
-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()
于 2013-09-24T13:12:28.273 回答