Tecnologías Microsoft

Web Development

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

Posted: 8/4/2009 10:40 por Edison Daniel García | con 1 comment(s)
Archivado en: ,
Comparte este post:

Comentarios

Eduardo Camacho Leon ha opinado:

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.

# April 11, 2009 7:40 PM