Ver Mensaje Individual
  #11  
Antiguo 13-06-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Reputación: 20
oscarac Va por buen camino
Cita:
Empezado por olbeup Ver Mensaje
Estimado ycastilloa86,

Yo utilizo una función que he ido recopilando información hasta que he conseguilo lo que queria, bueno, aun me queda por refinarlo mas, pero me sirve.

Código Delphi [-]unit FyPExportarExcel;

interface

uses
SysUtils, DB, DBGrids, ComCtrls, ComObj, Excel2000;

procedure ExportToExcel(FileNameXLS, SheetName: String;
DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

implementation

procedure ExportToExcel(FileNameXLS, SheetName: String;
DBGrid: TDBGrid; ProgressBarXls: TProgressBar);

procedure ProgressBarInit;
begin
ProgressBarXls.Max := DBGrid.DataSource.DataSet.RecordCount;
ProgressBarXls.Position := 0;
ProgressBarXls.Visible := True;
end;

const
xlWBATworksheet = -4167;
var
Excel, WorkBook, WorkSheet: OleVariant;
I, J: Integer;
PBookmark: TBookmark;
begin
// Guardar la posición en la DB y desactivar que se mueva el registro
PBookmark := DBGrid.DataSource.DataSet.GetBookmark;
DBGrid.DataSource.DataSet.DisableControls;
DBGrid.DataSource.DataSet.First;

// Comprobar si existe el component TProgressBar
if (ProgressBarXls <> nil) then
ProgressBarInit;

// Crear instancia de la aplicación Excel
Excel := CreateOleObject('Excel.Application');

// Evitar que nos pregunte si deseamos sobreescribir el archivo
Excel.DisplayAlerts := False;

// Agregar libro de trabajo
WorkBook := Excel.Workbooks.Add(xlWBATWorksheet);

// Tomar una referencia a la hoja creada
WorkSheet := WorkBook.WorkSheets[1];

// Se describe el nombre de la hoja
WorkSheet.Name := SheetName;

// Llenamos las celdas
// Toma en cuenta que las columnas y filas empiezan en 1, y que en el
// WorkSheet.Cells[I, J], I es la fila y J es la columna.

// Extrae los nombres de los campos del DBGrid y los coloca en el primer registro,
// excluyendo los campos que están ocultos
for J := 0 to DBGrid.FieldCount -1 do
if DBGrid.Fields[J].Visible then
begin
// Poner la fuente de letra en Negrita
WorkSheet.Cells[1, J +1].Font.Bold := True;
// Centrar la celda
WorkSheet.Cells[1, J +1].HorizontalAlignment := xlCenter;
// Asignamos Valor del titulo del DBrid
WorkSheet.Cells[1, J +1] := DBGrid.Columns[J].Title.Caption;
end;

// Guardar los registros
for I := 0 to DBGrid.DataSource.DataSet.RecordCount -1 do
begin
// Identificamos los campos y lo grabamos según su tipo
for J := 0 to DBGrid.FieldCount -1 do
case DBGrid.Fields[J].DataType of
ftAutoInc, ftBytes, ftInteger, ftSmallint, ftWord: // Auto o Numérico
WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsInteger;
ftBCD, ftFloat, ftCurrency: // Numérico con decimales
WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsFloat;
ftDateTime, ftDate, ftTime: // Fecha y Hora
WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsDateTime;
else // Todo lo demas caracteres
WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsString;
end;

// Saltamos de registro
DBGrid.DataSource.DataSet.Next;

// 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;

// Redimensionar todas las celdas para que esten según su tamaño
WorkSheet.Cells.Columns.AutoFit;

// Guardar el archivo
WorkBook.SaveAs(FileNameXLS);

// Cierra el archivo
WorkBook.Close(FileNameXLS);

// Salir de Excel
Excel.Quit;

// posicionar el registro donde estaba
DBGrid.DataSource.DataSet.GotoBookmark(PBookmark);
DBGrid.DataSource.DataSet.FreeBookmark(PBookmark);
DBGrid.DataSource.DataSet.EnableControls;
end;

end.



Un saludo.

P.D.: Si puedes aportar algo a esta función te lo agradecería.
buenas noches
me gustaria ayuda con esta funcion... yo la utilizo tambien para migrar datos de un Dbgrid a un excel...

pero se me ocurrio no utilizar los titulos (nombres de los campos), si no mas bien (lo que viene aqui es idea)... crear una matriz bidimensional (array) en el cual coloque los titulos y poder utilizar esa matriz en este procedimiento.... lo que no se es como pasar como parametro esa matriz

si alguien tuviera una idea... he revisado ejemplo de pasar matrices como parametros pero.... ninguno me funciono
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita