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.