Heim  >  Artikel  >  Web-Frontend  >  Beispiel für die Verwendung einer von Ajax generierten und heruntergeladenen Excel-Datei

Beispiel für die Verwendung einer von Ajax generierten und heruntergeladenen Excel-Datei

高洛峰
高洛峰Original
2016-12-06 10:31:131378Durchsuche

Ich habe schon lange keinen Artikel mehr geschrieben. Heute werde ich eine Methode zum Herunterladen und Generieren von Dateien in ASP.NET MVC vorstellen. Das Folgende ist nur meine persönliche Erfahrung:

Jeder sollte wissen, dass in ASP.NET in MVC, wenn Sie den Hintergrundcontroller über Ajax aufrufen, Sie ein JSON-Objekt zurückgeben können, aber Sie können die Datei nicht direkt zurückgeben (es sei denn, Sie aktualisieren die Seite, dann ist es kein Ajax). ), wenn Sie also Ajax zum Generieren und Herunterladen einer Datei verwenden möchten, müssen Sie nur die generierte Datei zuerst auf dem Server speichern und dann den Dateipfad über JSON zurückgeben, bevor sie heruntergeladen werden kann Da die Datei vorübergehend gespeichert wird, muss die entsprechende Datei nach dem Herunterladen sofort gelöscht werden.

Das Folgende ist ein Beispiel für die dynamische Generierung von Excel (ich habe die spezifischen Schritte zum Generieren von Excel weggelassen, dies ist nicht der Schwerpunkt dieses Artikels):

1 Erstellen Sie eine Excel-Datei zur Aktionsgenerierung

[HttpPost]
public JsonResult ExportExcel()
{
  DataTable dt = DataService.GetData();
  var fileName = "Excel_" + DateTime.Now.ToString("yyyyMMddHHmm") + ".xls";
  //將生成的文件保存到服務器的臨時目錄里
  string fullPath = Path.Combine(Server.MapPath("~/temp"), fileName);
  
  using (var exportData = new MemoryStream())
  {
    //如何生成Excel這里就不詳細說明啦,我這里對Excel的操作使用的是 NPOI
    Utility.WriteDataTableToExcel(dt, ".xls", exportData);
  
    FileStream file = new FileStream(fullPath, FileMode.Create, FileAccess.Write);
    exportData.WriteTo(file);
    file.Close();
  }
  
  var errorMessage = "you can return the errors in here!";
  
  //返回生成的文件名
  return Json(new { fileName = fileName, errorMessage = "" });
}

2. Aktion zum Herunterladen erstellen

[HttpGet]
[DeleteFileAttribute] //Action Filter, 下載完后自動刪除文件,這個屬性稍後解釋
public ActionResult Download(string file)
{
  //到服務器臨時文件目錄下載相應的文件
  string fullPath = Path.Combine(Server.MapPath("~/temp"), file);
  //返回文件對象,這里用的是Excel,所以文件頭使用了 "application/vnd.ms-excel"
  return File(fullPath, "application/vnd.ms-excel", file);
}

3. Da die Datei nach dem Herunterladen automatisch gelöscht werden muss, erstellen Sie einen weiteren Aktionsfilter

public class DeleteFileAttribute : ActionFilterAttribute
{
  public override void OnResultExecuted(ResultExecutedContext filterContext)
  {
    filterContext.HttpContext.Response.Flush();
    //將當前filter context轉換成具體操作的文件并獲取文件路徑
    string filePath = (filterContext.Result as FilePathResult).FileName;
    //有文件路徑后就可以直接刪除相關文件了
    System.IO.File.Delete(filePath);
  }
}

4. Fügen Sie abschließend den Ajax-Aufruf hinzu im Vordergrund Code:

//這里我使用了 blockUI 做loading...
$.blockUI({ message: &#39;<h3>Please wait a moment...</h3>&#39; }); 
$.ajax({
  type: "POST",
  url: &#39;@Url.Action("ExportExcel","YourController")&#39;, //調用相應的controller/action
  contentType: "application/json; charset=utf-8",
  dataType: "json",
}).done(function (data) {
  //console.log(data.result);
  $.unblockUI();
  //接收返回的文件路徑,此文件這時已保存到服務器上了
  if (data.fileName != "") {
    //通過調用 window.location.href 直接跳轉到下載 action 進行文件下載操作
    window.location.href = "@Url.RouteUrl(new { Controller = "YourController", Action = "Download"})/?file=" + data.fileName;
  }
});

Fertig!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn