Pregunta

Tengo un archivo de Excel en esta forma:

Column 1    Column 2    Column 3  
 data1        data2    
 data1        data2  
 data1        data2  
 data1        data2  
 data1        data2       data3  

Es decir, toda la columna 3 está vacía a excepción de la última fila. Yo soy el acceso al archivo de Excel a través de OleDbDataAdapter, devolviendo un DataTable: aquí está el código.

query = "SELECT * FROM [" + query + "]";
objDT = new DataTable();
objCmdSQL = this.GetCommand();
objCmdSQL.CommandText = query;
objSQLDad = new OleDbDataAdapter(objCmdSQL);
objSQLDad.Fill(objDT);
return objDT;

El punto es, en este escenario mi código devuelve un DataTable con sólo Columna 1 y Columna 2.
Mi conjetura es que el motor Jet intenta inferir tipo de columna por el tipo de la primera celda de cada columna; siendo el primer valor nulo, toda la columna se ignora.
He intentado rellenar ceros y este código es en realidad volviendo las tres columnas; Esto es obviamente la solución menos preferible porque tengo que procesar un gran número de archivos pequeños.
Invirtiendo el rango de selección (de, es decir, "A1: C5" a "C5: A1") no funciona bien. Estoy buscando algo más elegante.
Ya he encontrado un par de mensajes discutiendo coincidencia de tipos (células varchar en columnas int y viceversa), pero en realidad no he encontrado nada relacionado con éste.
Gracias por leer!

editar

comportamiento

Extraño nuevo. Tengo que trabajar en su mayoría Excel 2003 archivos .xls, pero ya que esta pregunta ha sido contestada pensé que podía probar mi código con Excel 2007 .xslx archivos. La cadena de conexión es el siguiente:

string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";

Tengo la "tabla externa no está en el formato esperado" excepción que tengo por cierto es la excepción estándar cuando hay una discrepancia entre la versión ACE / JET y el archivo se abra.

La cadena

Provider=Microsoft.ACE.OLEDB.12.0 

medios que estoy usando la versión más reciente de OLEDB, di un rápido vistazo alrededor y esta versión se utiliza en todas partes hay necesidad de conectarse a .xlsx.
He tratado con sólo un proveedor de vainilla (justo Excel 12.0, sin IMEX ni HDR) pero tengo la misma excepción.
Estoy en .NET 2.0.50727 SP2, tal vez el tiempo para actualizar?

¿Fue útil?

Solución

He recreado su situación y siguientes de regresar las 3 columnas correctamente. Es decir, las dos primeras columnas completamente pobladas con los datos y la tercera nulo que contiene hasta la última fila, que tenía datos.

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";";
DataTable dt = new DataTable();
OleDbConnection conn = new OleDbConnection(connString);
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);

adapter.Fill(dt);

Nota utilicé el proveedor Access Database Engine(ACE), que sucedió al antiguo proveedor de Joint Engine Technology(JET), y mis resultados pueden representar una diferencia de comportamiento entre los dos. Por supuesto, si usted no está utilizando se sugiere emplear el proveedor ACE como creo que Microsoft también lo haría. Además, tenga en Extended Properties de la conexión:

  

"HDR = Sí"; indica que la primera   fila contiene columnnames, no datos.   "HDR = No;" indica lo contrario.

     

"IMEX = 1;" dice que el conductor siempre   leer "mezclados" (números, fechas,   cuerdas, etc) columnas de datos como texto.   Tenga en cuenta que esta opción podría afectar   Excel hoja de acceso de escritura negativo.

Avísame si esto ayuda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top