Извлечение изображений из листа Excel с Delphi - PullRequest
0 голосов
/ 30 марта 2019

У меня есть лист Excel, и в нескольких ячейках у меня есть изображение в верхнем левом углу ячейки.Эти изображения ведут себя так, как будто они «прикреплены» к данной ячейке, в том случае, если я изменяю границы ячейки, ее изображение перемещается вместе с ней.

Как можно извлечь эти изображения и сохранить их в файлы, используяDelphi?

1 Ответ

2 голосов
/ 30 марта 2019

Обновление # 4 ОП запоздало предоставил инструкции, чтобы подготовить пример картинки, которую он пытался извлечь:

1) Перейдите на nbbclubsites.nl/club/8000/uitslagen 2) Нажмите на «TKDmm, ronde 1 [1]» 3) Нажмите на -14-13/3 4) Нажмите на «BC Den Dungen-1» 5) Выберите de 4 и символ сердца 6) Скопируйте Ctrl + C 7) Откройте Excel и выберите ячейку (1,1) 8) Past Ctrl + V В ячейке вы видите 4 в ячейке и символ сердца заблокирован в левом верхнем углу

Я сделал это, и символ сердец без проблем вставился в мой лист. После этого метод SavePicture в элементе 1 Insert Picture правильно извлекает и сохраняет символ сердца на диск в виде файла .Jpg. Doh!

Обновление № 3 Проблема с ответом на этот вопрос заключалась в том, что информация о том, как были вставлены картинки в таблицу ОП. До сих пор, были определены три различных метода, а именно:

  • Использование вставки - изображение из вкладки 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 показаны ниже. 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;
...