【问题标题】:Return excel file response in ASP.NET MVC在 ASP.NET MVC 中返回 excel 文件响应
【发布时间】:2017-11-12 15:26:39
【问题描述】:

我正在构建一个 FileResult 方法,该方法应该返回一个 excel 文件作为结果。 目前该方法如下所示:

public ActionResult GetExcelFile(int id)
    {
        var entityPermission = AuthenticationManager.GetEntityPermission(PermissionEntity.Events, PermissionLevel.AllRecords);
        if (entityPermission == null || !entityPermission.AllowRead)
            return Json(new RequestResult(RequestCode.Unauthorized), JsonRequestBehavior.AllowGet);

        try
        {
            using (var serviceManager = new ServiceManager())
            {
                // Get object model
                var firstTableObj = serviceManager.GetDataForExcel(id);
                StringBuilder sb = new StringBuilder();
                sb.Append("<table border=`" + "1px" + "`b>");
                sb.Append("<tr>");
                // ... appending other strings and data
                sb.Append("</table>");

                // Return FileResult
                byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString());
                return File(new MemoryStream(byteArray, 0, byteArray.Length), "application/octet-stream", $"{firstTableObj.CurrentDate}.xlsx");                   
            }
        }
        catch (Exception ex)
        {
            return Json(new RequestResult(RequestCode.Server_Failure, ex.Message), JsonRequestBehavior.AllowGet);
        }

目前,当我从 Angular 2+ 前端发送请求时,正在处理并返回请求,这是一些标头数据:

Content-Disposition:attachment; filename=12.11.2017.xlsx, Content-Length:617, Content-Type:application/octet-stream

但是,该文件没有被下载,响应正文只是字符串格式的 html 模板。我错过了什么?我已经看到了一些在 MVC 中将 excel 文件作为 FileResult 返回的示例,它们与我的没有太大区别。将 MIME 更改为“application/vnd.ms-excel”也无济于事。另外,据我所知,不需要在客户端实现任何文件下载逻辑,它应该按原样工作,即来自服务器的响应。 将不胜感激有关该主题的任何提示。

P.S:我知道一般情况下我不应该将整个文件加载到内存中,但这目前是出于测试目的(我知道返回文件大小的近似限制)并且在未来的开发中肯定会改变。

【问题讨论】:

  • 正在返回 HTML,而不是 XLSX。

标签: c# asp.net asp.net-mvc excel


【解决方案1】:

您没有保存 xlsx 文件。您正在保存一个扩展名为 xlsx 的 html 文件。

您可能调整了在 Internet 上找到的样本,但最初的扩展名是 xls。

带有 xls 扩展名的 html 文件也不是 Excel 文件,但 MS Excel 知道渲染 html 文件并将文件显示到电子表格中。不过,对于最近的 MS Excel 版本,会发出警告,指出文件格式无效。

如果您需要保存 xlsx 文件,则需要搜索 Excel 库,例如 Microsoft 的OpenXMLEPPlus 开源或EasyXLS 商业版,试用期为 30 天。

【讨论】:

    【解决方案2】:

    你应该改变

    public ActionResult GetExcelFile(int id)
    

    public FileResult GetExcelFile(int id)
    

    当然你不能处理 FileResult 的 Json 响应。应该是这样的;

    public FileResult GetExcelFile(int id)
            {
                var entityPermission = AuthenticationManager.GetEntityPermission(PermissionEntity.Events, PermissionLevel.AllRecords);
                if (entityPermission == null || !entityPermission.AllowRead)
                    //return Json(new RequestResult(RequestCode.Unauthorized), JsonRequestBehavior.AllowGet); 
                    //Do something except returning Json response
    
                try
                {
                    using (var serviceManager = new ServiceManager())
                    {
                        // Get object model
                        var firstTableObj = serviceManager.GetDataForExcel(id);
                        StringBuilder sb = new StringBuilder();
                        sb.Append("<table border=`" + "1px" + "`b>");
                        sb.Append("<tr>");
                        // ... appending other strings and data
                        sb.Append("</table>");
    
                        // Return FileResult
                        byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString());
                        return File(new MemoryStream(byteArray, 0, byteArray.Length), "application/octet-stream", $"{firstTableObj.CurrentDate}.xlsx");                   
                    }
                }
                catch (Exception ex)
                {
                    //Do something except returning Json response
                }
    }
    

    【讨论】:

    • 不,FileResult 派生自 ActionResult。两者都可以作为返回类型。
    • 我的控制器正在扩展ApiController(不是Controller);因此我的控制器*没有File(...) 方法。我使用了一种方法like this instead
    猜你喜欢
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多