在Delphi中将图像插入Excel工作表

时间:2015-03-30 08:26:12

标签: excel image delphi

我在这里有一个问题,我有一个应用程序,我需要添加图像。我试过了:

Sheet.Shapes.AddPicture(G_V.Prog_Dir+'pic.BMP',false,true, 190, 10+(15*rowcount), 100, 100 );

它工作正常,但我不想提供参数,我想将图片插入指定(和参数)单元格,因为我需要将图片添加到页面的最后一列;这个excel需要打印我必须提到。所以我试过了:

Sheet.Range['E'+inttostr(rowcount),'E'+inttostr(rowcount)].Select;
Sheet.Pictures.Insert(G_V.Prog_Dir+'pic.BMP');

乍一看看起来不错,不过我觉得这段代码会将图片链接到工作表上。例如,我将创建的Excel发送到另一台计算机,这些图像无法看到(我不记得确切的错误),当我搜索它时,我发现接收计算机需要在确切的路径上有图像。作为解决方案,推荐“Sheet.Shapes.AddPicture” 正如我之前所说,我需要另一种解决方案。

我没有看到有人遇到这种问题,我希望有人帮助我。

2 个答案:

答案 0 :(得分:1)

您可以使用此代码导入图片。如果对此参数使用AddPicture函数,则不需要精确路径。它复制照片并粘贴到excel。

   Set p = ActiveSheet.Shapes.AddPicture(FileName:=PictureFileName,_
   linktofile:=msoFalse, savewithdocument:=msoCTrue, _ 
   left:=TargetCell.Left, Top:=TargetCell.Top, Width:=-1,_
   Height:=TargetCell.Height)

答案 1 :(得分:0)

简单的解决方案是将图片添加到剪贴板,然后将其粘贴到工作表中。

implementation

uses
  VCL.Clipbrd, VCL.Graphics, Excel2000;

procedure TForm1.Test;
var
  Bitmap: TBitmap;
  Excel: TExcelApplication;
  Worksheet: TExcelWorksheet;
begin
  Bitmap:= TBitmap.Create;
  try
    Bitmap.LoadFromFile('c:\test.bmp');
    Clipboard.Assign(Bitmap);
    Excel:= TExcelApplication.Create(self);
    Worksheet:= Excel.Worksheets[0];
    Worksheet.Range['a1','a1'].Select;
    Worksheet.Paste;
  finally
    Bitmap.Free;
  end;
end;

这会破坏剪贴板的先前内容,这是不好的形式。 您可以使用以下例程保存/恢复剪贴板数据(基于:https://www.devexpress.com/Support/Center/Question/Details/Q93874

procedure TForm1.RestoreClipboardData(SourceDataStream: TMemoryStream);
var
  AData: THandle;
  ADataPtr: Pointer;
begin
  if SourceDataStream.Size = 0 then Exit;
  Clipboard.Open;
  try
    AData := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, SourceDataStream.Size);
    try
      ADataPtr := GlobalLock(AData);
      try
        SourceDataStream.Position := 0;
        SourceDataStream.ReadBuffer(ADataPtr^, SourceDataStream.Size);
        SetClipboardData(CF_BITMAP, AData);
      finally
        GlobalUnlock(AData);
      end;
    except
      GlobalFree(AData);
      raise;
    end;
  finally
    Clipboard.Close;
  end;
end;

procedure TForm1.SaveClipboardData(DestDataStream: TMemoryStream);
var
  AData: THandle;
  ADataPtr: Pointer;
begin
  if DestDataStream = nil then raise Exception.Create('Dest is nil');
  Clipboard.Open;
  try
    AData := GetClipboardData(CF_BITMAP);
    if AData = 0 then Exit;
    ADataPtr := GlobalLock(AData);
    try
      DestDataStream.Size := GlobalSize(AData);
      DestDataStream.Position := 0;
      DestDataStream.Write(ADataPtr^, DestDataStream.Size);
    finally
      GlobalUnlock(AData);
    end;
  finally
    Clipboard.Close;
  end;
end;