none
como insertar en tabla de base de datos archivo de excel en csv con entity framework?? RRS feed

  • Pregunta

  • Hola compañeros buen dia estoy utilizando VS2010 como puedo insertar los datos de un archivo excel en formato csv con el entity framework?? gracias por su ayuda saludos.
    lunes, 30 de enero de 2012 16:59

Respuestas

  • Ah, lo había entendido al revés: pensé que lo que querías era insertar HACIA el csv, no DESDE el csv.

    En este caso, el principal problema es el de leer el contenido del CSV. Aunque podría hacerse leyendo linea a linea con un StreamReader, y luego "troceando" las lineas leidas para separar los campos, esto último puede ser más complicado de lo que parece si en las distintas casillas de Excel puede haber caracteres especiles (por ejemplo, dobles comillas), ya que Excel los "escapa" al salvarlos al CSV, por lo que separar los distintos campos puede llegar a ser un poco complicadillo. Te sugiero salvar un archivo, y abrirlo con el Notepad para que veas el contenido y decidas si en tu caso es suficientemente sencillo o no.

    Una alternativa es la de leerlo con el driver de OleDb. Si usas un OleDbDataAdapter, te devolverá los datos en un DataTable. En este caso, lo más sencillo es que uses un SqlDataAdapter para escribir ese mismo datatable sobre el SQL Server. No es que no se pueda hacer con LINQ o con Entity Framework, pero para ello necesitarías usar un bucle para recorrer uno por uno los registros, y luego ir asignando una por una las columnas de la tabla a las propiedades de la Entidad para poderla grabar. Te va a ocupar mucho más código que si usas el dataadapter.

     

    • Marcado como respuesta Jasgo miércoles, 1 de febrero de 2012 2:49
    martes, 31 de enero de 2012 7:30

Todas las respuestas

  • Me temo que no hay driver para CSV con Entity Framework. Tendrás que usar alguna tecnología más antigua, como por ejemplo OleDb, o abrir el CSV con un StreamWriter y escribir directamente el texto separado por comas.

     

    lunes, 30 de enero de 2012 18:37
  • A ok pero como seria con el StreamWriter? por ejemplo un archivo de Excel que tiene 360 filas alguna idea que me pudieras sugerir para realizarlo?
    lunes, 30 de enero de 2012 19:18
  • Por ejemplo, aquí tienes un ejemplo que escribe un CSV con 360 filas y 10 columnas. Obviamente, aquí los datos se generan "a piñón fijo"; en un programa real serían datos calculados según la lógica de tu programa:

    using System.IO;
    ...
    using (StreamWriter sw = new StreamWriter("archivo.csv"))
    {
        for (int fila=1; fila<=360; fila++)
        {
            for (int col=1; col<=10; col++)
            {
               sw.Write("Celda_"+fila+"_"+col);
                if (col<10) sw.Write(";");
            }
            sw.WriteLine();
        }
    }
    

     

    lunes, 30 de enero de 2012 19:53
  • A ok muchas gracias y por ejemplo como haría para insertar esas filas con el entityframework en mi tabla ?? usaría linq?
    lunes, 30 de enero de 2012 21:26
  • Ah, lo había entendido al revés: pensé que lo que querías era insertar HACIA el csv, no DESDE el csv.

    En este caso, el principal problema es el de leer el contenido del CSV. Aunque podría hacerse leyendo linea a linea con un StreamReader, y luego "troceando" las lineas leidas para separar los campos, esto último puede ser más complicado de lo que parece si en las distintas casillas de Excel puede haber caracteres especiles (por ejemplo, dobles comillas), ya que Excel los "escapa" al salvarlos al CSV, por lo que separar los distintos campos puede llegar a ser un poco complicadillo. Te sugiero salvar un archivo, y abrirlo con el Notepad para que veas el contenido y decidas si en tu caso es suficientemente sencillo o no.

    Una alternativa es la de leerlo con el driver de OleDb. Si usas un OleDbDataAdapter, te devolverá los datos en un DataTable. En este caso, lo más sencillo es que uses un SqlDataAdapter para escribir ese mismo datatable sobre el SQL Server. No es que no se pueda hacer con LINQ o con Entity Framework, pero para ello necesitarías usar un bucle para recorrer uno por uno los registros, y luego ir asignando una por una las columnas de la tabla a las propiedades de la Entidad para poderla grabar. Te va a ocupar mucho más código que si usas el dataadapter.

     

    • Marcado como respuesta Jasgo miércoles, 1 de febrero de 2012 2:49
    martes, 31 de enero de 2012 7:30
  • Entendido gracias saludos!!
    miércoles, 1 de febrero de 2012 2:49