在異步請求中要返回文件流,不能使用JQuery,由於$.ajax,$.post 不支持返回二進制文件流的類型,能夠看到下圖,dataType只支持xml,json,script,html這幾種格式,沒有blob類型。因此只能選擇使用原生Ajax XMLReques對象進行處理html
前端代碼前端
function output() { var branchCode = $("#currentBranchCode").val(); var transDate = $("#currentTransDate").val(); if (branchCode == "" || transDate == "") { layer.msg("暫無記錄,沒法導出", { icon: 7, time: 1000 }); return; } var fileName = $("table caption").html() + ".xls";//設置下載時候的文件名 //要請求的Url和攜帶的參數 var url = "/SellAnalyze/Export?currentBranchCode=" + branchCode + "¤tTransDate=" + transDate; var xhr = new XMLHttpRequest(); //設置響應類型爲blob類型 xhr.responseType = "blob"; xhr.onload = function () { if (this.status == "200") {
//獲取響應文件流 var blob = this.response; var aElem = document.getElementById("exportUrl");
//將文件流保存到a標籤 aElem.href = window.URL.createObjectURL(blob); aElem.download = fileName; aElem.onload = function (e) { window.URL.revokeObjectURL(aElem.href); }; $("#exportUrl").removeClass("hidden"); layer.confirm('文件已導出, 當即下載?', function (index) { $("#download").click(); layer.close(index); }); } } xhr.open("post", url, true); xhr.send(); }
後端代碼ajax
public ActionResult Export(int? currentBranchCode, DateTime currentTransDate) { MemoryStream ms = NPOIExcelWrite(datas); ms.Seek(0, SeekOrigin.Begin); return File(ms, "application/vnd.ms-excel"); } /// <param name="datas">寫入的數據</param> /// <returns></returns> private MemoryStream NPOIExcelWrite(SellDTO[] datas) { string[] titles = { "貨品類別", "貨品類別描述", "銷售額", "同比", "環比" }; NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook(); NPOI.SS.UserModel.ISheet sheet = book.CreateSheet("Sheet1"); NPOI.SS.UserModel.IRow row = sheet.CreateRow(0); for (int i = 0; i < titles.Length; i++) { row.CreateCell(i).SetCellValue(titles[i]); } for (int i = 0; i < datas.Length; i++) { row = sheet.CreateRow(i + 1); row.CreateCell(0).SetCellValue(datas[i].JewelryType); row.CreateCell(1).SetCellValue(datas[i].JewelryTypeDesc); row.CreateCell(2).SetCellValue(datas[i].CurrentMonthSaleroom.ToString("F2")); row.CreateCell(3).SetCellValue(datas[i].YearOverYear); row.CreateCell(4).SetCellValue(datas[i].LinkRelative); } MemoryStream ms = new MemoryStream(); book.Write(ms); ms.Flush(); book = null; return ms; }
參考:https://blog.csdn.net/swl979623074/article/details/77855629/json
http://www.javashuo.com/article/p-ouiwytmv-dk.html後端
https://blog.csdn.net/fangchen12312/article/details/55271296app