Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2021, 13:14   #1
hron66
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 20
По умолчанию Выгрузка TImage в Excel

Доброго времени суток!
На форме есть TImage с изображением. Пытаюсь вставить в Excel: копирую изображение из TImage в буфер обмена. Затем вставляю в Excel с помощью команды PasteSpecial. В итоге на PasteSpecial все время возникает исключение EOleException с текстом:
Метод PasteSpecial из класса Worksheet завершен неверно.
Код:
procedure TfmMain.TestBtnClick(Sender: TObject);
var Img: TImage;    
    xla: Variant;
    xls: Variant;
begin
  Img:=TImage.Create(nil);

  xla := CreateOleObject('Excel.Application');
  xla.Workbooks.Add;
  xls := xla.Workbooks[1].WorkSheets[1];
  xls.Name := 'Sheet1';
  xla.Visible:=True;

  Clipboard.Assign(Img.Picture);
   
  xla.Cells(5,5).Select;
  xls.PasteSpecial(5,False,False,False,0,EmptyParam,EmptyParam);  

  Img.Free;
end;
Версия Lazarus: 1.6.4
Версия FPC: 3.0.4
Я думаю, что все дело в том, что неправильно передаются параметры в PasteSpecial. Если у кого-нибудь есть рабочий вариант, поделитесь пожалуйста. Заранее благодарен.
hron66 вне форума Ответить с цитированием
Старый 29.01.2021, 14:51   #2
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 30
По умолчанию

hron66, Почитай про библиотеку FpSpreadsheet. Она заточена как раз для взаимодействия с Excel.
Лично я выгрузку Image в Excel не делал, но всякое чтение/запись подкрашивание ячеек и прочее форматирование текста как-то надобилось.
Думаю, закинуть тебе в нужную ячейку изображение тоже не составит труда.
И Lazarus лучше обнови. 1.6.4 старый и много моментов в нем не совсем хорошо работает по сравнению с 2.0.10.
IvaNoff2020 вне форума Ответить с цитированием
Старый 01.02.2021, 10:03   #3
hron66
Пользователь
 
Регистрация: 21.09.2012
Сообщений: 20
По умолчанию

Спасибо, библиотеку FpSpreadsheet поизучаю.
Обновил Lazarus до версии 2.0.10. В нем вообще не работает мой код. На строке xla.Workbooks.Add пишет method not automation object. Хотя тоже самое в 1.6.4 прекрасно работает.
hron66 вне форума Ответить с цитированием
Старый 04.02.2021, 11:10   #4
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 30
По умолчанию

hron66, Cкидываю тебе рабочий вариант. Проверил на Excel 2010. Но, чтобы все работало нормально, тебе нужно:
1. установить в свой проект последнюю версию 1.12 Fpspreadsheet.
Я скачивал тут. Можешь иную ссыль найти.
https://sourceforge.net/projects/laz...2.zip/download
2. Как я устанавливал.
Распаковываешь fpspreadsheet-1.12 в директорию установленного Lazarus.
По умолчанию. C:\lazarus\components\fpspreadsheet .
Далее в запущенном своем проекте жмешь
Пакет -> Открыть файл пакета (.lpk) ... выбираешь из C:\lazarus\components\fpspreadsheet поочередно файлы laz_fpspreadsheet.lpk laz_fpspreadsheet_visual.lpk и компелируешь добавляя в свой проект.
Ну а далее модуль проекту будет известен.

код на всякий случай:

Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes,SysUtils,Forms,Controls,Graphics,Dialogs,ExtCtrls,StdCtrls,
  fpstypes,fpspreadsheet,fpsallformats,fpsutils,fpsPageLayout;  // взаимодействие с Excel

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  MyWorkbook: TsWorkbook;
  MyWorksheet: TsWorksheet;

  filename_png: string;
  filename_xls: string;


begin

  MyWorkbook := TsWorkbook.Create;

  filename_xls := 'D:\1\img_excel\name1.xlsx';                    // путь к Excel 2010
  filename_png := 'D:\1\img_excel\imagee.png';                    // путь к изображению *.png
  try
     MyWorkbook.ReadFromFile(filename_xls);                       // место, где находится файл Excel 2010

     MyWorksheet := MyWorkbook.GetFirstWorksheet;                 // рабочий лист 1(первый)

     Image1.Picture.SaveToFile(filename_png);                     // сохраняем в нужную дерикторию изображение из Image1

     MyWorksheet.WriteImage(1,3,filename_png,0.0,0.0,0.25,0.25);  // *.png в 4 столбце 2 строке (0.0 - смещение точки привязки *.png от угла текущей ячейки, 0.25 иасштаб уменьшен в 1/4 раз)

     MyWorkbook.WriteToFile(filename_xls, sfOOXML, True);         // сохранение в файле Excel 2010

  finally
     MyWorkbook.Free;
  end;
     Close;
end;


end.
Вложения
Тип файла: 7z img_excel.7z (262.6 Кб, 1 просмотров)
IvaNoff2020 вне форума Ответить с цитированием
Старый 04.02.2021, 13:36   #5
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 30
По умолчанию

IvaNoff2020, Да, чуть не забыл, не знаю в курсе ты или нет, но при запуске твоей программы, файл "name1.xlsx" (в данном примере. у тебя будет какой-то свой) должен быть закрыт. Иначе доступа на чтение/запись excel не будет и вылетит ошибка.
IvaNoff2020 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выгрузка из MySQL в Excel (некорректный файл Excel) Maxx PHP 4 16.09.2015 00:07
Выгрузка из DBGrid в excel Tanzor69 БД в Delphi 4 19.04.2013 15:39
Тормозит выгрузка в Excel Object_File ASP.NET 0 26.02.2013 13:54
Выгрузка в Excel city32 Общие вопросы Delphi 2 18.10.2012 15:58
Выгрузка из БД в Excel fenetka Microsoft Office Excel 6 20.10.2011 09:06