Este es mi primer publicación como miembro de Qbit y gracias al brother JACK por su aporte, bueno ahora lo importante……
El problema que se me presentaba era que al intentar de exportar un archivo de XLS el botón llamaba al evento post, El control(botón) en la propiedad de CssClass ejecuta un jquery(dialog), que bloqueaba la pagina para que el usuario no pudiera oprimir algo.
Bien resulta que este no terminaba de ejecutarse, al no saber cuando terminaba el evento post, La solución fue cambiar el button por un Hiperlink el cual abriria una nueva pagina en blanco donde se descargaría el archivo de excel.
Creamos un nuevo sitio web Visual C# y con el NET. FREAMWORK 3.5
Dentro del proyecto agregaremos una Base de Datos en este ejemplo se llama Exportar.mdf
Agregaremos una nueva tabla llamada clientes con los campos correspondientes (id de tipo bigint y nombre de varchar(250) los dos no permiten valores nulos) y guardamos la tabla recordar que la tabla se llama “Clientes”
Ahora bien ya en nuestra pagina Default.aspx agregamos un HyperLink
Vamos a las propiedades de HyperLink
Importante: que en la propiedad de “NavigateUrl” coloquemos el nombre de la misma pagina “~/Default.aspx” y en “Target” se encuentre “_blank” todo esto para que cuando se abra la pagina esta se encuentre en blanco.
Ahora insertamos un dropdownlist con las siguientes propiedades
Dentro del proyecto con el siguiente script que oculta el Hiperlink de inicio
Nota:
.InkExportar Esto significa en el script “ . ” que todo control que tenga en la propiedad de CssClass el nombre del script realizara la funcion
#cmbLista mientras que con el signo de “ # “ significa que el control que tenga el ID el nombre del script realizara esa función
jQuery(function ($) { $(".lnkExportar").hide(); var baseUrl = $(".lnkExportar").attr("href"); $("#cmbLista").change(function () { if (($(this).val() == "") || ($(this).val() == undefined)) $(".lnkExportar").hide(); else { $(".lnkExportar").show().attr("href", baseUrl + "?filename=" + $("#cmbLista option:selected").text()); } }); |
Todo esto es dentro del codigo de Aspx, para apoder pasar la variable por url y abrir una nueva pagina en blanco al momento de dar clic en link
Buscando en San Google encontre varios metodo para exportar a un archivo de excel el problema fue que perdia registros al exportarlos, el problema es que psando de cierta cantidad de registros un control web no soporta tanto, opte por este metodo
NOTA: Existe un limite en las hojas de excel que es de 65,000 registros despues de esto hay que insertarlos en la hoja siguiente
public void ExportDataSetToExcel(string id , string filename) { DataTable table = exportar(long.Parse(id)).Tables[0]; context.Response.ClearHeaders(); context.Response.ClearContent(); context.Response.Clear(); context.Response.Buffer = true; context.Response.ContentType = "application/vnd.ms-excel; charset=utf-8"; context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + RemoveWhitespace(filename) + ".xls"); context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1252"); context.Response.Charset = "utf-8"; foreach (DataColumn column in table.Columns) { context.Response.Write(column.ColumnName + "\t"); } context.Response.Write(Environment.NewLine); foreach (DataRow row in table.Rows) { for (int i = 0; i <= table.Columns.Count - 1; i++) { context.Response.Write(row[i].ToString() + "\t"); } context.Response.Write(Environment.NewLine); } context.Response.End(); |
El metodo RemoverEspacios es para que al exportar en el navegador Firefox la cadena(nombre del archivo) que lea y tenga espacios en blanco, le quitara la extencion del archivo, para los demás exploradores no hay problema Google Crhome e Internet Explorer
public string RemoverEspacios(string str) { try { returnnewRegex(@”\s*”).Replace(str, string.Empty); } catch (Exception) { return str; } } |
private void CargarLista() { cmbLista.Items.Clear(); cmbLista.Items.Add(newListItem(“Seleccionar”, “”)); cmbLista.Items.Add(newListItem(“Archivo 1″, “1″)); cmbLista.Items.Add(newListItem(“Archivo 2″, “2″)); cmbLista.Items.Add(newListItem(“Archivo 3″, “3″)); } |
private DataSet exportar() { SqlConnection conn = new SqlConnection(“Cadena de conexion”); SqlCommand cmd = newSqlCommand(); SqlDataAdapter da = newSqlDataAdapter(); conn.Open(); string sQuery = “Select * from Clientes”; da.SelectCommand = new SqlCommand(sQuery, conn); DataSet personasdata = new DataSet(); da.Fill(personasdata); conn.Close(); return personasdata; } |
Por ultimo en el metodo PageLoad donde se encargara al
momento de abrir ejecutar el metodo exportar
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { CargarLista(); if ( (!string.IsNullOrEmpty(Request.QueryString["filename"])) ) { this.ExportDataSetToExcel( Request.QueryString["id"].ToString() , Request.QueryString["filename"].ToString().Trim() ); ); } } } |