Ver Mensaje Individual
  #1  
Antiguo 25-03-2022
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Reputación: 14
novato_erick Va por buen camino
Optimización en exportación a Excel

Saludos primeramente Chicos:

realizando consulta por el club y encontrando varias códigos de interés a mi propósito para exportación desde Delphi utilizando ClientDataSet seguí dichas indicaciones de esta forma:

Código Delphi [-]
procedure EmiteInformeVenta(FechaVentasIni, FechaVentasFin:TDate;
  mGridExport :TDataSet);
  var
   rangoExcel : Excel2000.ExcelRange;
   I, Fila : Integer;
   mMarcador : TBookmark;
   mTabla : TDataSet;
   AplicacionExcel:  TExcelApplication;
begin
with  dmReportes.qInformeVentaNombreClientes do
begin
  ParamByName('FECHAINI').AsDate := FechaVentasIni;
  ParamByName('FECHAFIN').AsDate := FechaVentasFin;
  ExecSQL;
end;
  if dmReportes.cdsInformeVentaNombreCliente.Active = True then
  begin
    dmReportes.cdsInformeVentaNombreCliente.EmptyDataSet;
    dmReportes.cdsInformeVentaNombreCliente.Active := False;
  end;
  dmReportes.cdsInformeVentaNombreCliente.Active := True;
  //procedimiento de ajdsoft   https://www.ajpdsoft.com/modules.php...owpage&pid=117
  //Creamos el libro de Excel (Abriendo Excel)
  AplicacionExcel := TExcelApplication.Create(Nil);
  //Asociamos el dataset (tabla) del DBGrid con la tabla
  //que utilizaremos en esta función
  mTabla := dmReportes.cdsInformeVentaNombreCliente;
  AplicacionExcel.Visible[0] := True;
  //Creamos el nuevo libro de Excel
  AplicacionExcel.ConnectKind := ckNewInstance;
//https://delphi.cjcsoft.net/viewthread.php?tid=46003
//mejoras de codigo porque me enviaba despues de 900 registro error raised exception class EOleException with message 'OLE error 800AC472'. delphi
  AplicacionExcel.Connect;
  AplicacionExcel.Workbooks.Add(NULL, 0);
  //primera fila con los nombres de las columnas
  //para ello recorremos todos las columnas de la tabla
  //y mostramos en Excel el valor de "DisplayLabel"
  rangoExcel := AplicacionExcel.ActiveCell;
  for I := 0 to mTabla.FieldCount -1 do
    begin
      rangoExcel.Value := mTabla.Fields[i].DisplayLabel;
      rangoExcel := rangoExcel.Next;
    end;
  //aplicamos un autoformato de Excel a las filas y columnas añadidas
  rangoExcel.AutoFormat(10, NULL, NULL, NULL, NULL, NULL, NULL);
  mTabla.DisableControls;
  try
    mMarcador := mTabla.Bookmark;
       try
     //recorremos todos los registros de la tabla para ir añadiéndolos
     //a la hoja actual de Excel
      mTabla.First;
      Fila := 2;
      while not mTabla.Eof do
      begin
        rangoExcel := AplicacionExcel.Range['A' + IntToStr(Fila), 'A' +
         InttoStr(Fila)];
        for I := 0 to mTabla.Fields.Count -1 do
          begin
            rangoExcel.Value := mTabla.Fields[i].AsString;
            rangoExcel := rangoExcel.Next;
          end;
          mTabla.Next;
          Inc(Fila);
      end;
       finally
         mTabla.Bookmark := mMarcador;
         mTabla.EnableControls;
       end;
  finally
     AplicacionExcel.Disconnect;
     AplicacionExcel.Free;
  end;
end;

en fin al ejecutar la exportación de 10,000 mil registro es demasiado lento casi 4 minutos.

Alguien podría ayudarme a la optimización para que sea más rápida la exportación ?

Agradeciendo su colaboración;

Saludos;

novato_erick
Responder Con Cita