使用Delphi从Excel工作表中提取图像

时间:2019-03-30 12:54:04

标签: excel image delphi extract

我有一张Excel工作表,在几个单元格中,单元格的左上角都有一张图片。这些图片的行为就像将它们“附加”到给定的单元格一样,因为如果更改单元格的边界,则其图片将随之移动。

如何提取这些图片并使用Delphi将其保存到文件中?

1 个答案:

答案 0 :(得分:2)

更新#4 :OP后来提供了说明,以准备他一直尝试提取的图片的示例:

  

1)转到nbbclubsites.nl/club/8000/uitslagen 2)单击“ TKDmm,朗德1 [1]” 3)单击-14- 13/3 4)单击“ BC Den Dungen-1” 5)选择de 4和心形符号6)复制Ctrl + C 7)打开Excel并选择单元格(1,1)8)过去Ctrl + V在单元格中,您会在该单元格中看到4,并且心形符号锁定在左上角< / p>

我这样做了,并将hearts符号粘贴到我的工作表中,没有任何问题。完成此操作后,项目SavePicture中的1 Insert Picture方法可以正确提取Hearts符号并将其作为.Jpg文件保存到磁盘。 h!

更新#3 回答此问题的一个问题是,没有 有关如何插入OP电子表格中图片的信息。至今, 确定了三种不同的方法,即:

  • 使用插入-Excel的“插入”选项卡中的图片
  • 使用插入-Excel的“插入”选项卡中的对象
  • 使用所选单元格上下文菜单中的插入注释

下面,我将展示每种方法的代码示例。

1。插入-图片

procedure TForm1.InsertPicture;
begin
  Worksheet.Pictures.Insert('C:\Users\ma\Pictures\photo-2.JPG');
end;

procedure TForm1.SavePicture;
var
  Picture : OleVariant;
begin
  Picture := Worksheet.Pictures[1];
  Picture.Select;
  Picture.Copy;
  SaveClipboard;
end;

2。插入-对象

procedure TForm1.InsertAsObject;
begin
  WorkSheet.OLEObjects.Add(Filename:='C:\Users\ma\Pictures\wall.bmp', Link :=False,
    DisplayAsIcon:=False).Select;
end;

procedure TForm1.SaveObjectBmp;
var
  Shape : OleVariant;
begin
  Caption := IntToStr(WorkSheet.OleObjects.Count);
  WorkSheet.OLEObjects[1].Select;
  WorkSheet.OLEObjects[1].CopyPicture;
  Shape := WorkSheet.OLEObjects[1].ShapeRange.Item(1);
  Shape.CopyPicture(xlScreen, xlBitMap);
  SaveClipboard;
end;

3。插入为单元格注释

procedure TForm1.InsertCommentPicture;
var
  Cell,
  Comment : OleVariant;
begin
  Cell := WorkSheet.Cells.Range['b2', 'b2'];
  Comment := Cell.AddComment;
  Comment.Shape.Fill.UserPicture('C:\Users\ma\Pictures\photo-2.JPG');
  Comment.Visible := True;
end;

procedure TForm1.SaveCommentPicture;
var
  Cell,
  Comment,
  Shape,
  Picture : OleVariant;
begin
  Cell := WorkSheet.Cells.Range['B2', 'B2'];
  Comment := Cell.Comment;
  Comment.Visible := True;

  Shape := Comment.Shape;
  Shape.CopyPicture(xlScreen, xlBitMap);
  SaveClipBoard;
end;

SaveClipBoard方法和FormCreate方法如下所示。 ExcelWorkBookWorkSheet都是表单的OleVariant成员。

procedure TForm1.SaveClipboard;
// With thanks to the author of http://delphi.cjcsoft.net/viewthread.php?tid=46877
var
  myBitmap: TBitmap;
  myJpegImg: TJpegImage;
  SaveFileName: string;
begin
  Caption := IntToStr(Clipboard.FormatCount)  + ':' + IntToStr(Clipboard.Formats[0]);
  SaveFileName := ExtractFilePath(FileName) + 'Saved.Jpg';
  myBitmap := TBitmap.Create;
  myJpegImg := TJpegImage.Create;
  try
    if Clipboard.HasFormat(cf_Bitmap) then
      begin
        myBitmap.Assign(clipboard);
        myJpegImg.Assign(myBitmap);
        myJpegImg.SaveToFile(SaveFileName);
      end
    else
      ShowMessage('No graphic on the clipboard');
  finally
    myBitmap.FreeImage;
    myJpegImg.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Excel := CreateOleObject('Excel.Application');
  Excel.Visible := True;
  FileName := ExtractFilePath(Application.ExeName) + 'PictureBook.Xlsx';
  WorkBook := Excel.Workbooks.Open(FileName);
  WorkSheet := WorkBook.ActiveSheet;
end;