Delphi excel вставить картинку

drvolodko

222 / 66 / 32

Регистрация: 23.05.2014

Сообщений: 698

1

23.05.2014, 09:16. Показов 11358. Ответов 8

Метки addpicture, excel, inchestopoints, pixelsperinch (Все метки)


Студворк — интернет-сервис помощи студентам

Доброго времени суток. Столкнулся с проблемой вставки картинки в Excel из буфера обмена.
Код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//загружаем картинку из БД. Secur - TADOQuery
Blob:=TADOBlobStream.Create(TBlobField(DMF.Secur.FieldByName('podp')),bmRead);
bmp.LoadFromStream(Blob);
//дальше коннект к Екселю через TExcelApplication
//впихиваю картинку в буфер обмена
ClipBoard.Assign(bmp);
//Вариант 1
xl.Range['F47',EmptyParam].PasteSpecial(xlPasteAll,xlPasteSpecialOperationNone,  True, False); //ошибку выдает
//вариант 2
xSheet.Range['F47',EmptyParam].PasteSpecial(xlPasteAll,xlPasteSpecialOperationNone, True, False); //та же ошибка
//вариант 3
xSheet.Paste('F47','F47', LCID);
//вариант 4
xl.Range['F47',EmptyParam].Insert(xlPasteAll,xlPasteSpecialOperationNone) ;
//ну и вариант 5
xl.Range['F47',EmptyParam] .Select;
xl.ActiveCell.PasteSpecial(xlPasteAll,xlPasteSpecialOperationNone, True, False);

Все варианты выдают ошибку. Как сделать уже не знаю даже(((( Через Ctrl+v вставляется, значит картинка в буфер прилетает, а вот программно не хочет.
Или может посоветуете, как подгрузить картинку с диска? Сохранить ее из БД на диск, а потом воткнуть как-то в Excel?
Да и, кстати: xSheet :_Worksheet;



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

23.05.2014, 09:16

Ответы с готовыми решениями:

Вывод картинки из бд
Здрасьте всем. Возникла проблема с выводом картинки.
Хочу, чтобы при переключении строки в DBGrid…

Вывод картинки на экран
Нужно, чтобы в Edit вводили путь папки в которой находится изображение, нажимали Enter и в Image…

Вывод случайной картинки
Есть картинка,после каждого обновления формы — меняется картинка,сохраненная по адресу D:/image.gif…

Вывод картинки PNG на форму
Есть сайт и там картинки, но почему то при использовании данной функции, у меня ошибка… где я мог…

8

52 / 52 / 30

Регистрация: 24.02.2014

Сообщений: 229

23.05.2014, 14:49

2

совет1: откройте Excel и запишите макрос в котором вы вставляете картинку и посмотрите код
совет2: проверьте входные параметры процедуры PasteSpecial — типы данных должны совпадать
Вы посылаете туда True, False — это тип boolean — а что принимает Excel?



0



Mawrat

13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

23.05.2014, 16:17

3

Лучший ответ Сообщение было отмечено drvolodko как решение

Решение

Метод Range.PastSpecial() предназначен только для вставки диапазонов. Чтобы вставлять данные разных типов, в том числе, изображения — надо использовать одноимённый метод объекта Worksheet: Worksheet.PastSpecial():

Delphi
1
2
xSheet.Range.Cells[1, 1].Select; //Выделяем ячейку. На её месте будет вставлена картинка.
xSheet.PastSpecial('CF_BITMAP'); //Вставка картинки из буфера обмена.

Цитата
Сообщение от drvolodko
Посмотреть сообщение

Или может посоветуете, как подгрузить картинку с диска?

Загрузка картинки с диска:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  FnBook = 'FilesКнига-01.xls';
  FnPicture = 'FilesPicture-01.bmp';
var
  exApp, exBook, exSheet, exRng, exShape : OleVariant;
  Bm : TBitmap;
  Path : String;
  W, H : Extended;
begin
  //Путь к той папке, в которой располжен исполняемый файл нашей программы.
  //В конце пути записан слеш "".
  Path := ExtractFilePath(ParamStr(0));
 
  //Попытка подключиться к корневому объекту MS Excel.
  try
    exApp := CreateOleObject('Excel.Application');
  except
    MessageBox(Handle, 'Не удалось запустить MS Excel. Действие отменено.',
      'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;
  //Делаем видимым окно MS Excel. На время отладки или на постоянной основе.
  exApp.Visible := True;
  //Открываем файл рабочей книги.
  exBook := exApp.WorkBooks.Open(FileName:=Path + FnBook);
  //Получаем ссылку на первый лист рабочей книги.
  exSheet := exBook.Worksheets[1];
  //Ссылка на ячейку с адресом "C4".
  exRng := exSheet.Cells[4, 3]; //Или так: exRng := exSheet.Cells['C4'];
 
  //Размещаем картинку на листе MS Excel таким образом, чтобы её левый
  //верхний угол совпал с левым верхним углом ячейки "C4".
  //При этом, для того, чтобы сохранить исходный размер изображения, следует
  //получить сведения о размерах изображения и вычислить ширину и высоту
  //в типографических пунктах. Именно в типографических пунктах указываются
  //размеры при вызове метода Shapes.AddPicture().
  Bm := TBitmap.Create;
  try
    //Загружаем изображение.
    Bm.LoadFromFile(Path + FnPicture);
    //Вычисляем размеры изображения в типографических пунктах.
    //Ширина.
    W := exApp.InchesToPoints(Bm.Width / exApp.DefaultWebOptions.PixelsPerInch);
    //Высота.
    H := exApp.InchesToPoints(Bm.Height / exApp.DefaultWebOptions.PixelsPerInch);
  finally
    FreeAndNil(Bm);
  end;
  //Размещаем картинку на листе MS Excel.
  exShape := exSheet.Shapes.AddPicture(Filename:=Path + FnPicture,
    LinkToFile:=False, SaveWithDocument:=True,
    Left:=exRng.Left, Top:=exRng.Top, Width:=W, Height:=H);
end;



0



222 / 66 / 32

Регистрация: 23.05.2014

Сообщений: 698

23.05.2014, 17:15

 [ТС]

4

уже разобрался, но все равно спасибо за помощь.
Сделал таким образом и все получилось.

Код

xl.Range['K47',EmptyParam] .Select;
xSheet.PasteSpecial('Рисунок',False,false, EmptyParam,EmptyParam,EmptyParam, True, LCID);



0



0 / 0 / 0

Регистрация: 12.09.2020

Сообщений: 115

27.03.2022, 10:59

5

drvolodko, здравствуйте, а что за LCID???



0



3392 / 2043 / 654

Регистрация: 29.05.2013

Сообщений: 8,778

27.03.2022, 11:57

6

Насколько я помню картинка в Экселе вставляется в Лист, а не в ячейку листа, т.е. при любом изменение свойств ячеек вся привязка текста в ячейке с картинкой развалится. Лучше Html документ использовать.



0



Urcaserem

0 / 0 / 0

Регистрация: 12.09.2020

Сообщений: 115

27.03.2022, 13:16

7

Пытливый, да вот у меня просто что-то никак не выходит. ругается на что-то

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  SysUtils,
  Office_TLB in 'Office_TLB.pas',
  VBIDE_TLB in 'VBIDE_TLB.pas',
  Excel_TLB in 'Excel_TLB.pas',
  variants;
 
  var
  ea:_Application;
  WB : _Workbook;
  Sheet: _Worksheet;
 
  er:ExcelRange;
 
begin
  try
      ea:=CoExcelApplication.Create;
      WB:= ea.Workbooks.Add(EmptyParam,0);
 
 
    ea.ActiveSheet.Shapes.AddPicture('C:test.png',EmptyParam,True,20,300,300,300,EmptyParam);
 
ea.Workbooks[1].SaveCopyAs('C:file.xls',0);
  finally
  ea.Quit;
  if assigned(ea) then  ea:=nil;
 
  end;
 
  Writeln('ok');
  Readln;
end.

это последний вариант, но что-то не нравится



0



Пытливый

3392 / 2043 / 654

Регистрация: 29.05.2013

Сообщений: 8,778

27.03.2022, 14:33

8

Я даже проверить этот код не могу, нет этих левых TLB-компонент. А вот такой код, запустить можно без сторонних компонент и что интересно, он работает:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uses ComObj;
...
var
  ExcelApp,WorkBook: OleVariant;
begin
  try
    ExcelApp := GetActiveOleObject('Excel.Application');
  except
    try
      ExcelApp := CreateOleObject('Excel.Application');
    except on E: Exception
    do begin
       ShowMessage('Не удалось запустить Excel!'#13#10 + E.Message);
       Exit;
       end;
    end;
  end;
  WorkBook := ExcelApp.WorkBooks.Add;
  WorkBook.ActiveSheet.Pictures.Insert('C:test.png');
  ExcelApp.Visible := True;
end;



1



0 / 0 / 0

Регистрация: 12.09.2020

Сообщений: 115

27.03.2022, 17:08

9

Пытливый, спасибо большое
TLB-компонент просто импортировала
просто дело в том, что мне CoClass вот нужно использовать. а это вроде как так делается…. вроде как…



0



I have a question here, I have an application and I need to add images to it. I have tried:

Sheet.Shapes.AddPicture(G_V.Prog_Dir+'pic.BMP',false,true, 190, 10+(15*rowcount), 100, 100 );

it works just fine, but I don’t want to give parameters, I want to insert pictures to specified (and parametric) cells because I need to add picture to the last column of the page; this excel needs to be printed I must mention that. So I tried:

Sheet.Range['E'+inttostr(rowcount),'E'+inttostr(rowcount)].Select;
Sheet.Pictures.Insert(G_V.Prog_Dir+'pic.BMP');

It looks OK at first sight, however I think this code links images to the sheet. For example, I send the created Excel to another computer and these images cannot be seen (I don’t recall the exact error) and when I searched it, I found out that receiving computer needs to have images at the exact path. As a solution to this, «Sheet.Shapes.AddPicture» recommended but
as I stated before, I need another solution here.

I didn’t see anybody experiencing this kind of problem, I hope someone helps me out.

Delphi Как Вставить Картинку в Excel

В данном обзоре рассмотрены основные конструкции, позволяющие получить доступ к книге Excel из DELPHI.

Организация доступа к книге EXCEL

Для взаимодействия с MS excel в программе необходимо использовать модуль ComObj
uses ComObj;
и объявить переменную для доступа к MS excel следующего типа:
var Excel: Variant;

Открытие существующей книги (где path — путь к фалу с расширением xls.):
Excel.Workbooks.Open[path];

Открытие существующей книги только для чтения:
Excel.Workbooks.Open[path, 0, True];

Блокировка запросов (подтвеждений, уведомлений) Excel, например, запретить запрос на сохранение файла:
Excel.DisplayAlerts:=False;

Отображаем Excel на экране:
Excel.Visible := True;
или скрываем:
Excel.Visible := False;

Печать содержимого активного листа excel:
Excel.ActiveSheet.PrintOut;

Чтение/запись данных в EXCEL

Доступ к ячейке в текущей книге Excel можно осуществить следующим образом:
Excel.Range[‘B2′]:=’Привет!’;- для записи значения в ячейку или
s:=Excel.Range[‘B2’]; — для чтения,
где B2 — адрес ячейки.

Или используя стиль ссылок R1C1:
Excel.Range[excel.Cells[2, 2]]:=’Привет!’;, где [2, 2] — координата ячейки.

Вообще, ячейке Excel можно присваивать любое значение (символьное, целое, дробное, дата) при этом Excel установит форматирование в ячейке применяемое по умолчанию.

Формат ячеек в EXCEL

Выделить (выбрать) группу ячеек для последующей работы можно так:
Excel.Range[Excel.Cells[1, 1], Excel.Cells[5, 3]].Select;
или
Excel.Range[‘A1:C5’].Select;
при этом будет выделена область находящаяся между ячейкой A1 и C5.

Использование паролей в EXCEL

Вспомогательные операции в EXCEL

Удаление строк со сдвигом вверх:
Excel.Rows[‘5:15’].Select;
Excel.Selection.Delete;
при выполнении данных действий будут удалены строки с 5 по 15.

В данном обзоре рассмотрены основные конструкции, позволяющие получить доступ к книге Excel из DELPHI.

Организация доступа к книге EXCEL

Для взаимодействия с MS excel в программе необходимо использовать модуль ComObj
uses ComObj;
и объявить переменную для доступа к MS excel следующего типа:
var Excel: Variant;

Открытие существующей книги (где path — путь к фалу с расширением xls.):
Excel.Workbooks.Open[path];

Открытие существующей книги только для чтения:
Excel.Workbooks.Open[path, 0, True];

Блокировка запросов (подтвеждений, уведомлений) Excel, например, запретить запрос на сохранение файла:
Excel.DisplayAlerts:=False;

Отображаем Excel на экране:
Excel.Visible := True;
или скрываем:
Excel.Visible := False;

Печать содержимого активного листа excel:
Excel.ActiveSheet.PrintOut;

Чтение/запись данных в EXCEL

Доступ к ячейке в текущей книге Excel можно осуществить следующим образом:
Excel.Range[‘B2′]:=’Привет!’;- для записи значения в ячейку или
s:=Excel.Range[‘B2’]; — для чтения,
где B2 — адрес ячейки.

Или используя стиль ссылок R1C1:
Excel.Range[excel.Cells[2, 2]]:=’Привет!’;, где [2, 2] — координата ячейки.

Вообще, ячейке Excel можно присваивать любое значение (символьное, целое, дробное, дата) при этом Excel установит форматирование в ячейке применяемое по умолчанию.

Формат ячеек в EXCEL

Выделить (выбрать) группу ячеек для последующей работы можно так:
Excel.Range[Excel.Cells[1, 1], Excel.Cells[5, 3]].Select;
или
Excel.Range[‘A1:C5’].Select;
при этом будет выделена область находящаяся между ячейкой A1 и C5.

Использование паролей в EXCEL

Вспомогательные операции в EXCEL

Удаление строк со сдвигом вверх:
Excel.Rows[‘5:15’].Select;
Excel.Selection.Delete;
при выполнении данных действий будут удалены строки с 5 по 15.

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Как загрузить картинку в delphi

Как это победить – на настоящий момент – не знаю. Одинаковая картина – если отображать на DBImage и на Image. Причём, если PNG отображать на форме простой загрузкой файла (не через сохранение в БД и последующего чтения), то PNG отображается при этом нормально…

Знайка, самый умный эксперт в Цветочном городе

Мнение эксперта

Знайка, самый умный эксперт в Цветочном городе

Если у вас есть вопросы, задавайте их мне!

Задать вопрос эксперту

При необходимости вы можете использовать маркеры изменения размера по краям изображения, чтобы обрезать его до нужного размера. Если же вы хотите что-то уточнить, я с радостью помогу!

​Привязать изображения к ячейке​ Переходим во вкладку​ производить никаких изменений​Выделяем весь лист, нажатием​Одним из способов прикрепить​ Всё зависит от​.​ картинку было хорошо​ углу) появляется значок​Кликаем в том месте,​ в любую сторону​»​ на другом листе​ — изменить текст,​ «Рецензирование» в разделе​ А вот два​.​
delphi image

Image в Delphi

Ну, вот я описал все способы как в Excel вставить картинку, я очень надеюсь, что мой материал вам помог. Буду признателен вашим лайкам и репосту в социальные сети, если статья вам понравилась, а ваши замечания жду в комментариях!

 
Veles
 
(2003-07-10 14:54)
[0]

Как вставить изображение в Excel в ходе выполнения программы ?


 
Palladin
 
(2003-07-10 15:07)
[1]

ActiveSheet.Pictures.Insert(«E:My Picturescat2.jpg»)


 
Veles
 
(2003-07-10 15:19)
[2]

Надо что то типа:

XL.WorkSheets[1].Range[«B4»].Value := Pictures.Insert(Table1FOTO.Value);

Т.Е. вставить из программы на Delphi в лист Excel


 
Palladin
 
(2003-07-10 15:20)
[3]

Pictures.SaveToFile(FileName);

ActiveSheet.Pictures.Insert(FileName);

DeleteFile(FileName);


 
Veles
 
(2003-07-10 15:24)
[4]

Да проблема в том собственно, что надо вставить в определенную ячейку, как текст из базы данных:

XL.WorkSheets[1].Range[«K27»].Value := Table1PRIM.Value;

в Table1FOTO.Value храниться путь к файлу. Делаю:

XL.WorkSheets[1].Range[«B4»].Value := Pictures.Insert(Table1FOTO.Value);

не работает…


 
Veles
 
(2003-07-10 15:26)
[5]

Говорит:

Symbol «Picture» is specific to a platform


 
Palladin
 
(2003-07-10 15:28)
[6]

1 это Warning а не Error

2 картинка в экселе не привязывается к конкретной ячейки


 
Veles
 
(2003-07-10 15:37)
[7]

А можно как-то к месту привязать ?


 
Veles
 
(2003-07-10 15:43)
[8]

Все, огромное спасибо !

А место запоминается очень просто оказывается !

Рисунок всавляется в ту ячейку, которая была ВЫДЕЛЕНА при сохранение шаблона !

Чудеса…


    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    из Delphi -> вставить TImage -> в Excel
    , или TBitmap

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    08.09.04, 06:17

      Full Member

      ***

      Рейтинг (т): 4

      Хочу вставить TImage или TBitmap в ячейку экселевского документа. У кого есть опыт? Помогите!
      А еще желательно, чтоб ячейка автоматически устанавливала свой размер по размеру вставляемой картинки.

      а так я вставляю текст:

      ExpandedWrap disabled

        var

          Excel, WorkBook, Sheet: Variant;

        ………

          Excel := CreateOleObject(‘Excel.Application’);

          Excel.Workbooks.Open(FileName);

          WorkBook := Excel.WorkBooks.Item[1];

          Sheet := Workbook.Sheets.Item[1];

        ………..

          Sheet.Cells[5, 5] := ‘Мой текст в ячейке’;

      Сообщение отредактировано: Grisha — 08.09.04, 06:18


      P.O.D



      Сообщ.
      #2

      ,
      08.09.04, 15:49

        Метод AddPicture(FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height)

        ExpandedWrap disabled

          Sheet.Shapes.AddPicture(‘C:1.bmp’,true,true,0,0,128,128);

        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

        0 пользователей:

        • Предыдущая тема
        • Delphi: Общие вопросы
        • Следующая тема

        Рейтинг@Mail.ru

        [ Script execution time: 0,0174 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  

        Like this post? Please share to your friends:
      • Delphi excel буфер обмена
      • Delphi excel активная ячейка
      • Delphi excel workbooks open
      • Delphi excel sheets sheet
      • Delphi excel select all