Manejar archivos CSV y cargarlos a un GridView en ASP.NET

En este post se mostró como manipular los datos desde un archivo csv y guardarlo en tablas en SQL Server 2005:

http://geeks.ms/blogs/mredison/archive/2009/04/08/tip-manejo-de-archivos-csv-con-sql-server.aspx

Pero este post simplemente se basa en cargar un archivo a un directorio dentro del proyecto web, leer dicho archivo y mostrar los datos en una regilla de datos (GridView) sin hacer uso del servidor de base de datos.

El formulario que se ocupará tendrá estos controles web:

  • Un control FileUpload.
  • Dos botones de comando.
  • Dos labels
  • Un gridView

CsvFilesUpload_01

HTML:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server" method="post">
    <div>
    
        <asp:FileUpload ID="FileUpload1" runat="server" />
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Subir" />
    
        <asp:Button ID="Button2" runat="server" Text="Cargar Datos-Tabla" 
            onclick="Button2_Click" />
    
    </div>
    <asp:Label ID="lblOculto" runat="server" Text="" Visible="false"></asp:Label>
    <br />
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    <asp:GridView ID="GridView1" runat="server" Height="251px" Width="420px">
    </asp:GridView>
    </form>
</body>
</html>

 

Código:

En Default.aspx.cs crearemos estos métodos.

 private DataTable CrearTabla(String fila)
    {
        int cantidadColumnas;
        DataTable tabla = new DataTable("Datos");
        String[] valores = fila.Split(new char[] { ',' });
        cantidadColumnas = valores.Length;
        int idx = 0;
        foreach (String val in valores)
        {
            String nombreColumna = String.Format("{0}", idx++);
            tabla.Columns.Add(nombreColumna, Type.GetType("System.String"));
        }
        return tabla;
    }

 

En este primer método se creará la tabla de acuerdo a la cantidad de columnas que se obtengan y que se hayan guardado en un arreglo de tipo string.

Posteriormente crearemos el método AgregarFila:

private DataRow AgregarFila(String fila, DataTable tabla)
    {
        int cantidadColumnas = 100;
        String[] valores = fila.Split(new char[] { ',' });
        Int32 numeroTotalValores = valores.Length;
        if (numeroTotalValores > cantidadColumnas)
        {
            Int32 diferencia = numeroTotalValores - cantidadColumnas;
            for (Int32 i = 0; i < diferencia; i++)
            {

                String nombreColumna = String.Format("{0}", (cantidadColumnas + i));
                tabla.Columns.Add(nombreColumna, Type.GetType("System.String"));
            }
            cantidadColumnas = numeroTotalValores;
        }
        int idx = 0;
        DataRow dfila = tabla.NewRow();
        foreach (String val in valores)
        {
            String nombreColumna = String.Format("{0}", idx++);
            dfila[nombreColumna] = val.Trim();
        }
        tabla.Rows.Add(dfila);
        return dfila;
    }

Método CargarDatos:

Teniendo listos los primeros dos métodos de crearTabla y agregarFilas a la tabla, procedemos a cargar los datos mediante una ruta como parametro:

 private void CargarDatos(string strm)
    {
        DataTable tabla = null;
        StreamReader lector = new StreamReader(strm);
        String fila = String.Empty;
        Int32 cantidad = 0;
        do
        {
            fila = lector.ReadLine();
            if (fila == null)
            {
                break;
            }
            if (0 == cantidad++)
            {
                tabla = this.CrearTabla(fila);
            }
            this.AgregarFila(fila, tabla);
        } while (true);

        GridView1.DataSource = tabla;
        GridView1.DataBind();
    }

Este método checa si existen datos en el archivo,  crea la tabla y agrega las filas a dicha tabla, además de mostrarlos en el GridView.

Carga de Archivos con FileUpload:

Haremos un método de tipo bool, que determinará que tipo de archivo solo quiero que suba el usuario.

 bool ChecarExtension(string fileName)
    {
        string ext = Path.GetExtension(fileName);
        switch (ext.ToLower())
        {
            case ".csv":
                return true;
            default:
                return false;
        }
    }

Posteriormente en el botón de Subir, agregaremos el siguiente código:

public void Button1_Click(object sender, EventArgs e)
    {
        
        
        if (FileUpload1.HasFile)
        {
            if (ChecarExtension(FileUpload1.FileName))
            {
                FileUpload1.SaveAs( MapPath("Archivos/" + FileUpload1.FileName));
                

                 Label1.Text =FileUpload1.FileName +" cargado exitosamente";

                 lblOculto.Text = MapPath("Archivos/" + FileUpload1.FileName);
            }
        }
        else
        {
            Label1.Text = "Error al subir el archivo o no es el tipo .CSV"; 
        }

    }

 

En esta parte indicamos en que directorio se colocará dicho archivo y obtenemos la ruta que posteriormente pasaremos como parametro al método CargarDatos(); a continuación:

 

CsvFilesUpload_02

protected void Button2_Click(object sender, EventArgs e)
    {
        try
        {

            CargarDatos(lblOculto.Text);
        }
        catch
        {
            Response.Write("Ocurrió un error debe cargar antes el archivo");
        }
    }

CsvFilesUpload_03

 

Descarga el archivo de código: CSV.zip-download

Un comentario sobre “Manejar archivos CSV y cargarlos a un GridView en ASP.NET”

  1. Muy Interesante. Segui las instrucciones, pero al sar click en el boton SUBIR, dice que no puede mostrar la pagina….. aunque compilo y no marca ningun error…. el vinculo para bajar el archiv ZIp no funciona…. por lo que no he logrado saber que estoy haciendo mal… saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *