Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Abrir hoja/libro excel (https://www.clubdelphi.com/foros/showthread.php?t=96305)

Angel.Matilla 19-07-2023 12:02:59

Abrir hoja/libro excel
 
Buenos días a todos. Necesitaba, con una aplicación en BCB 6, abrir un libro excel que contiene varias hojas diferentes. He estado viendo hilos por los foros y el que más información me ha dado es Excel a DBGrid. Me he bajado los ejemplos que cita Neftalí.

Tengo puesto este código para conectarme al libro:
Código:

try
{
    ADOConnection1->Close();
    ADOConnection1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + OpenDialog->FileName + ";Extended Properties=Excel 8.0;Persist Security Info=False";
    ADOConnection1->Open();
}
catch(Exception &Exc)
{
    return;
}

Pero al ejecutar el open me da este error:

El libro está cerrado al ejecutar el open y no está protegido con ninguna contraseña. En uno de los ejemplos que cita Neftalí (ADO_Excel_2) veo que define dos constantes:
Cita:

CONN_1 = 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=.\Data.xls;' +
' Mode=Share Deny None;Extended Properties="Excel 8.0;HDR=Yes;';
CONN_2 = 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=.\Datos.xls;' +
' Mode=Share Deny None;Extended Properties="Excel 8.0;HDR=Yes;';
imagino que esas constantes lo que hacen es evitar ese error que me aparece, pero no veo como se usan luego las mismas.

Por otra parte me surge una duda: como he comentado el libro tiene varias hojas, ¿cómo hago para ir moviéndome a lo largo de ellas? El elemento ADOTable ¿interpreta cada una de las hojas como una tabla distinta?

duilioisola 19-07-2023 12:18:36

El mensaje de error dice: "... no puede abrir el archivo ''. ..."
Por el hecho de que después de la palabra "archivo" hay dos comilla simples, revisa estos dos comentarios que hago:
  • Asegúrate de que el nombre del archivo no está en blanco.
  • Además, el nombre del archivo puede tener que ir entre comillas (quizás dobles, quizás simples).

En Delphi OpenDialog se utiliza en varios pasos:

Código Delphi [-]
// Inicializo el fichero por defecto a utilizar
OpenDialog.FileName  := ''

// Execute devuelve True si aceptó el fichero seleccionado o False si canceló la selección
if OpenDialog.Execute then
begin
   // Si seleccionó un fichero obtengo el nombre para tratarlo
   FicheroExcel := OpenDialog.FileName;

   [...]
try
{
     ADOConnection1->Close();
     ADOConnection1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + OpenDialog->FileName + ";Extended Properties=Excel 8.0;Persist Security Info=False";
     ADOConnection1->Open();
}
catch(Exception &Exc)
{
     return;
}
   [...]
end;

Angel.Matilla 19-07-2023 13:16:23

Gracias por la respuesta. He puesto sólo el código del TADOConnection; evidentemente estoy seguro que el nombre del fichero no está vacío, y para evitar problemas he simplificado el nombre del fichero a RESULTADOS.XLS, eliminando espacios en blanco y demás.

Por otra parte he cogido el código que comentaba antes del ejemplo y he puesto así la conexión:
Código:

ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=" + OpenDialog->FileName + ";Extended Properties=Excel 8.0;Persist Security Info=False;HDR=Yes;";
Intuyo que ese útimo trozo (HDR=Yes) es para indicar que la hoja tiene cabceras. Ahora me da otro error distinto:

Neftali [Germán.Estévez] 19-07-2023 13:47:55

Cita:

Empezado por Angel.Matilla (Mensaje 552125)
Necesitaba, con una aplicación en BCB 6, abrir un libro excel que contiene varias hojas diferentes. He estado viendo hilos por los foros y el que más información me ha dado es Excel a DBGrid. Me he bajado los ejemplos que cita Neftalí.
...
Pero al ejecutar el open me da este error:
...
El libro está cerrado al ejecutar el open y no está protegido con ninguna contraseña. En uno de los ejemplos que cita Neftalí (ADO_Excel_2) veo que define dos constantes:

imagino que esas constantes lo que hacen es evitar ese error que me aparece, pero no veo como se usan luego las mismas.

¿Es posible que el libro de Excel sea un formato nuevo?
Fíjate que ahí está usando Jet 4.0 y Excel 8.0. Si el libro está en un formato más nuevo puede ser que de error.

Prueba a abrir con esa línea un Excel grabado en una versión antigua.

Cita:

Empezado por Angel.Matilla (Mensaje 552125)
Por otra parte me surge una duda: como he comentado el libro tiene varias hojas, ¿cómo hago para ir moviéndome a lo largo de ellas? El elemento ADOTable ¿interpreta cada una de las hojas como una tabla distinta?

Correcto.
El libro es el equivalente a una Base de Datos y cada una de las hojas es el equivalente a una tabla.

Neftali [Germán.Estévez] 19-07-2023 13:49:59

Cita:

Empezado por Angel.Matilla (Mensaje 552127)
Ahora me da otro error distinto:

Si quieres adjunta la hoja de Excel, con unos datos de ejemplo y probamos...

Angel.Matilla 19-07-2023 19:45:33

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 552129)
Si quieres adjunta la hoja de Excel, con unos datos de ejemplo y probamos...

Ahora mismo no tengo el PC a mano. Mañana por la mañana subo el libro.

Angel.Matilla 19-07-2023 19:48:05

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 552128)
¿Es posible que el libro de Excel sea un formato nuevo?
Fíjate que ahí está usando Jet 4.0 y Excel 8.0. Si el libro está en un formato más nuevo puede ser que de error.

Prueba a abrir con esa línea un Excel grabado en una versión antigua.

Yo lo abro con Office 2007, pero es posible.

Angel.Matilla 20-07-2023 10:02:23

2 Archivos Adjunto(s)
Os adjunto dos ficheros. RESULTADOS.RAR contiene el fichero tal como me lo ha enviado el cliente; en RESULTADOS1.RAR hay una copia guardada en formato Excel 97-2003, por si hubiera alguna diferencia. Mientras seguiré haciendo pruebas a ver que puede pasar. Gracias de antemano.

Angel.Matilla 31-07-2023 12:47:46

Bueno, gracias a otro hilo (Llevar desde Excel a una BD paradox) he podido hacer que se conecte al libro Excel. El código queda así:
Código:

ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=admin;"
"Data Source=" + fMenu->OpenDialog->FileName + ";Mode=ReadWrite;"
"Extended Properties=Excel 8.0;Jet OLEDB:System database="";"
"Jet OLEDB:Registry Path=;Jet OLEDB:Database Password=;"
"Jet OLEDB:Engine Type=35;Jet OLEDB:Database LockingMode=0;"
"Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;"
"Jet OLEDB:New Database Password="";Jet OLEDB: Create System Database=False;"
"Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;"
"Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False";

Ahora tengo otro problema: Cómo saber cuantas hojas tiene el libro. No he visto como averiguar ese dato.

Neftali [Germán.Estévez] 31-07-2023 13:32:56

Cita:

Empezado por Angel.Matilla (Mensaje 552202)
Ahora tengo otro problema: Cómo saber cuantas hojas tiene el libro. No he visto como averiguar ese dato.


Basta con que abras la conexión (ADOConnection) y utilices el método GetTableNames.
Te devolverá la lista de tablas; En este caso la lista de Hojas del libro de Excel.

Angel.Matilla 01-08-2023 10:27:32

Muchísimas gracias.

Angel.Matilla 01-08-2023 11:00:53

Por otra parte he descubierto la razón del mensaje de error que ponía en la imagen de mi primer mensaje:

Antes de hacer el proceso de conexión del ADOConnection hay que crear el objeto; es decir que hay que añadir esta línea:
Código:

Variant Excel = CreateOleObject("Excel.Application");


La franja horaria es GMT +2. Ahora son las 07:03:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi