Извлечение изображений из таблицы Excel с помощью Delphi

#excel #image #delphi #extract

#excel #изображение #delphi #извлечение

Вопрос:

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

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

Комментарии:

1. Привет, Франс, добро пожаловать. Вы с большей вероятностью получите ценные для вас (и других) ответы, когда зададите более конкретный вопрос. Есть много примеров по работе с Excel из Delphi online ( google.com/search ? q = читать excel delphiamp;oq= читать excel delphi ). Попробуйте это и не стесняйтесь возвращаться, чтобы задать вопрос, когда вы где-то застряли.

2. Привет, Ваутер, я знаю, что есть много примеров, но всегда записываю текст и изображение в Excel и читаю текст из Excel, но я не могу найти пример delphi, который загружает изображение, прикрепленное к ячейкам в Excel.

3. Я понимаю, что вы пытаетесь сделать, но у меня в заднем кармане нет готового к использованию ответа для вас. На этом сайте, вероятно, есть сотни людей, которые могли бы помочь вам с этим, но если вы зададите свой вопрос неправильно, шансы на то, что кто-нибудь приложит усилия, чтобы помочь вам, невелики. Я просто пытаюсь помочь вам освоиться на этом сайте, потому что вижу, что вы здесь новичок. В противном случае я бы тоже просто пропустил этот вопрос. Никто не будет водить вас за руку от начала до конца, поэтому используйте короткое внимание, которое вы получите, для материала, в котором вы действительно не можете разобраться самостоятельно.

4. Последний совет: если у вас установлен Excel, вы можете создать его экземпляр как com-объект. Если я правильно помню, рабочий лист содержит pictures свойство, которое вы могли бы повторить. Может быть, есть на что посмотреть.

5. Насколько я помню, изображения не обязательно находятся внутри ячейки, они расположены на общем листе.

Ответ №1:

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

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

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

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

  • Использование Insert — Picture на вкладке Insert в Excel
  • Использование Insert — Object на вкладке Вставка в Excel
  • С помощью вставки комментария из контекстного меню выбранной ячейки

Ниже я показываю примеры кода для каждого из этих методов.

1. Вставка — Изображение

 procedure TForm1.InsertPicture;
begin
  Worksheet.Pictures.Insert('C:UsersmaPicturesphoto-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:UsersmaPictureswall.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:UsersmaPicturesphoto-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 все являются олевариантными элементами формы.

 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;
  

Комментарии:

1. Во всех приведенных ниже примерах используется обратный способ. Сохранение изображения в ячейку Excel содержит множество примеров. В основном примеры на vba. Сообщение выше: «Изображения не привязаны к определенным ячейкам листа» не соответствует действительности для листа Excel, который у меня есть. Изображение остается прикрепленным к левому верхнему углу ячейки. Если я скопирую ячейку в другую ячейку, изображение перейдет вместе с ней. Мне нужен исходный код delphi, который извлекает это изображение из ячейки. Не сохранять изображение в ячейку. Также с помощью vba в моем nolidge нет примера, который извлекал бы изображение. Я мог бы отправить пример Excel, но я вижу, что не могу прикрепить файл.

2. Хм. Вы сказали «есть изображение в верхнем левом углу ячейки», а не «прикреплено к», поэтому вам нужно переписать свой вопрос, иначе кто-то другой может потратить свое время, отвечая на него, так же как и я. Откуда вы знаете, что изображение «прикреплено» к определенной ячейке? Какое поведение подтверждает, что это такое?

3. Я думаю, что изображение прикреплено к ячейке, потому что, если я изменяю размер ячейки или копирую ячейку, изображение остается видимым в левом верхнем углу все время. С attach я имею в виду, что я не могу добавить вложение, чтобы показать, что я имею в виду

4. Я не прикреплял изображение, потому что, если бы я это сделал, я бы извлек изображение. Я получаю листы Excel с изображениями, прикрепленными во многих ячейках

5. Я провел некоторое исследование и выяснил, что правильным выражением должно быть: «Изображение ЗАБЛОКИРОВАНО в ячейке Excel», поэтому я хочу сохранить эти заблокированные изображения с помощью кода Delphi.

Ответ №2:

Я знаю, что это очень старый вопрос, но, надеюсь, это полезно для тех, кто приходит сюда с тем же вопросом: как я могу получить ячейку, к которой прикреплено изображение, и как я могу сохранить это изображение. После долгих исследований я обнаружил, что изображения представляют собой фигуры на листе и что у изображения есть «topleftcell.address», который является ячейкой, с которой связано изображение.Отображается как «$ B $ 4»

Код для сохранения этого изображения содержится в приведенных ответах.

   for i := 1 to sheet.Shapes.Count do
  begin
    picture := Sheet.Pictures(Pictures(i, lcid);
    test := picture.topleftcell.address;
    picture.select;
    picture.Copy;
  end;