如何在不重新加载页面的情况下使用 ASP.NET MVC 5 将数据导出到 Excel?

Posted

技术标签:

【中文标题】如何在不重新加载页面的情况下使用 ASP.NET MVC 5 将数据导出到 Excel?【英文标题】:How to export data to Excel using ASP.NET MVC 5 without reloading the page? 【发布时间】:2017-06-27 00:16:13 【问题描述】:

正在将数据导出到 Excel 中。但我不需要重新加载页面。当我尝试按 Export Data to Excel 时,页面正在重新加载。如何避免这种情况?请帮忙。谢谢。

C#:

public ActionResult Export(int id) 
    Excel.Application application = new Excel.Application();
    Excel.Workbook workbook = application.Workbooks.Add(System.Reflection.Missing.Value);
    Excel.Worksheet worksheet = workbook.ActiveSheet;
    var export = _context.Employees.Where(x => x.Id == id)ToList();

    worksheet.Cells[1, 1] = "Name";
    worksheet.Cells[1, 2] = "Age";
    worksheet.Cells[1, 3] = "Position";
    worksheet.Cells[1, 4] = "Address";
    worksheet.Cells[1, 5] = "Contact";

    foreach (var e in export)
    
        worksheet.Cells[row, 1] = e.Name;
        worksheet.Cells[row, 2] = e.Age;
        worksheet.Cells[row, 3] = e.Position;
        worksheet.Cells[row, 4] = e.Address;
        worksheet.Cells[row, 5] = e.Contact;

        row++;
    

    workbook.SaveAs(@"C:\Excel\sample.xls");
    workbook.Close();
    Marshal.ReleaseComObject(workbook);

    application.Quit();
    Marshal.FinalReleaseComObject(application);

    return View();

阿贾克斯:

<script>
    $(document).ready(function() 
        $(".js-export").click(function(e) 
            var link = $(e.target);
             $.ajax(
                    url: "/home/export/" + link.attr("data-export-id"),
                    method: "GET"
                    )
        );
    );
</script>

事件:

<a href="#" class="js-export btn btn-danger btn-xs" data-export-id="@item.Id">Export to Excel</a>

【问题讨论】:

return View() 似乎很奇怪。您不应该在响应流中发回文件吗? 您确定您放置的链接确实是调用 Ajax 事件的原因吗?里面没有js-delete-property的类,也没有data-id属性,它有data-export-id 是的,我使用 return View()。那“结果流”如何?你能帮帮我吗? ***.com/questions/16670209/… @GhasanAl-Sakkaf 请看我更新了它。谢谢。 【参考方案1】:

您可以使用 JsonResult 而不是使用 ActionResult 并且只能返回 excel 文件的 url:-

    $.ajax(
            type: 'GET',
            url: "/home/export/" + link.attr("data-export-id"),
            dataType: 'json',                
            success: function (data)                   
               console.log(data.ExcelUrl);
            
        );

您在控制器中的代码:-

 public JsonResult Export(int id)
           
          //Exel generation code  here showing in your post. 
          return Json(new  ExcelUrl = "New Excel URL path" , JsonRequestBehavior.AllowGet);
       

【讨论】:

嗨阿南德,是的好建议。什么是新 Excel URL 路径?我不明白。 谢谢,它是您的 Excel 文件路径,例如“C:\Excel\sample.xls”。如果它解决了您的问题,请将其标记为答案,以便其他人使用。 //Get excel URL Here ,您可以在此处获取您从 JsonResult 方法返回的 excel url。据我所知,“data.ExcelUrl” 还有一件事阿南德。请问,你能编辑上面的例子吗?谢谢你。 ajax 部分。 您应该发送文件流而不是文件路径,除非文件路径是共享的或在云 blob 存储中。客户端如何访问 C:\ 驱动器或您保存文件的服务器的任何驱动器?【参考方案2】:

通过$.ajax 调用动作并在动作中返回FileResult

public FileResult Export(int id) 
 
    //.........your file creation logic goes here ....//

    byte[] fileBytes = File.ReadAllBytes(filePath);
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
 

【讨论】:

@Paul - filePath 是您保存文件的路径。在您的示例中,它的 C:\Excel\sample.xls 我试过了,为什么没有下载之类的提示? 现在正在下载文件吗?还是只是提示不见了? 现在正在下载文件,但是提示不见了,在浏览器底部下载时必须像google一样看到吗? 您使用的是哪种浏览器?

以上是关于如何在不重新加载页面的情况下使用 ASP.NET MVC 5 将数据导出到 Excel?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新加载页面的情况下更改页面 url

如何在不刷新整个页面的情况下重新加载组件?

如何在不重新加载页面的情况下提交表单[重复]

如何在不刷新页面的情况下在 ReactJS 中重新加载?

Django:如何在不重新加载的情况下在页面上显示更新的信息

如何在不重新加载的情况下在同一页面上提交文件[重复]