none
Porqué al importar de Excel el dataGridView me carga solo números, no el texto. RRS feed

  • Pregunta

  • Tal vez a alguien le ha pasado, he intentado varias formas y el resultado es el mismo, tengo un archivo Excel con datos numéricos y cadenas, cuando importa solo carga los números.

    este es mi código:

    string conexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ruta + ";Extended Properties='Excel 12.0 XML;HDR=YES;';";

                using (OleDbConnection con = new OleDbConnection(conexion))

                {

                    con.Open();

                    var docName = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString();

                    using (OleDbCommand cmd = new OleDbCommand("Select * From [" + docName + "]", con))

                    {

                            OleDbDataAdapter sda = new OleDbDataAdapter(cmd);

                            DataTable data = new DataTable();

                            sda.Fill(data);

                            dataGridView1.DataSource = data;

                            label1.Text = dataGridView1.Rows.Count.ToString();

                    }

                }

    y el resultado es éste, además también me carga varias filas vacías al final.

    Aprecio su ayuda.

    Lo que necesito es cargar una gran cantidad de datos.


    domingo, 9 de febrero de 2020 12:22

Respuestas

  • El motivo por el que esto sucede es que el proveedor de OleDb que devuelve una tabla a partir del Excel tiene que decidir un tipo de dato para las columnas de la tabla. Hace esto examinando los datos que hay en la primera fila que lee. Si en esa fila hay una columna que resulta ser numérica, entonces la configura como numérica en la tabla. Y esto ocasiona que si más abajo viene en la columna un dato que no es numérico, ese dato no se puede cargar.

    El remedio es añadir ";IMEX=1" en las Extended Properties en la cadena de conexión. Significa "Intermixed", que quiere decir que se van a leer datos "entremezclados". Esto hace que declare todas las columnas como String y por tanto admita todos los datos. Tenlo en cuenta para el caso de que alguna columna realmente sea numérica y tengas que hacer cálculos con los números. En ese caso tendrías que convertir de vuelta desde el String al número después de haber leído los datos de Excel.


    domingo, 9 de febrero de 2020 15:19
    Moderador

Todas las respuestas

  • El motivo por el que esto sucede es que el proveedor de OleDb que devuelve una tabla a partir del Excel tiene que decidir un tipo de dato para las columnas de la tabla. Hace esto examinando los datos que hay en la primera fila que lee. Si en esa fila hay una columna que resulta ser numérica, entonces la configura como numérica en la tabla. Y esto ocasiona que si más abajo viene en la columna un dato que no es numérico, ese dato no se puede cargar.

    El remedio es añadir ";IMEX=1" en las Extended Properties en la cadena de conexión. Significa "Intermixed", que quiere decir que se van a leer datos "entremezclados". Esto hace que declare todas las columnas como String y por tanto admita todos los datos. Tenlo en cuenta para el caso de que alguna columna realmente sea numérica y tengas que hacer cálculos con los números. En ese caso tendrías que convertir de vuelta desde el String al número después de haber leído los datos de Excel.


    domingo, 9 de febrero de 2020 15:19
    Moderador
  • Gracias  por su pronta respuesta, ahora si carga todos los datos.

    la cadena quedaría así:

    string conexion = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" + ruta + ";Extended Properties = 'Excel 12.0 XML;HDR=YES;IMEX=1'";

    • Editado wildibust domingo, 9 de febrero de 2020 16:36
    domingo, 9 de febrero de 2020 16:20