#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;