Hola, un cordial saludo, necesito leer una hoja de Calculo y aunque ya lo hice de la siguiente forma:
Código Delphi
[-]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.