bueno he estado todo el día liado con esto, y he visto cosas a trozos, así que voy a poner un resumen en código de como se hace.
Código Delphi
[-]
procedure TForm1.CrearDocumentoExcel;
var
Stream : TMemoryStream;
rutaImagen : String;
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
BmpImg: TBitmap;
picture: OleVariant;
jpeg: TJpegImage;
Rectangle: TRect;
begin
rutaImagen := 'C:\miImagen.jpg';
ExcelApplication1.Connect; ExcelApplication1.Workbooks.Add(xlWBatWorkSheet,0);
WorkBk := ExcelApplication1.WorkBooks.Item[1];
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
WorkSheet.Name := 'Libro1';
WorkSheet.Range['D2','D2'].Value := 'Titulo Principal';
WorkSheet.Range['D2','D2'].Font.Bold := true;
WorkSheet.Range['D2','D2'].Font.Size := 14;
WorkSheet.Range['D2','D2'].HorizontalAlignment := xlCenter;
fila := 4;
for i:=0 to 5 do begin
ExcelApplication1.Range[char(65+i)+IntToStr(fila),char(65+i)+IntToStr(fila)].Font.Bold := true;
ExcelApplication1.Range[char(65+i)+IntToStr(fila),char(65+i)+IntToStr(fila)].Interior.ColorIndex := 44;
ExcelApplication1.Range[char(65+i)+IntToStr(fila),char(65+i)+IntToStr(fila)].HorizontalAlignment := xlCenter;
ExcelApplication1.Range[char(65+i)+IntToStr(fila),char(65+i)+IntToStr(fila)].VerticalAlignment := xlCenter;
ExcelApplication1.Range[char(65+i)+IntToStr(fila),char(65+i)+IntToStr(fila)].Borders.LineStyle := xlContinuous;
ExcelApplication1.Range[char(65+i)+IntToStr(fila),char(65+i)+IntToStr(fila)].ColumnWidth := anchodelacolumna; ExcelApplication1.Range[char(65+i)+IntToStr(fila),char(65+i)+IntToStr(fila)].RowHeight := 25;
ExcelApplication1.Range[char(65+i)+IntToStr(fila),char(65+i)+IntToStr(fila)].WrapText := true;
end;
WorkSheet.Range['A4','A4'].Value:= 'TituloColumn1';
WorkSheet.Range['B4','B4'].Value:= 'TituloColumn2';
WorkSheet.Range['C4','C4'].Value:= 'TituloColumn3';
WorkSheet.Range['D4','D4'].Value:= 'TituloColumn4';
WorkSheet.Range['E4','E4'].Value:= 'TituloColumn5';
WorkSheet.Range['F4','F4'].Value:= 'TitulocolumnImagen';
MiClientDataSet.First; while not MiClientDataSet.Eof do
begin
if MiClientDataSet.FieldByName('EXISTE_IMAGEN').AsInteger = 1 then
altura := 60
else
altura := 12;
inc(fila);
WorkSheet.Range['A'+IntToStr(fila),'A'+IntToStr(fila)].RowHeight := altura;
WorkSheet.Range['A'+IntToStr(fila),'A'+IntToStr(fila)].NumberFormat := '@'; WorkSheet.Range['A'+IntToStr(fila),'A'+IntToStr(fila)].Value:= MiClientDataSet.FieldByName('CAMPO1').AsString;
WorkSheet.Range['B'+IntToStr(fila),'B'+IntToStr(fila)].Value:= MiClientDataSet.FieldByName('CAMPO2').AsString;
WorkSheet.Range['C'+IntToStr(fila),'E'+IntToStr(fila)].HorizontalAlignment := xlRight;
WorkSheet.Range['C'+IntToStr(fila),'E'+IntToStr(fila)].NumberFormat := '#.##0,00';
WorkSheet.Range['C'+IntToStr(fila),'C'+IntToStr(fila)].Value:= MiClientDataSet.FieldByName('CAMPO3').AsFloat;
WorkSheet.Range['D'+IntToStr(fila),'D'+IntToStr(fila)].Value:= MiClientDataSet.FieldByName('CAMPO4').AsString;
WorkSheet.Range['E'+IntToStr(fila),'E'+IntToStr(fila)].Value:= MiClientDataSet.FieldByName('CAMPO5').AsFloat;
if MiClientDataSet.FieldByName('EXISTE_IMAGEN').AsInteger = 1 then
begin
try
jpeg := TJpegImage.Create;
BmpImg := TBitmap.Create;
stream := TMemoryStream.Create;
stream := TMemoryStream.Create;
TBlobField(MiClientDataSet.FieldByName('IMAGEN')).SaveToStream(stream); stream.Position := 0;
jpeg.LoadFromStream(stream);
Rectangle := Rect(0, 0, 50, 50); with BmpImg do
begin
Width := 50;
Height := 50;
Canvas.StretchDraw(Rectangle, jpeg);
end;
finally
jpeg.Assign(BmpImg);
jpeg.SaveTofilae(rutaImagen); jpeg.Free;
end;
picture := ExcelApplication1.ActiveSheet;
picture := oSheet.shapes.addpicture(rutaImagen, false, True, WorkSheet.Range['F'+IntToStr(fila),'F'+IntToStr(fila)].Left+15, WorkSheet.Range['F'+IntToStr(fila),'F'+IntToStr(fila)].Top+5, 50, 50);
picture.Placement:= xlMoveAndSize; end;
MiClientDataSet.Next;
end;
if filaeExists(rutaImagen) then Deletefilae(rutaImagen);
ExcelApplication1.Visible[0]:=true;
ExcelApplication1.Disconnect;
end;
Atención, no sale bien, si hay algún documento Excel abierto en el ordenador, en tal caso habría que cerrar el documento excel e intentarlo de nuevo.
Ya tengo una duda, alguien sabe como detectar si Excel está o no abierto, una función api o de delphi que lo averigue. Yo pongo el mensaje: "Cierren los documentos Excel antes de continuar", pero si tuviera una función que me dijera, tiene un documento excel abierto, cierrelo por favor, seria genial.