Foros del Web » Programando para Internet » ASPX (.net) »

Cómo leer un archivo Excel con Microsoft.ACE.OleDB?

Estas en el tema de Cómo leer un archivo Excel con Microsoft.ACE.OleDB? en el foro de ASPX (.net) en Foros del Web. Hola nuevamente a todos los foristas. Nuevamente les presento un problema al tratar de leer achivos de excel, ahora utilizando OLEDB. El problema es otra ...
  #1 (permalink)  
Antiguo 13/11/2008, 13:27
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Cómo leer un archivo Excel con Microsoft.ACE.OleDB?

Hola nuevamente a todos los foristas.

Nuevamente les presento un problema al tratar de leer achivos de excel, ahora utilizando OLEDB. El problema es otra vez al momento de querer leer una columna que contiene fechas. Esta columna contiene información más o menos así:
Código:
A 
----------------------------------- 
12/12/2000
12/12/2000
Sin Fecha Determinada 
12/12/2000 
12/12/2000
las Celdas A1, A2, A4 y A5 están definidas con el formato de fecha corta, mientras que la celda A3 tiene un formato Texto:

Tengo mi string de conexión como sigue:
Código:
//string de conexión
connectionString ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:/Archivo.xlsx;Extended Properties="Excel 12.0;HDR=NO"); 
//
Lo que deseo hacer es seleccionar todo el contenido del archivo y mostrarlo en un GridView. Para hacer esto hago lo siguiente:

Código:
string SelectSQL = "select * from [Hoja1$]"; 
OleDbCommand dbCommand = null; 
OleDbDataAdapter dataAdapter = null; 
DataTable dTable = null; 
try 
{ 
conn = new OleDbConnection(@connectionString); 
conn.Open(); // Abrimos la conexión al archivo 
dbCommand = new OleDbCommand(SelectSQL.ToString(), conn); 
dataAdapter = new OleDbDataAdapter(dbCommand); 
//Crear una nueva Tabla 
dTable = new DataTable(); 
dataAdapter.Fill(dTable); 
//Asignar la tabla al GridView 
if (dTable.Rows.Count > 0) 
{ 
//Lo ligamos al GridView 
GVArchivo.DataSource = dTable; 
GVArchivo.DataBind(); 
} 
} //del try 
catch (Exception ex) 
{ 
Error = true; 
} //del catch 
finally 
{ 
// Eliminar los objetos y cerrar las conexiones. 
if (dTable != null) 
{ dTable.Dispose(); } 
if (dataAdapter != null) 
{ dataAdapter.Dispose(); } 
if (dbCommand != null) 
{ dbCommand.Dispose(); } 
if (conn != null) 
{ 
conn.Close(); 
conn.Dispose(); 
conn = null; 
} 
}
El problema está en que en mi GridView para el tercer registro me regresa un vacio (null)
Código:
F1 
----------------------------------- 
12/12/2000 
12/12/2000 

12/12/2000 
12/12/2000
Me imagino que el problema está precisamente porque el tercer registro no tiene el mismo formato que los otros (es texto).

Cómo puedo especificar mi select para que me regrese correctamente todos los valores???

Saludos y muchas gracias de antemano
  #2 (permalink)  
Antiguo 14/11/2008, 09:52
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Cómo leer un archivo Excel con Microsoft.ACE.OleDB?

Hola de nuevo:

Encontré la respuesta a mi pregunta en otro foro gracias al compañero Gabriel Fabres:

http://www.lawebdelprogramador.com/news/mostrar_new.php?id=227&texto=C+sharp&n1=515644&n2= 0&n3=0&n4=0&n5=0&n6=0&n7=0&n8=0&n9=0&n0=0

Existe una propiedad que se especifica en el string de conexión para indicarle al provider que los datos tienen formatos mixtos. Por defecto el provider toma aquel formato que se repite más veces en la columna como el default, y aquellos registros que no sean de este formato los pone como null, (Ver documentación de este comportamiento en http://support.microsoft.com/kb/194124)

En mi caso son 4 registros con formato de Fecha y 1 con formato de texto, por lo tanto tomaba las Fechas como formato por defecto y los restantes los colocaba como null.

Lo único que tuve que hacer fue modificar mi cadena de conexión al archivo Excel
quedando así:

Código:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:/Archivo.xlsx;Extended Properties="Excel 12.0;HDR=NO; IMEX=1"
//
De esta manera pude leer el archivo Excel sin ningún problema.

Saludos
Leo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:17.