Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Excel вставка объекта из файла


Автор: FURANIUM 16.9.2010, 14:23
День добрый.
Суть вопроса в следующем, начал готовить на Дельфи отчеты в Эксель. Все замечательно - импорт и экспорт данных с Экселем, форматирование текста, все на уровне, пока не решил включить в отчет объект из файла. Объект как правило схема, схема нарисована либо в Visio, либо в AutoCAD.
При решении вопроса поступил следющим образом: записал макрос вставки из файла в Экселе, посмотрел как устроен, решил адаптировать его под Дельфи и сразу возникла проблема, после осуществленной вставки объекта в Эксель в приложении Дельфи постоянно появляется ошибка "Вызов был отклонен", незнаю как решить.
Полагаю вопрос решается очень просто, но поверхностное познание материала не позволяет разрешить ситуацию.


Код

try //проверяем есть-ли объект 'Excel.Application'
   VExcel := GetActiveOleObject('Excel.Application'); 
  except
    on EOLESysError do
      VExcel := CreateOleObject('Excel.Application'); //нет, создаем
  end;


   VExcel.WorkBooks.Add(opendialog1.FileName); //открываем шаблон
   VExcel.WorkSheets[1].Activate; //активируем первый лист

   VExcel.ActiveSheet.Range['B12'].Select; //выделем ячейку, для того чтобы вставить объект с ячейки
   VExcel.ActiveSheet.OLEObjects.Add(Filename:='H:\FileName.vsd', Link:=True, DisplayAsIcon:=False).Select; //вставлем объект из файла
//далее сообщение об ошибке


Попутно возникли другие вопросы, которые появятся в перспективе с решением основного: 
1) Объект вставляется с уже имеющимися некими размерами, как узнать размеры этого объекта длинну и ширину?
2) Как установить произвольный размер по ширине/высоте, с пропорциональным произвольным размером по высоте/ширине?(схему небходимо разместить в ограниченных рамках, по высоте или ширине)

Автор: aleksh 16.9.2010, 17:39
убрать ошибку о вызове можно двумя способами
1: запускать программу при закрытом екселе
2: в строчке добавления картинки убрать ".Select", почему так - не знаю, может некий конфликт контролов или нечто в этом роде

Добавлено через 6 минут и 51 секунду
и вот http://forum.vingrad.ru/index.php?showtopic=84634&view=findpost&p=650732, там, наверняка, ответы на все связные вопросы

Автор: FURANIUM 17.9.2010, 12:32
Цитата(aleksh @ 16.9.2010,  17:39)
убрать ошибку о вызове можно двумя способами
1: запускать программу при закрытом екселе
2: в строчке добавления картинки убрать ".Select", почему так - не знаю, может некий конфликт контролов или нечто в этом роде

Добавлено @ 17:46
и вот http://forum.vingrad.ru/index.php?showtopic=84634&view=findpost&p=650732, там, наверняка, ответы на все связные вопросы

aleksh, спасибо.
1) Можно подробнее об этом способе?
2) Убирание ".Select" действительно устраняет ошибку "Вызов был отклонен", но дальнейшая попытка обрадится к объекту снова приводит к ее появлению.
Ссылку посмотрел, много интересного, но как применить в данном случае информацию не додумал.
Может есть еще идеи у кого нибудь?

Автор: aleksh 17.9.2010, 13:07
Цитата(FURANIUM @  17.9.2010,  12:32 Найти цитируемый пост)
1) Можно подробнее об этом способе?

1 как подробней? если выполнять код с .select когда нет открытых xls файлов, то открывается ексель, в него вставляется картинка и она "выбрана"
2 а как обращаешься? к объекту можно обращаться после вставки и изменять его размеры

Автор: FURANIUM 17.9.2010, 13:38
Цитата(aleksh @ 17.9.2010,  13:07)
Цитата(FURANIUM @  17.9.2010,  12:32 Найти цитируемый пост)
1) Можно подробнее об этом способе?

1 как подробней? если выполнять код с .select когда нет открытых xls файлов, то открывается ексель, в него вставляется картинка и она "выбрана"
2 а как обращаешься? к объекту можно обращаться после вставки и изменять его размеры

1) Первый способ не подойдет, т.к. объект всавляется в шаблон
2) После просмотра макроса в Excel, пробовал обращаться как VExcel.ActiveSheet.Shape('Object 1').Select;

Автор: aleksh 17.9.2010, 14:45
Цитата(FURANIUM @  17.9.2010,  13:38 Найти цитируемый пост)
1) Первый способ не подойдет, т.к. объект всавляется в шаблон

а зачем тогда
Цитата(FURANIUM @  16.9.2010,  14:23 Найти цитируемый пост)
      VExcel := CreateOleObject('Excel.Application'); //нет, создаем


Автор: FURANIUM 17.9.2010, 15:06
Цитата(aleksh @ 17.9.2010,  14:45)
Цитата(FURANIUM @  17.9.2010,  13:38 Найти цитируемый пост)
1) Первый способ не подойдет, т.к. объект всавляется в шаблон

а зачем тогда
Цитата(FURANIUM @  16.9.2010,  14:23 Найти цитируемый пост)
      VExcel := CreateOleObject('Excel.Application'); //нет, создаем

Видимо я тут немножко не в теме, не совсем пойму. Но всеравно спасибо.

И выяснилось замена Link:=True на Link:=False
Код

VExcel.ActiveSheet.OLEObjects.Add(Filename:='H:\FileName.vsd', Link:=False, DisplayAsIcon:=False).Select; 

Избавляет от ошибки при добавлении объекта, но не избавляет от ее появления в дальнейшем

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)