我有一张Excel工作表,在几个单元格中,单元格的左上角都有一张图片。这些图片的行为就像将它们“附加”到给定的单元格一样,因为如果更改单元格的边界,则其图片将随之移动。
如何提取这些图片并使用Delphi将其保存到文件中?
答案 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电子表格中图片的信息。至今, 确定了三种不同的方法,即:
下面,我将展示每种方法的代码示例。
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方法如下所示。 Excel
,WorkBook
和WorkSheet
都是表单的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;