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

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

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'); 

一见钟情,但我认为这段代码将图片链接到工作表。 例如,我将创build的Excel发送到另一台计算机,这些图像不能被看到(我不记得确切的错误),当我search它时,我发现接收计算机需要具有确切path的图像。 作为解决scheme,build议使用“Sheet.Shapes.AddPicture”,但正如我之前所说的,我需要另一个解决scheme。

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

您可以使用此代码导入图片。 如果对此参数使用AddPicture函数,则不需要确切的path。 它复制照片并将其粘贴到Excel中。

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

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

 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; 

这破坏了剪贴板的以前的内容,这是不好的forms。 您可以使用以下例程保存/恢复剪贴板数据(基于: 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;