none
Estoy tratando de importar un documento CSV a un DATAGRIDVIEW en una aplicacion para windows form

    Pregunta

  • Buenas tardes, he tratado de importar el contenido de un CSV a un DATAGRIDVIEW , el cual no esta conectado a datos  ni a nada. He probado distintos codigos y distintas formas de hacerlo, tambien usando librerias como LumenWorks.Framework.IO.Csv o FileHelpers, pero siempre tengo el mismo problema, y es que se me carga el archivo csv en el DataGridView ( ya que puedo ver que  aparecen las  filas en mi dataGridView que coinciden exactamente con el tamanio de filas que tengo en el CSV) pero no puedo ver que contiene, es decir  veo todo en blanco!

    No se como solucionarlo o porqu'e esto ocurre, 

    Muchisimas gracias a todos 

    martes, 20 de mayo de 2014 14:48

Respuestas

  • Hola Como os dije es un ejemplo que no esta terminado... tengo que limarlo :-)

    /// <summary>
    /// 
    /// </summary>
    /// <param name="books"></param>
    /// <param name="sheetName"></param>
    /// <returns></returns>
    Excel.Worksheet xlsFindSheet(Excel.Workbook books, string sheetName)
    {
        try
        {                
           foreach(Excel.Worksheet ws in books.Sheets)
           {
                if( ws.Name == sheetName)
                {
                    return ws;
                }
            }
        }
        catch 
        {
        }
        return null;
    }

    En tanto a "cannot convert" ... en el ejemplo estoy buscando un "DateTime", simplemente deberías cambiar el 'type' de 'headToFind' a string. Este argumento es el "texto" que buscaras en el contenido de las columnas/fila 7 en el ejemplo para encontrar un dia concreto...

    Imagina esta hoja, en la fila 7 tienes :

    6 - Totales - Luines         - Martes -
    7 -            - 14/05/2014 - 15/05/2014

    En xlsFindColContent, buscas un contenido en la fila 'findRow' empezando en la columna 'startingAt' hasta la columna 'endingAt'

    Recuerda adaptar los tipos de datos que tu quieras utilizar.
    Saludos,
    PepLluis,

    • Marcado como respuesta Sefvense jueves, 22 de mayo de 2014 7:51
    jueves, 22 de mayo de 2014 7:23

Todas las respuestas

  • Alguien mas que pueda complementar este código:

            protected void Page_Load(object sender, EventArgs e)
            {
                
                string directorio = @"C:\DOC\" + DateTime.Now.Year + " " + DateTime.Now.Month + "\\";
                string nomArch = directorio + "LIQ18.csv";
                GridView1.DataSource = parseCSV(nomArch);
                GridView1.DataBind();
            }
    
            public List<string[]> parseCSV(string path)
            {
                List<string[]> parsedData = new List<string[]>();
    
                using (StreamReader readFile = new StreamReader(path))
                {
                    string line;
                    string[] row;
    
                    while ((line = readFile.ReadLine()) != null)
                    {
                        row = line.Split(';');
                        
                        parsedData.Add(row);
                    }
                }
                return parsedData;
            }
    Lee el archivo, lo recupera en un List pero a la hora de mostrar solo muestra una especie de estructura del archivo, me imagino que hay que aumentar un par de lineas para que funcione, alguien que lo complemente?


    Roy Sillerico

    martes, 20 de mayo de 2014 15:01
  • Creo que es el mismo fallo que tengo yo...!!!

    Solo me muestra la estructura pero no el contenido. Pero yo tengo esto otro :

     private void button8_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "|*.csv";
                
                if (openFileDialog.ShowDialog()== DialogResult.OK)
                { 
      
                    bool hasHeaders = true; // o false si no tiene encabezados
                    char delimiter = ','; // o el delimitador que sea
                    string filePath = openFileDialog.FileName;
                    using (var textReader = new StreamReader(filePath))
                    using (var csvReader = new CsvReader(textReader, hasHeaders, delimiter))
                    {
                        var dataTable = new DataTable();
                        dataTable.Load(csvReader);
                        dataGridView1.DataSource = dataTable;
                    }




                }
            }

    martes, 20 de mayo de 2014 15:07
  • El código que puse hace un momento me funciona de maravilla, pero yo lo manipulo como una matriz cualquiera y lo inserto en una BD de la siguiente manera:

    List<string[]> vec2 = parseCSV(nomArch);
    
                                            for (int i = 0; i < vec2.Count; i++)
                                            {
                                                TLIQ_DETALLE_VENTA entDetalleVenta = new TLIQ_DETALLE_VENTA();
                                                entDetalleVenta.FECHA_DETALLE_VENTA = DateTime.Parse(vec2[i][0]);
                                                entDetalleVenta.NIT_CLIENTE_DETALLE_VENTA = long.Parse(vec2[i][1]);
                                                entDetalleVenta.NOMBRE_CLIENTE_DETALLE_VENTA = vec2[i][2];
                                                entDetalleVenta.PROCEDENCIA_DETALLE_VENTA = vec2[i][3];
                                                entDetalleVenta.PLACA_DETALLE_VENTA = vec2[i][4];
                                                entDetalleVenta.NRO_FACTURA_DETALLE_VENTA = int.Parse(vec2[i][5]);
                                                entDetalleVenta.NRO_AUTORIZACION_DETALLE_VENTA = long.Parse(vec2[i][6]);
                                                entDetalleVenta.NRO_CODIGO_CONTROL_DETALLE_VENTA = vec2[i][7];
                                                entDetalleVenta.MONTO_FACTURADO_DETALLE_VENTA = float.Parse(vec2[i][8]);
                                                entDetalleVenta.ID_COMBUSTIBLE_DETALLE_VENTA = vec2[i][9];
                                                entDetalleVenta.LITROS_FACTURADO_DETALLE_VENTA = float.Parse(vec2[i][10]);
                                                entDetalleVenta.PRECIO_LITRO_DETALLE_VENTA = float.Parse(vec2[i][11]);
                                                entDetalleVenta.ID_OPERADOR_DATALLE_VENTA = Session["codEESS"].ToString();
    
                                                CDetalleVenta objDetalleVenta = new CDetalleVenta();
                                                objDetalleVenta.AgregarDetalleVenta(entDetalleVenta);
                                            }
    Tal vez puedas manipularlo de una manera parecida.


    Roy Sillerico

    martes, 20 de mayo de 2014 15:10
  • yo en realidad del documento CSV lo que quiero cargar  toda la fila 3   en un DataGRIDVIew y de la fila 7 en adelante en otro DataGridView. Pero es que directamente si no puedo cargar el archivo a pelo no se como probar a hacer lo otro.

    He intentado poner las columnas y filas detalladamente como haces tu, pero pasa lo mismo...  no visualizo nada Pero se que toma los valores porque poniendo el breakpoint en el codigo veo como va cogiendo el valor que tengo en el excell pero luego no lo puedo ver en el DataGridView... 

    martes, 20 de mayo de 2014 16:30
  • mmmm, haber buscare algo que nos pueda servir, si lo encuentro y lo implemente te escribo.

    Roy Sillerico

    martes, 20 de mayo de 2014 16:37
  • Muchas Gracias , yo tambien voy a tratar de ver de que otra forma puedo hacerlo

    miércoles, 21 de mayo de 2014 7:43
  • Hola Sefense,

    Este es un ejemplo recurrente, que algunas personas necesitan.
    Estaba terminando un "helper" para un amigo que me pidió hacerlo a partir de un interop.10 de Excel.

    Se trata de abrir el .csv por detrás como si fuera un Excel y a partir de hay poder rellenar el DGV de forma personalizada con las columnas/filas que quieras.

    Si te interesa, puedo colgar provisionalmente el código en mi blog... mientras termino un ejemplo completo.

    Ya me avisaras.
    PepLluis,

    miércoles, 21 de mayo de 2014 10:34
  • Hola Pep LLuis, pues la verdad que si que me interesaria, si fueras tan amable.

    Muchisimas Gracias

    Un saludo

    miércoles, 21 de mayo de 2014 11:34
  • Aquí tienes... cualquier duda comentamos.

    http://msmvps.com/blogs/peplluis/archive/2014/05/21/helper-para-leer-xlsx-y-componerlo-en-un-datagridview.aspx

    Saludos,
    PepLluis,

    PD. Si lo necesitáis... con un poco de tiempo os lo posteo en C#
    • Editado Pep LluisMVP miércoles, 21 de mayo de 2014 13:18
    • Propuesto como respuesta Martin Fabregues miércoles, 21 de mayo de 2014 13:22
    • Marcado como respuesta Sefvense miércoles, 21 de mayo de 2014 16:47
    • Desmarcado como respuesta Sefvense miércoles, 21 de mayo de 2014 17:00
    miércoles, 21 de mayo de 2014 13:16
  • Estoy tratando de pasar el codigo a c#

    tengo dos fallos : uno en este metodo

    principalmente porque no se como definir wb para que no de error.. 

    Function xlsFindSheet(books As Excel.Workbook, sheetName As StringAs Excel.Worksheet
            Try
                For Each wb In workbook.Sheets
                    If CType(wb, Excel.Worksheet).Name = sheetName Then
                        Return wb
                    End If
                Next
                Return Nothing
            Catch ex As Exception
                Return Nothing
            End Try
        End Function

    y el otro en esta linea :

    Dim fromColA As Integer = xlsFindColContent(headToFind, rowSecondColTitle, 410)

    aqui me dice : 

    Argument 1: cannot convert from 'System.DateTime' to 'string' Refiriendose a headToFind

    y acto seguido me dice que los argumentos no son validos.

    Muchas Graaciaas

    miércoles, 21 de mayo de 2014 17:05
  • Hola Como os dije es un ejemplo que no esta terminado... tengo que limarlo :-)

    /// <summary>
    /// 
    /// </summary>
    /// <param name="books"></param>
    /// <param name="sheetName"></param>
    /// <returns></returns>
    Excel.Worksheet xlsFindSheet(Excel.Workbook books, string sheetName)
    {
        try
        {                
           foreach(Excel.Worksheet ws in books.Sheets)
           {
                if( ws.Name == sheetName)
                {
                    return ws;
                }
            }
        }
        catch 
        {
        }
        return null;
    }

    En tanto a "cannot convert" ... en el ejemplo estoy buscando un "DateTime", simplemente deberías cambiar el 'type' de 'headToFind' a string. Este argumento es el "texto" que buscaras en el contenido de las columnas/fila 7 en el ejemplo para encontrar un dia concreto...

    Imagina esta hoja, en la fila 7 tienes :

    6 - Totales - Luines         - Martes -
    7 -            - 14/05/2014 - 15/05/2014

    En xlsFindColContent, buscas un contenido en la fila 'findRow' empezando en la columna 'startingAt' hasta la columna 'endingAt'

    Recuerda adaptar los tipos de datos que tu quieras utilizar.
    Saludos,
    PepLluis,

    • Marcado como respuesta Sefvense jueves, 22 de mayo de 2014 7:51
    jueves, 22 de mayo de 2014 7:23
  • Muchisimas gracias, voy a probar a ver que tal!

    Un saludo

    jueves, 22 de mayo de 2014 7:52
  • Ok Si lo único que quieres hacer es leer un rango de columnas en una fila concreta... lo único que tienes que hacer es crear un dataset con las columnas correspondientes y añadirles una fila con las celdas de cada columna.

    Espero que esto te sirva:

            public DataTable miSeleccionExcel()
            {
                Excel.Worksheet ws = workbook.Sheets["Hola 1"];
                DataTable miSeleccion = new DataTable("Resultados");
                miSeleccion.Columns.Add("Columna 1");
                int desdeLaColumna = 0;
                int hastaLacolumna = 10;
                int numeroDeFila = 1;
                for (int Index = desdeLaColumna; Index < hastaLacolumna; Index++)
    			{
    			    miSeleccion.Rows.Add(ws.Cells[numeroDeFila,Index].Value.ToString());
    			}
                return miSeleccion;
            }

    Saludos,
    PepLluis,

    jueves, 22 de mayo de 2014 9:44
  • Hola PepLluis, segun lo que yo tengo, seria por tanto algo asi: 

                

     private void button8_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "|*.csv";

                if (openFileDialog.ShowDialog()== DialogResult.OK)
                { 

     Excel.Worksheet ws = workbook.Sheets["Example"];  //NullReferenceException Was unhandled , Object reference not set to an instance of an object
                    
                    DataTable miSeleccion = new DataTable();
                    miSeleccion.Columns.Add("Columna 1");
                    int desdeLaColumna = 0;
                    int hastaLacolumna = 10;
                    int numeroDeFila = 6;
                    for (int Index = desdeLaColumna; Index < hastaLacolumna; Index++)
                    {
                        miSeleccion.Rows.Add(ws.Cells[numeroDeFila, Index].Value.ToString());
                    }
                    return;

    }

    Pero como especifico que lo quiero pasar al DataGridView ?

    Y me da el error comentado..

    Muchisimas gracias por todo.

    Un saludo

    • Editado Sefvense jueves, 22 de mayo de 2014 11:43
    jueves, 22 de mayo de 2014 11:39
  • Hola Sefvense,

    Esto parece un serial.. jajajaja!
    En Excel.Worksheets["Example"] le estas pidiendo abrir un sheet llamado "Example" ... si no existe una hoja con ese nombre te dara una excepción pues "ws" será null.

    Para especificarlo de forma genérica "la primera hoja" deberías indicar : Excel.Worksheets[0];

    En el ejemplo al datagridview "datasource" le pasaras un datatable que contiene 10 filas correspondientes a las celdas de la fila 6, de la columna 0 a la columna 10.

    Si con lo que te explico no es suficiente, pásame un ejemplo de la hoja y montamos el codigo especifico.

    Saludos y Suerte!
    PepLluis,

    jueves, 22 de mayo de 2014 17:09
  • Si existe, exactamente lo que he hecho ha sido poner directamente el nombre de la hoja, pero es que realmente no me aparecen mas hojas, solo esta que seria la primera. Pero me da ese error, haciendo lo que me dices, me aparece tambien el mismo error. 

    Y es qe no se, porque a ver Tengo dos Datagridview.

    El primer datagridView, solo tiene una fila, y lo que quiero poner en este datagridView es exactamente la fila 3 del doc .csv

    Y en el otro DataGridView, quiero poner desde la fila 7 del .CSV hasta que se termine el doc .csv

    No necesito buscar nada, y por orta parte, la dimension de las columnas de ambos datagridview tamien estan fijadas.

    lunes, 26 de mayo de 2014 11:49
  • Hola!

    Siento que te este causando confusión.
    Para realizar lo que explicas, solo tienes que abrir el workbook y recorrer el worksheet  fila/columna que me describes.

    Ya que me dices que "si existe" substituye el nombre por :

    Excel.Worksheet ws = workbook.Sheets[0];

    Cuando dices que las columnas de DGV ya están fijadas, me confundes, pues el datasource del DGV debería ser el resultante 'datatable'.

    En otro caso si ya tienes un 'origen' de datos para los DGV deberías abrir i leer (recorrer) el worksheet y asignar directamente los valores que te directamente a las celdas que describes o al datasource que has asignado previamente.

    Saludos,
    PepLluis,

    lunes, 26 de mayo de 2014 12:27