Ver Mensaje Individual
  #3  
Antiguo 23-01-2014
Avatar de juanlaplata
juanlaplata juanlaplata is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Plata, Bs. As. (Argentina)
Posts: 212
Reputación: 18
juanlaplata Va por buen camino
Código Delphi [-]

.....

USES ComObj ;

.....

procedure Exportar_Grilla_Excel(FileName:String; Grilla: TDBGrid; ProgressBarXls: TProgressBar);
    procedure ProgressBarInit;
    begin
      ProgressBarXls.Max := Grilla.DataSource.DataSet.RecordCount;
      ProgressBarXls.Position := 0;
      ProgressBarXls.Visible := True;
    end;

var ExcelApp, Libro: Variant;
    Nombre : string;
    fila, i, j :integer;
    PBookmark: TBookmark;
begin

  // destino y nombre de archivo ******
  ForceDirectories(ExtractFilePath(ParamStr(0)) + 'Reportes');
  {Utilizaremos el SaveDialog para definir el nombre del fichero y la ruta donde se guardara el reporte pdf}
  SaveDialog1.Title := 'Exportando Reporte a Excel';
  SaveDialog1.DefaultExt := 'xls';
  SaveDialog1.InitialDir := ExtractFilePath(ParamStr(0)) + 'Reportes';

  SaveDialog1.FileName:= FileName+'.xls';

  SaveDialog1.Filter:='Archivos Excel (*.xls)|*.xls';
  SaveDialog1.FilterIndex:=1;

  try
    SaveDialog1.Execute;
    if (SaveDialog1.FileName<>'') then
      begin
      // Comprobar si existe el component TProgressBar
      if (ProgressBarXls <> nil) then
        ProgressBarInit;

      // Guardar la posición en la DB y desactivar que se mueva el registro
      PBookmark := Grilla.DataSource.DataSet.GetBookmark;
      Grilla.DataSource.DataSet.DisableControls;

      ExcelApp:=CreateOleObject('Excel.Application');

      Nombre:= SaveDialog1.FileName;
      ExcelApp.DisplayAlerts:=false;

      //Comienzo a llenar las celdas

      // crea el archivo
      ExcelApp.WorkBooks.Add();

      // determ. nombre hoja
      ExcelApp.WorkBooks[1].ActiveSheet.Name := FileName;

      // trabajo sobre la hoja
      Libro := ExcelApp.WorkBooks[1].ActiveSheet;

      // horientacion de pagina
      Libro.PageSetup.Orientation := 1;    // 1-vertical; 2-horiz

      // Fila sobre la que esta por escribir
      fila:=1;

      // agregar cabecera de Grilla    ****************************************
      for i:= 0 to Grilla.Columns.Count-1 do
        begin
        Libro.Cells[fila,i+1]:= Grilla.Columns[i].Title.Caption;
        Libro.Cells[fila,i+1].Font.Bold := True;
        Libro.Cells[fila,i+1].font.Size := 12;
        Libro.Cells[fila,i+1].font.Color := clWhite;
        Libro.Cells[fila,i+1].Interior.Color := clGray ;
        Libro.Cells[fila,i+1].HorizontalAlignment := xlcenter ;
        end;

      // Fila siguiente
      inc(fila);

      // Datos Grilla *****************************************
      Grilla.DataSource.DataSet.First;
      for i:= 1 to Grilla.DataSource.DataSet.RecordCount do
        begin
        for j:= 0 to Grilla.Columns.Count-1 do
          begin
          {Libro.Cells[fila,j+1].NumberFormat := '0';
          Libro.Cells[fila,j+1]:= Grilla.Columns[j].Field.DisplayText;}

          case Grilla.Columns[j].Alignment of
            taLeftJustify: Libro.Cells[fila,j+1].HorizontalAlignment := xlLeft;
            taRightJustify: Libro.Cells[fila,j+1].HorizontalAlignment := xlRight;
            taCenter: Libro.Cells[fila,j+1].HorizontalAlignment := xlCenter;
          end;

          case Grilla.Fields[J].DataType of
            ftAutoInc, ftBytes, ftInteger, ftSmallint, ftWord: // Auto o Numérico
              begin
              Libro.Cells[fila,j+1].NumberFormat := '0';
              Libro.Cells[fila, J +1] := Grilla.Fields[J].AsInteger;
              end;

            ftBCD, ftFloat, ftCurrency: // Numérico con decimales
              begin
              Libro.Cells[fila,j+1].NumberFormat := '0.00';
              Libro.Cells[fila, J +1] := Grilla.Fields[J].AsFloat;
              end;

            ftDateTime, ftDate, ftTime: // Fecha y Hora
              begin
              Libro.Cells[fila, J +1] := Grilla.Fields[J].AsDateTime;
              end;

            else // Todo lo demas caracteres
              begin
              Libro.Cells[fila,j+1].NumberFormat := RPad('0', '0', Length(Grilla.Fields[J].AsString));
              Libro.Cells[fila,J+1]:= Grilla.Fields[J].AsString ;
              end;
          end;

          end;

        Grilla.DataSource.DataSet.Next;
        // Fila siguiente
        inc(fila);
        
        // Comprobar si existe el component TProgressBar
        if (ProgressBarXls <> nil) then
          ProgressBarXls.Position := ProgressBarXls.Position +1;
        end;

      // Comprobar si existe el component TProgressBar
      if (ProgressBarXls <> nil) then
        ProgressBarXls.Visible := False;

      // automatizar ancho de columnas
      Libro.Cells.Columns.AutoFit;
      
      // Guarda y cierra el archivo
      Libro.SaveAs(Nombre);
      ExcelApp.Visible := true;

      // posicionar el registro donde estaba
      Grilla.DataSource.DataSet.GotoBookmark(PBookmark);
      Grilla.DataSource.DataSet.FreeBookmark(PBookmark);
      Grilla.DataSource.DataSet.EnableControls;
      end;
    except
    ExcelApp.Quit;

    // Comprobar si existe el component TProgressBar
    if (ProgressBarXls <> nil) then
      ProgressBarXls.Visible := False;
      
    // posicionar el registro donde estaba
    Grilla.DataSource.DataSet.GotoBookmark(PBookmark);
    Grilla.DataSource.DataSet.FreeBookmark(PBookmark);
    Grilla.DataSource.DataSet.EnableControls;

    showmessage('No se pudo crear el Archivo Excel.');
    raise;
    end;
end;
Responder Con Cita