Cómo crear un archivo de Excel con datos de SQL Server desde ASP.NET C#

Como crear un archivo de Microsoft Office Excel con datos en un DataTable recuperados de SQL Server mediante un Procedimiento Almacenado incovado desde ASP.NET C# con Visual Studio Community 2019

Conocimientos Previos:

Secciones importantes de código

**********Se requiere de la dll NPOI descargar del Nuget Package Manager*****************



Default.aspx

<asp:Button ID="btnGeneraExcel" Text="Descargar Excel" runat="server" OnClick="btnGeneraExcel_Click" />

Default.cs


Librerias importantes:

using System.IO;
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;



Métodos:



Método que genera nuestro Excel

   protected void btnGeneraExcel_Click(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            dt = dtAlumno();
            Stream s = DataTableToExcel(dt);
            if (s != null)
            {
                MemoryStream ms = s as MemoryStream;
                Response.AddHeader("Content-Disposition", string.Format("attachment;filename=" + HttpUtility.UrlEncode("alumnos202014") + ".xlsx"));
                Response.ContentType = "application/vnd.ms-excel";
                Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
                Response.BinaryWrite(ms.ToArray());
                Response.Flush();
                ms.Close();
                ms.Dispose();
            }
        }


Método que convierte la información del DataTable en Stream 

 public Stream DataTableToExcel(DataTable dt)
        {
            XSSFWorkbook workbook = new XSSFWorkbook();
            MemoryStream ms = new MemoryStream();
            ISheet sheet = workbook.CreateSheet("Alumno20");      
            XSSFRow headerRow = headerRow = (XSSFRow)sheet.CreateRow(0);
            try
            {
                foreach (DataColumn column in dt.Columns)
                    headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                int rowIndex = 1;
                foreach (DataRow row in dt.Rows)
                {
                    XSSFRow dataRow = (XSSFRow)sheet.CreateRow(rowIndex);
                    foreach (DataColumn column in dt.Columns)
                        dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
                    ++rowIndex;
                }
                for (int i = 0; i <= dt.Columns.Count; ++i)
                    sheet.AutoSizeColumn(i);
                workbook.Write(ms);
                ms.Flush();
            }
            catch (Exception ex)
            {

                return null;
            }
            finally
            {
                ms.Close();
                sheet = null;
                headerRow = null;
                workbook = null;
            }
            return ms;
        }


Método que llena nuestro DataTable con información desde SQL Server

 public DataTable dtAlumno()
        {
            DataTable dt = new DataTable();
            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connDB"].ConnectionString))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "SPSalumnos";
                cmd.Connection = conn;
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                da.Dispose();
               
            }
            return dt;
        }



7 comentarios:

  1. disculpa, tengo un error al querer abrir el excel, me dice que tiene un formato invalido

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Si es con MVC en vez de protected void btnGeneraExcel_Click(object sender, EventArgs e) como lo declararia?

    ResponderEliminar
    Respuestas
    1. solo lo colocas como public void btnGeneraExcel_Click(object sender, EventArgs e) y para que se ejecute en el botón le colocas algo así en el href href="@Url.Action("btnGeneraExcel_Click", "Nombre del controlador ")"

      Eliminar
  4. Como se haría para mostrar los datos en distintas pestañas?

    ResponderEliminar
  5. hola, al dar click en el botón descargar excel manda el siguiente error "no se pudo Guardar C:'la dirección de archivos temporales de mi equipo',porque fue imposible de leer el archivo"

    "Inténtelo mas tarde o ponte en contacto con el administrador"

    espero me ayudes para saber que estoy haciendo mal.

    ResponderEliminar

ASP.NET Web API

Es un entorno que nos permite desarrollar servicios HTTP para múltiples clientes tales como exploradores y dispositivos móviles,  las operac...