C sharp - Leer un archivo de Excel con Microsoft.ACE.OLEDB

 
Vista:
sin imagen de perfil

Leer un archivo de Excel con Microsoft.ACE.OLEDB

Publicado por Leonardo Josué (25 intervenciones) el 13/11/2008 19:35:10
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í:
A
-----------------------------------
12/12/2000 <- Formato de Celda: Fecha
12/12/2000 <- Formato de Celda: Fecha
Sin Fecha Determinada <- Formato de Celda: Texto
12/12/2000 <- Formato de Celda: Fecha
12/12/2000 <- Formato de Celda: Fecha

Tengo mi string de conexión como sigue:
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:

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)

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Gabriel Fabres

RE:Leer un archivo de Excel con Microsoft.ACE.OLED

Publicado por Gabriel Fabres (11 intervenciones) el 14/11/2008 15:27:26
creo que no es el select el que tienes que verificar, si no que la cadena de conexion al abrir el excel.

existe una propiedad en la cadena de conexion IMEX=valor lo cual te da la posibilidad de leer con o sin formato las celdas en tu hoja de excel.

por ejemplo
oConnXLS.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sArchivo + ";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"";
abre el excel con formato.
con IMEX=0 lo abre sin formato.

el parametro HDR es para que se especifiquen o no, las columnas de encabezado (header)

mira en http://www.connectionstrings.com/?carrier=excel ahi hay informacion inportante para este caso.
espero te sirva esta informacion

Slds
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Leer un archivo de Excel con Microsoft.ACE.OLED

Publicado por Leonardo Josué (25 intervenciones) el 14/11/2008 15:36:57
Muchas Gracias Gabriel, efectivamente lo que tenía que hacer es modificar la cadena de conexión, ya hice las pruebas y todo funciona perfectamente.

Saludos y gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Leer un archivo de Excel con Microsoft.ACE.OLED

Publicado por Leonardo Josué (25 intervenciones) el 14/11/2008 16:46:26
Un detalle sólamente, creo que Gabriel puso los indices incorrectos, es decir IMEX = 1 especifica que se deben leer todos los registros como tipo Texto, ya que se tienen formatos mezclados (esta es la manera en que yo pude realizar la lectura correcta)

Con IMEX = 0 especificas al provider que no tienes formatos mezclados, entonces el provider toma aquel formato que se repite más veces y lo pone como determinado (en mi caso eran 4 fechas contra 1 texto, por lo tanto ponía el formato de Fecha como determinado). Para todos aquellos registros que no sigan este formato entonces se regresa un null (es por eso que mi texto aparecía como blanco)

Saludos nuevamente y gracias a Gabriel por el apoyo.

Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Gabriel Fabres

RE:Leer un archivo de Excel con Microsoft.ACE.OLED

Publicado por Gabriel Fabres (11 intervenciones) el 14/11/2008 19:30:52
efectivamente como dices estaba al reves la info.
cuando tienes columnas en excell con este tipo de datos mezclados, la unica solucion, (que yo veo) es abrir el archivo 2 veces con distintos valores para IMEX. Lo cual algunas veces, puede llegar a ser un problema, porque no sabes exactamente donde es que cambian tus tipos de dato.
slds
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar