Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Saber el nombre de una tabla/hoja en Access/Excel (https://www.clubdelphi.com/foros/showthread.php?t=8847)

atirado 03-04-2004 04:00:53

Saber el nombre de una tabla/hoja en Access/Excel
 
Hola de nuevo a tod@s! :p
Vaya que si me surgen cosas retadoras, jeje :p
El caso es que estoy haciendo una aplicación donde se compara una tabla de Access contra una tabla de Excel. Hasta ahí todo bien; lo hago usando un ADODataSet, con su conectionstring utilizando adecuadamente el MDB y XLS que el usuario abre.
Sin embargo, la necesidad del programa es que el usuario pueda seleccionar la tabla/hoja desde donde se importarán los datos.
Se que dicho nombre debe ir en la propiedad CommandText, eso no es problema. Lo que quiero saber es si hay alguna propiedad del ADODataSet desde donde pueda recuperar los nombres de todas las tablas/hojas disponibles para que el usuario elija la que necesita.
Les paso una parte del código, aclarando que estoy usando D7 y la versión más nueva de ADO (no recuerdo cuál es, pero sí se que es la más nueva), así como un action list donde se ejcutan las siguientes instrucciones:
Código:

try
  strConexionS                        := actAbrirSua.Dialog.FileName;
  dscSua.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;
Data Source='+strConexionS+';Mode=ReadWrite;
Persist Security Info=False';
  dscSua.CommandType          := cmdTableDirect;
//aquí directamente le tengo qué decir que la tabla se llama 'datosempleados'
  dscSua.CommandText          := 'datosempleados';
  dscSua.Open;
  dscSua.Active                  := True;
 except
        on EOLEException do
        begin
          ShowMessage('No se pudo abrir la tabla');
          raise;
        end
        else
                ShowMessage('Error desconocido');
                raise;
 end; //try

De antemano agradezco la ayuda que me puedan brindar. Y no se preocupen, les estaré trayendo nuevos retos ;)

Saludos desde México
Alejandro

roman 03-04-2004 08:40:27

Desconozco si es posible hacer esto utilizando ADO. A fin de cuentas un libro de Excel no es propiamente una base de datos cuyas tablas sean las hojas.

Prueba a ver si te sirve esto:

Código:

uses
  ComObj;

...

procedure HojasExcel(Archivo: String; Lista: TStrings);
var
  Excel: OleVariant;
  Libro: OleVariant;
  I: Integer;

begin
  Excel := CreateOleObject('Excel.Application');
  Libro := Excel.WorkBooks.Open(Archivo);

  try
    Lista.Clear;
    for I := 1 to Libro.Worksheets.Count do
      Lista.Add(Libro.Worksheets.Item[i].Name);
  finally
    Libro.Close;
  end;
end;

Al procedimiento le pasas el nombre del archivo de Excel y un objeto de tipo TStrings para recibir los nombres de las hojas, por ejemplo un ListBox:

Código:

HojasExcel('archivo.xls', ListBox.Items);
Este código me funciona bien con Excel 2000.

// Saludos

roman 03-04-2004 08:47:17

Una observación:

En lugar de crear una instancia de Excel con CreateOleObject podrías utilizar una componente TExcelApplication de la paleta Servers. Así lo probé inicialmente y funciona. El incoveniente es que entonces debes llenar todos los parámetros del método Open que son muchísimos e irrelevantes para lo que se busca.

// Saludos

atirado 03-04-2004 18:36:10

Muchas gracias, Román! Lo intentaré de inmediato y te dejo saber si me funcionó o no :D


Saludos desde México :cool:
Alejandro

atirado 03-04-2004 21:17:14

Hola de nuevo, Román!

Pues no, no funcionó, fíjate. Lo intenté con ADO y con un TExcelApplication y nada.
Ni siquiera me acepta la propiedad Names, pues me dice que no existe, y eso lo hice cuando ya tenía el TExcelApplication, por lo que no se a qué se debe.
Mi código de todo el Unit quedó de la siguiente manera:
Código:

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleServer, Excel2000, DB;
type
  TForm1 = class(TForm)
        DataSource1: TDataSource;
        Excel: TExcelApplication;
        cbxHojas: TComboBox;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
  private
        { Private declarations }
  public
        { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
  Libro: _WORKBOOK;
  Hoja: _WORKSHEET;
  I : Integer;
begin
  Libro := Excel.Workbooks.Open('D:\Mis Documentos\atirado\Excel\nomina.xls',
false,false,
null,'',null,true,null,'',
true,null,null,false,0);
  For I:= 1 to Libro.Worksheets.Count do
        cbxHojas.items.add(Libro.Worksheets.Item[i].Name);
  Hoja := Libro.Sheets[1] as _WORKSHEET;
  Excel.Visible[0] := true;
end;
end.

De cualquier manera gracias; creo que simplemente no se puede hacer eso en Delphi:(

Salu2 desde MX
Alejandro

roman 04-04-2004 22:23:05

Cita:

Empezado por atirado
creo que simplemente no se puede hacer eso en Delphi

El código que te puse lo hace sin ningún problema de manera que tu observación es demasiado contundente y falsa.

Es posible que dependiendo de la versión de Excel, el nombre de algunas propiedades sea distinto y habrá que ajustarse a ello estudiando la ayuda de VB que incluye Office o bien consultando el SDK de Windows.

De cualquier manera, como no dices si probaste el procedimiento que te pasé ni en su caso, que errores te marcó, así como tampoco indicas la versión de Excel que usas, ni la versión de Delphi ni la versión de las componentes Office, es imposible en estos momentos tratar de dilucidar lo que pasa.

// Saludos


La franja horaria es GMT +2. Ahora son las 01:56:26.

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