Hola.
Por si acaso no encontraras lo que buscas, aquí te dejo el código fuente de una clase que me curré en su día para implementarla en Delphi 3 (aún no existía la paleta Servers ni nada de su contenido).
Básicamente consiste en crearte un objeto OLE por medio de esta línea de código:
Código Delphi
[-]Obj_Excel := CreateOleObject('Excel.Application');
o intentar capturar alguna ejecución de Excel que ya esté activa en el PC con esto otro:
Código Delphi
[-]
Obj_Excel := GetActiveOleObject('Excel.Application');
Después, todo el trabajo es idéntico a crearte macros en Visual Basic de Excel.
Resulta luego curioso ver dentro del código Delphi líneas de código que son en realidad macros de VB.
A continuación el código. Lo preparé para mi apaño personal, y con las cositas justas que fui necesitando. Así que tiene muchas carencias, pero espero que te valga.
Código Delphi
[-]
unit uExportExcel;
interface
const
xl_CL_AmarLight = $00000024; xl_CL_AzulCielo = $00000021; xl_CL_Turq = $00000008; xl_CL_TurqLight = $00000022; xl_CL_Rojo = $00000003; xl_FI_Fich = '&N'; xl_FI_Hoja = '&A'; xl_FI_Pag = '&P'; xl_FI_TPag = ''; xl_FI_RC = #10 ;
xlAutomatic = $FFFFEFF7; xlWBATWorksheet = $FFFFEFB9;
xlManual = $FFFFEFD9; xlEdgeLeft = $00000007; xlEdgeTop = $00000008; xlEdgeBottom = $00000009; xlEdgeRight = $0000000A; xlInsideVertical = $0000000B; xlInsideHorizontal = $0000000C; xlContinuous = $00000001; xlNone = $FFFFEFD2; xlThin = $00000002; xlMedium = $00000003;
xlLastCell = $0000000B; xlCenter = $FFFFEFF4; xlCellValue = $00000001; xlExpression = $00000002; xlBetween = $00000001; xlNotBetween = $00000002; xlEqual = $00000003; xlNotEqual = $00000004; xlGreater = $00000005; xlLess = $00000006; xlGreaterEqual = $00000007; xlLessEqual = $00000008; xlNormal = $FFFFEFD1; xlMaximized = $FFFFEFD7; xlMinimized = $FFFFEFD4; xlToLeft = $FFFFEFC1; xlToRight = $FFFFEFBF; xlUp = $FFFFEFBE; xlDown = $FFFFEFE7;
type
TAplExcel = class
private
protected
Obj_Excel : Variant;
Obj_WBook : Variant;
Reutilizado : boolean;
Back_Calculation : integer;
function Get_Obj_Excel : variant;
function Get_Obj_WBook : variant;
procedure Set_Obj_WBook (objeto : variant);
procedure CrearAplicacionExcel (Reutilizar:boolean);
procedure DocumentoTerminado(WorkBook:variant);
procedure InitVarExcel;
procedure LiberarMemoria (QuitarTodos:boolean);
public
constructor Create; virtual; procedure Destroy; virtual;
property Excel:Variant read Get_Obj_Excel;
property WBook:Variant read Get_Obj_WBook;
function CrearNuevoWBook : variant;
procedure QuitarWBook(WorkBook:variant);
procedure QuitarWSheet (WorkSheet:variant);
procedure GuardarDocumento(WorkBook:variant; PathAndName:string; MostrarAlertas:boolean);
procedure CargarDocumento(PathAndName:string);
procedure NoGuardarDocumento(WorkBook:variant);
procedure MostrarAplExcel;
procedure OcultarAplExcel;
procedure ControlErrorExcel;
procedure ColorFondo (Selection:Variant; Color:integer);
procedure PonerGrid (Selection:Variant; GrosorMarco, GrosorVerti, GrosorHoriz:integer);
procedure PonerMarco (Selection:Variant; Grosor:integer);
function LetraColumna (x:integer):string;
procedure SetPrintArea (Hoja : variant; x1,y1, x2,y2 : integer);
procedure SetSaltoPagVert (Hoja : variant; NumSalto, Columna : integer);
end;
implementation
uses ComObj, SysUtils;
procedure TAplExcel.LiberarMemoria (QuitarTodos:boolean);
var x:integer;
begin
if VarIsNull(Obj_Excel) Then Exit;
try
for x:=Obj_Excel.Workbooks.Count downto 1 do Begin
if QuitarTodos or Obj_Excel.Workbooks[x].Saved
Then Begin
QuitarWBook(Obj_Excel.Workbooks[x]);
End;
End;
Except
End;
end;
function TAplExcel.CrearNuevoWBook : variant;
begin
try
Result := Obj_Excel.Workbooks.Add(xlWBATWorksheet);
except
Result := null;
raise;
end;
if Obj_Excel.Workbooks.Count = 1
Then Back_Calculation := Obj_Excel.Calculation;
If Obj_Excel.Calculation <> xlManual
Then Obj_Excel.Calculation := xlManual;
end;
procedure TAplExcel.QuitarWBook(WorkBook:variant);
begin
{$B-}
if (not VarIsNull(Obj_WBook))
and (Obj_WBook.FullName = WorkBook.FullName)
Then Obj_WBook := Null;
NoGuardarDocumento(WorkBook);
WorkBook.Close;
end;
procedure TAplExcel.QuitarWSheet (WorkSheet:variant);
var Alertas:boolean;
begin
alertas := WorkSheet.Application.DisplayAlerts;
WorkSheet.Application.DisplayAlerts := False;
WorkSheet.Delete;
WorkSheet.Application.DisplayAlerts := Alertas;
end;
procedure TAplExcel.DocumentoTerminado(WorkBook:variant);
begin
WorkBook.Worksheets[1].Select;
WorkBook.Worksheets[1].Activate;
WorkBook.Worksheets[1].Cells[1,1].Select;
end;
procedure TAplExcel.GuardarDocumento(WorkBook:variant; PathAndName:string; MostrarAlertas:boolean);
var Alertas:boolean;
begin
DocumentoTerminado(WorkBook);
WorkBook.Application.Calculation := Back_Calculation;
alertas := WorkBook.Application.DisplayAlerts;
WorkBook.Application.DisplayAlerts := MostrarAlertas;
WorkBook.SaveAs ( PathAndName );
WorkBook.Application.DisplayAlerts := alertas;
end;
procedure TAplExcel.CargarDocumento(PathAndName:string);
begin
Obj_Excel.Workbooks.Open(PathAndName);
if VarIsNull(Obj_WBook) Then Obj_WBook := Obj_Excel.Workbooks[Obj_Excel.Workbooks.Count];
end;
procedure TAplExcel.NoGuardarDocumento(WorkBook:variant);
begin
WorkBook.Saved := True;
end;
procedure TAplExcel.MostrarAplExcel;
var x:integer;
Begin
for x:=1 to Obj_Excel.Workbooks.Count do DocumentoTerminado(Obj_Excel.Workbooks[x]);
Obj_Excel.Calculation := Back_Calculation;
Obj_Excel.WindowState := xlMaximized;
Obj_Excel.Visible := True;
End;
procedure TAplExcel.OcultarAplExcel;
begin
Obj_Excel.Visible := False;
end;
procedure TAplExcel.CrearAplicacionExcel (Reutilizar:boolean);
var v_Excel : variant;
begin
InitVarExcel;
try
try
if Reutilizar Then try
Obj_Excel := GetActiveOleObject('Excel.Application'); Reutilizado := True;
except
Obj_Excel := null;
End;
if VarIsNull(Obj_Excel) Then Begin
Obj_Excel := CreateOleObject('Excel.Application'); Reutilizado := False;
End;
except
Obj_Excel := null;
raise;
end;
OcultarAplExcel;
Obj_WBook := CrearNuevoWBook;
except
ControlErrorExcel;
end;
end;
constructor TAplExcel.Create;
begin
CrearAplicacionExcel (False);
inherited Create;
end;
procedure TAplExcel.Destroy;
begin
if not Obj_Excel.Visible Then Begin
if not Reutilizado Then LiberarMemoria(False);
if not VarIsNull(Obj_Excel) Then Begin
if Obj_Excel.Workbooks.Count > 0 Then Begin
MostrarAplExcel;
End
Else Begin
Obj_Excel.Quit;
Obj_Excel := null;
End;
End;
End;
InitVarExcel;
inherited Free;
end;
procedure TAplExcel.InitVarExcel;
begin
Back_Calculation := xlAutomatic;
Reutilizado := False;
Obj_WBook := Null;
Obj_Excel := Null;
end;
function TAplExcel.Get_Obj_Excel : variant;
begin
Result := Obj_Excel;
end;
function TAplExcel.Get_Obj_WBook : variant;
begin
Result := Obj_WBook;
end;
procedure TAplExcel.Set_Obj_WBook (objeto : variant);
begin
Obj_WBook := objeto;
end;
procedure TAplExcel.ControlErrorExcel;
begin
LiberarMemoria(True);
raise Exception.Create('No ha podido generarse el documento Excel.'#13#13+
'Cierre la aplicación, e inténtelo de nuevo.'#13+
'Si el problema persiste, reinicie el equipo.');
end;
procedure TAplExcel.ColorFondo (Selection:Variant; Color:integer);
begin
Selection.Interior.ColorIndex := Color;
end;
procedure TAplExcel.PonerGrid (Selection:Variant;
GrosorMarco, GrosorVerti, GrosorHoriz:integer);
begin
PonerMarco (Selection, GrosorMarco);
if Selection.Columns.Count > 1 Then Begin
if GrosorVerti = xlNone Then
Selection.Borders[xlInsideVertical ].LineStyle := xlNone
Else Begin
Selection.Borders[xlInsideVertical ].LineStyle := xlContinuous;
Selection.Borders[xlInsideVertical ].Weight := GrosorVerti;
End;
End;
if Selection.Rows.Count > 1 Then Begin
if GrosorHoriz = xlNone Then
Selection.Borders[xlInsideHorizontal].LineStyle := xlNone
Else Begin
Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
Selection.Borders[xlInsideHorizontal].Weight := GrosorHoriz;
End;
End;
end;
procedure TAplExcel.PonerMarco (Selection:Variant; Grosor:integer);
begin
Selection.Borders[xlEdgeLeft ].LineStyle := xlContinuous;
Selection.Borders[xlEdgeLeft ].Weight := Grosor;
Selection.Borders[xlEdgeTop ].LineStyle := xlContinuous;
Selection.Borders[xlEdgeTop ].Weight := Grosor;
Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
Selection.Borders[xlEdgeBottom].Weight := Grosor;
Selection.Borders[xlEdgeRight ].LineStyle := xlContinuous;
Selection.Borders[xlEdgeRight ].Weight := Grosor;
end;
function TAplExcel.LetraColumna (x:integer):string;
const letras = 'ABCDEFGHIJKLMNOPKRSTUVWXYZ';
begin
Result := '';
While x > 0 do begin
Result := letras[1 + ((x - 1) Mod length(letras))] + Result;
x := (x - 1) div length(letras);
End;
end;
procedure TAplExcel.SetPrintArea (Hoja : variant; x1,y1, x2,y2 : integer);
begin
if (x1 <= 0) or (x2 <= 0)
Then raise Exception.Create('');
Hoja.PageSetup.PrintArea := '$' + LetraColumna(x1) + '$' + inttostr(y1) + ':' +
'$' + LetraColumna(x2) + '$' + inttostr(y2);
end;
procedure TAplExcel.SetSaltoPagVert (Hoja : variant; NumSalto, Columna : integer);
var range : variant;
begin
range := Hoja.Cells[1,Columna];
Hoja.VPageBreaks[NumSalto].Location := Range;
end;
end.