OleDB y tipos de datos mixtos de Excel: datos faltantes


Answers

Varios foros que encontré afirman que al agregar IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text to the Extended Properties en la cadena de conexión solucionaría el problema, pero este no era el caso. Finalmente resolví este problema agregando "HDR = NO" a las Propiedades Extendidas en la cadena de conexión (como muestra Brian Wells arriba) para poder importar tipos mixtos.

Luego agregué un código genérico para nombrar las columnas después de la primera fila de datos, luego eliminé la primera fila.

    public static DataTable ImportMyDataTableFromExcel(string filePath)
    {
        DataTable dt = new DataTable();

        string fullPath = Path.GetFullPath(filePath);

        string connString =
           "Provider=Microsoft.Jet.OLEDB.4.0;" +
           "Data Source=\"" + fullPath + "\";" +
           "Extended Properties=\"Excel 8.0;HDR=No;IMEX=1;\"";

        string sql = @"SELECT * FROM [sheet1$]";

        using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, connString))
        {
            dataAdapter.Fill(dt);
        }

        dt = BuildHeadersFromFirstRowThenRemoveFirstRow(dt);

        return dt;
    }

    private static DataTable BuildHeadersFromFirstRowThenRemoveFirstRow(DataTable dt)
    {
        DataRow firstRow = dt.Rows[0];

        for (int i = 0; i < dt.Columns.Count; i++)
        {
            if(!string.IsNullOrWhiteSpace(firstRow[i].ToString())) // handle empty cell
              dt.Columns[i].ColumnName = firstRow[i].ToString().Trim();
        }

        dt.Rows.RemoveAt(0);

        return dt;
    }
Question

Tengo una hoja de cálculo de Excel que quiero leer en una tabla de datos; todo está bien, excepto una columna en particular en mi hoja de Excel. La columna, 'ProductID', es una combinación de valores como ########## n######### .

Traté de dejar que OleDB manejara todo automáticamente, leyéndolo en un conjunto de datos / tabla de datos, pero cualquier valor en 'ProductID' como n###### falta, se ignora y se deja en blanco. Intenté crear manualmente mi DataTable al recorrer cada fila con un lector de datos, pero con exactamente los mismos resultados.

Aquí está el código:

// add the column names manually to the datatable as column_1, column_2, ...
for (colnum = 0; colnum < num_columns; colnum ++){
  ds.Tables["products"].Columns.Add("column_" +colnum , System.Type.GetType("System.String")); 
}
while(myDataReader.Read()){
  // loop through each excel row adding a new respective datarow to my datatable 
  DataRow a_row = ds.Tables["products"].NewRow();
  for (col = 0; col < num_columns; col ++){
    try {  a_row[col] = rdr.GetString(col);  }
    catch {  a_row[col] = rdr.GetValue(col).ToString(); }
  }
  ds.Tables["products"].Rows.Add(a_row);
}

No entiendo por qué no me deja leer en valores como n###### . ¿Cómo puedo hacer esto?




Hay dos formas de manejar tipos de datos mixtos y excel.

Método 1

  • Abra su hoja de cálculo de Excel y configure manualmente el formato de columna en el formato deseado. En este caso, 'Texto'.

Método 2

  • Hay un "truco" que consiste en agregar "IMEX = 1" a su cadena de conexión de la siguiente manera:

    Proveedor = Microsoft.Jet.OLEDB.4.0; Fuente de datos = miarchivo.xls; Propiedades extendidas = Excel 8.0; IMEX = 1

  • Esto intentará manejar formatos mixtos de Excel según cómo esté configurado en su registro. Esto puede establecerlo usted localmente, pero para un servidor, probablemente esta no sea una opción.




Acceso directo -> si tienes una columna de tipo mixto en Excel: ordena tu columna de Z a A

Revisé todas las respuestas aquí y algunas funcionaron para mí y otras no, sin embargo, ninguna era deseable para mí porque de alguna manera ADO no eligió los datos en una columna de tipo mixto que tenía en mi archivo de Excel. Tuve que configurar HDR=NO para que ADO leyera mi columna de hoja de cálculo que es una mezcla de texto y números y de esa manera pierdo la capacidad de usar encabezados de columna en mis declaraciones de SQL, lo que no es bueno. Si el orden de las columnas cambia en el archivo de Excel, la instrucción SQL dará como resultado un error o una salida incorrecta.

En una columna de tipo de datos mixtos, la clave son las primeras 8 filas. ADO determina el tipo de datos para la columna en base a las primeras 8 filas Por lo tanto, si aún desea modificar su cadena de conexión con los parámetros extendidos, simplemente ordene su columna Z a A en su archivo Excel antes de leer los datos por ADO para que así las filas en la parte superior son las de texto y luego su columna se seleccionará como texto.

Si sus filas iniciales son números (independientemente de si su columna está configurada para formatear TEXTO en Excel), ADO determinará esas columnas como un tipo numérico, por lo que una vez que lea las filas de texto a continuación, no podrá convertirlas en números. En el caso opuesto, si la columna es texto determinado, si hay una fila si número, se puede convertir como texto.






Links