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
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:
protected void Button2_Click(object sender, EventArgs e)
{
try
{
CargarDatos(lblOculto.Text);
}
catch
{
Response.Write("Ocurrió un error debe cargar antes el archivo");
}
}
Descarga el archivo de código: CSV.zip-download