FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Saber el nombre de una tabla/hoja en Access/Excel
Hola de nuevo a tod@s!
Vaya que si me surgen cosas retadoras, jeje 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 Saludos desde México Alejandro |
#2
|
||||
|
||||
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; Código:
HojasExcel('archivo.xls', ListBox.Items); // Saludos |
#3
|
||||
|
||||
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 |
#4
|
|||
|
|||
Muchas gracias, Román! Lo intentaré de inmediato y te dejo saber si me funcionó o no
Saludos desde México Alejandro |
#5
|
|||
|
|||
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. Salu2 desde MX Alejandro |
#6
|
||||
|
||||
Cita:
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 |
|
|
|