English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Este artículo comparte con ustedes el código específico para generar y descargar Excel en Asp.net MVC, a modo de referencia, los detalles son los siguientes
Debido a las necesidades del proyecto, se requiere exportar archivos Excel con condiciones específicas. Después de mucho esfuerzo, finalmente lo he logrado.
Ahora publicaré el código para compartir
(Compartiré parte del código de las clases auxiliares de mi proyecto)
Nuestro proyecto utiliza Asp.Net MVC4.0模式。
每个ActionResult必然会返回一个View或Json等(View或Json中的参数都是object类型的)
所以我们需要一个公共类来统一定义操作的“成功或失败”的状态或返回操作的消息,以及有利于使用jquery $.get()、$.post()的接收返回参数时的统一性。
以下是StatusMessageData类。(当然,如果只想要导出Excel,这个类是不需要定义的。)
/// <summary> /// 辅助传输StatusMessage数据 /// </summary> [Serializable] public sealed class StatusMessageData { private StatusMessageType messageType; /// <summary> /// clase de mensaje de提示 /// </summary> public StatusMessageType MessageType { get { return messageType; } set { messageType = value; } } private string messageContent = string.Empty; /// <summary> /// 信息内容 /// </summary> public string MessageContent { get { return messageContent; } set { messageContent = value; } } private object data; /// <summary> /// 数据 /// </summary> public object Data { get { return data; } set { data = value; } } /// <summary> /// 构造器 /// </summary> /// <param name="messageType">消息类型</param> /// <param name="messageContent">消息内容</param> public StatusMessageData(StatusMessageType messageType, string messageContent, object data) { this.messageType = messageType; this.messageContent = messageContent; this.data = data; } public StatusMessageData(StatusMessageType messageType, string messageContent) { this.messageType = messageType; this.messageContent = messageContent; } public StatusMessageData()} { } } /// <summary> /// clase de mensaje de提示 /// </summary> public enum StatusMessageType { /// <summary> /// éxito /// </summary> Success = 1, /// <summary> /// error /// </summary> Error = -1, /// <summary> /// información de提示 /// </summary> Hint = 0, /// <summary> /// recordatorio de inicio de sesión /// </summary> Login = 5, /// <summary> /// indicar redirección /// </summary> Redirect = 6, }
definir ExportExcel ActionResult en el Controller
[HttpPost] public ActionResult ExportExcel(SearchModel model) { StatusMessageData result = new StatusMessageData(); if (model.Data == null || model.Data.Count <= 0) { result.MessageType = StatusMessageType.Error; result.MessageContent = "No hay datos para descargar"; return Json(result); } string fileglobal = ""; //organizar la tabla Excel StringBuilder sb = new StringBuilder(400); sb.Append("<table cellspacing='0' rules='all' border='1'>"); sb.Append("<thead>"); sb.Append("<tr>"); sb.Append("<th>Columna Uno</th>"); sb.Append("<th>Columna Dos</th>"); sb.Append("<th>Columna Tres</th>"); sb.Append("<th>Columna Cuatro</th>"); sb.Append("</tr>"); sb.Append("</thead>"); sb.Append("<tbody>"); try { foreach (var item in model.Data) { sb.Append("<tr>"); sb.Append("<td>"); sb.Append(item.column1); sb.Append("</td>"); sb.Append("<td>"); sb.Append(item.column2); sb.Append("</td>"); sb.Append("<td>"); sb.Append(item.column3); sb.Append("</td>"); sb.Append("<td>"); sb.Append(item.column4); sb.Append("</td>"); sb.Append("</tr>"); } } sb.Append("</tbody>"); sb.Append("</table>"); //con UTF8escribir en formato byte[] contentBytes = Encoding.UTF8.GetBytes(sb.ToString()); string rootDirServerPath = "guardar los archivos generados en el nombre de la carpeta especificada"; //Dado que prácticamente no hay situaciones de concurrencia al descargar archivos Excel en nuestro proyecto, basta con usar el año, mes, día, hora, minuto y segundo para nombrar el archivo para evitar problemas de generación de nombres de archivo idénticos. string fileSaveName = "Nombre del archivo descargado_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; string rootDirServerPhysicPath = Server.MapPath("~" + rootDirServerPath); if (!Directory.Exists(rootDirServerPhysicPath)) { Directory.CreateDirectory(rootDirServerPhysicPath); } string[] strFiles = Directory.GetFiles(rootDirServerPhysicPath); if (strFiles.Length > 0) { foreach (string strFile in strFiles) { System.IO.File.Delete(strFile); } } //A continuación, se muestra cómo guardar el archivo en el directorio especificado string userFailedSummaryFileSavePath = rootDirServerPhysicPath + "/" + fileSaveName; if (System.IO.File.Exists(userFailedSummaryFileSavePath)) { System.IO.File.Delete(userFailedSummaryFileSavePath); } System.IO.File.WriteAllBytes(userFailedSummaryFileSavePath, contentBytes); //Configurar la ruta completa del archivo que se va a descargar. fileglobal = rootDirServerPath + "/" + fileSaveName; } catch (Exception ex) { result.MessageType = StatusMessageType.Error; result.MessageContent = ex.Message.ToString(); return Json(result); } result.MessageType = StatusMessageType.Success; result.MessageContent = "Descargando, por favor espere..."; result.Data = fileglobal; return Json(result); }
Después de completar la operación de generación de Excel, se realiza una llamada asíncrona en la página.
$("#export-excel").click(function (e) { e.preventDefault(); $.post("Controller/ExportExcel.aspx", $("#Form1").serialize(), function (data) { art.dialog.tips(data.MessageContent, 1.5, data.MessageType, function () { if (data.MessageType == 1) { window.open(data.Data); } else { //Operación de error } }); }); });
Estas son todas las operaciones relacionadas con la generación y descarga de Excel en nuestro proyecto.
Se consideraron pocas circunstancias, se escribió de manera sencilla.
Si tienen alguna buena idea, pueden dejar un mensaje, sin duda aprenderé y practicaré antes de compartir.
Muchas gracias.
Esto es todo el contenido de este artículo, espero que sea útil para su aprendizaje y que todos apoyen y alienten al tutorial de clamor.
Declaración: El contenido de este artículo se obtiene de la red, pertenece al autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha realizado una edición humana y no asume la responsabilidad legal relevante. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.