PDA

Ver la Versión Completa : Leer una hoja de Calculo Sin tener Excel instalado


RONPABLO
10-10-2005, 21:47:06
Hola, un cordial saludo, necesito leer una hoja de Calculo y aunque ya lo hice de la siguiente forma:

procedure TForm1.EjecutarExcell(rutaArchivo : String);
var
Excel : Variant;
i : Integer;
begin
try
try
Excel := CreateOleObject('Excel.Application');
Excel.WorkBooks.Open(rutaArchivo);
Excel.WorkBooks.Open(OpenDialog1.FileName);
tabla.Open;
for I := 1 to Excel.Rows.CurrentRegion.Rows.Count do
begin
if Excel.Range[ObtenerCelda('a',i)].Value = '' then
begin
if tabla.recordCount = 0 then
tabla.edit
else
tabla.insert;
tabla.FieldbyName('a').asString :=
Excel.Range[ObtenerCelda('a',i)].Value;
tabla.FieldbyName('b').asString :=
Excel.Range[ObtenerCelda('b',i)].Value;
tabla.FieldbyName('c').asString :=
Excel.Range[ObtenerCelda('c',i)].Value;
tabla.FieldbyName('d').asString :=
Excel.Range[ObtenerCelda('d',i)].Value;
tabla.FieldbyName('e').asString :=
Excel.Range[ObtenerCelda('e',i)].Value;
tabla.FieldbyName('f').asString :=
Excel.Range[ObtenerCelda('f',i)].Value;
tabla.FieldbyName('g').asString :=
Excel.Range[ObtenerCelda('g',i)].Value;
tabla.FieldbyName('h').asString :=
Excel.Range[ObtenerCelda('h',i)].Value;
tabla.FieldbyName('i').asString :=
Excel.Range[ObtenerCelda('i',i)].Value;
tabla.post;
tabla.Next;
end;
end;
except
trans.rollback;
raise;
end;
finally
tabla.applyUpdate;
tabla.Close;
trans.commit;
Excel.Quit;
end;
end;

function TForm1.ObtenerCelda(letra : String; Columna :Integer): String;
begin
Result := letra + IntToStr(Columna);
End;


Pero tengo dos inquietudes sobre la forma como lo hago:

1. Como puedo hacer mas rapido la lectura ya que son al rededor de 15.000 registros y se me demora varios minutos haciendolo (la info la guardo en una bd Firebird, pero la demora no es por esto, ya que como prueba cambie donde igualaba los campos por variables llamadas a, b, c,..., i. Todas de tipo String y la demora fue similar).
2. Hay forma de recorrer los registros sin que ejecute excel ni ninguna otra hoja de Calculo.

roman
10-10-2005, 21:57:04
En cuanto a lo primero yo te recomiendo usar ADO en lugar de OLE. En el hilo Llevar desde Excel a una BD paradox (http://www.clubdelphi.com/foros/showthread.php?t=2696) puedes ver cómo hacerlo y verás que según una prueba que hice, tardé aproximadamente cuatro minutos en transferir 65000 registros (el máximo que permite Excel) contra más de media hora y otros problemas que tenía el forista que preguntó en aquel entonces.

// Saludos

RONPABLO
12-10-2005, 06:01:51
Lo hice de la misma forma que esta en el ejemplo y me funciono muy bien y eso que no queria hacerlo por medio de ADO, ademas le agregue que pudiera buscar la ruta del archivo de la siguiente forma


procedure TFPrincipal.hojaCalculo;
begin
if ODabrirExcel.Execute then
begin
Modulo.DBExcel.ConnectionString :=
wideString('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
+ ODabrirExcel.FileName
+ ';Extended Properties=Excel 8.0;Persist Security Info=False');
Modulo.TExcel.Open;
EjecutarExcel;
end;
end;

procedure TFPrincipal.EjecutarExcel;
begin
try
try
begin
Modulo.TExcel.First;
while not Modulo.TExcel.Eof do
begin
if Modulo.QBuscarPaciente.Active then
Modulo.QBuscarPaciente.Close;
Modulo.QBuscarPaciente.ParamByName('id').AsString := Modulo.TExcel.Fields[0].AsString;
Modulo.QBuscarPaciente.Open;
if Modulo.QBuscarPaciente.RecordCount = 0 then
begin
Label1.Caption := Modulo.TExcel.Fields[0].AsString;
Label2.Caption := Modulo.TExcel.Fields[1].AsString;
Label3.Caption := Modulo.TExcel.Fields[2].AsString;
Label4.Caption := Modulo.TExcel.Fields[3].AsString;
Label5.Caption := Modulo.TExcel.Fields[4].AsString;
Label6.Caption := Modulo.TExcel.Fields[5].AsString;
Label7.Caption := Modulo.TExcel.Fields[6].AsString;
Label8.Caption := Modulo.TExcel.Fields[7].AsString;
end;
Modulo.TExcel.Next;
end;
end;
except
raise;
end;
finally
Modulo.TExcel.Close;
end;
end;
procedure TFPrincipal.Button1Click(Sender: TObject);
begin
hojaCalculo;
end;