
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.96] |
![]() |
|
Сообщ.
#1
,
|
|
|
Вопрос на засыпку (от слова спать)
![]() Как вставить из буфера обмена таблицу в Excel, используя ExcelApplication ? Нигде в нете не могу найти ответ! Впрочем, нашёл где-то такую строчку: OLEVariant(Workbooks[1].Worksheets[1] ).PasteSpecial; Это работает, но если запущено больше одного экселя, то вставляет ОНО текст не в ту книгу, которую надо! И вообще, что это за зверь - OLEVariant? Я его боюсь ![]() Можно без него обойтись? |
Сообщ.
#2
,
|
|
|
Цитата ILUXER @ И вообще, что это за зверь - OLEVariant можно просто Variant и CreateOleObject сделай подобную операцию в Excel'е и запиши макрос, потом посмотри код... перевести на Delphi не составит большого труда |
Сообщ.
#3
,
|
|
|
Сообщ.
#4
,
|
|
|
dron-s
Пробовал, там написано ActiveSheet.Paste Это никак не помогает. В Delphi я не могу написать Workbooks[1].ActiveSheet.Paste потому что Undeclared identifer Paste. Albinos_X Был уже тут, читал. Но... ничего про вставку в Excel из clipboarda, всё только про Word. |
![]() |
Сообщ.
#5
,
|
|
Цитата ILUXER @ В Delphi я не могу написать Workbooks[1].ActiveSheet.Paste потому что Undeclared identifer Paste. А вот с этого места - поподробнее... У меня все компилируется... Покажи, как запускаешь Excel. |
Сообщ.
#6
,
|
|
|
там про Excel тоже есть, просто не внимательно прочитал статью... поясню... дело в том, что если ты запустишь сначала книгу отдельно, потом свою книгу, но обращаться будешь по :
![]() ![]() OLEVariant(Workbooks[1].Worksheets[1] ).PasteSpecial; то она уже никак не будет иметь индекс = 1, твоя книга будет уже второй т.д. и т.п., то же самое если запустишь несколько книг, потом свою, потом часть закроешь, то индек изменится... поэтому следует : 1. При открытии сразу связывать объект (переменную) с этой книгой или конкретным листом и через него обращаться 2. Производить поиск нужной книги и листа по заголовку в массиве книг 3. Фиксировать при запуске индекс книги и следить за её перемещением в массиве считаю самым оптимальным первый вариант... а через имеющиеся компаненты это уже не сложно сделать например для ExcelApplication: ![]() ![]() ExcelApplication1.Range['A1',EmptyParam]._PasteSpecial(EmptyParam,EmptyParam,EmptyParam,EmptyParam); для ExcelWorksheet1 : к примеру ![]() ![]() ExcelWorksheet1._PasteSpecial; или ![]() ![]() ExcelWorksheet1.Paste; |
Сообщ.
#7
,
|
|
|
2 Albinos_X
![]() ![]() ExcelApplication1.Range['A1',EmptyParam]._PasteSpecial(EmptyParam,EmptyParam,EmptyParam,EmptyParam); компилируется, если убрать знак подчёркивания перед _PasteSpecial. Что этот знак обозначает, не догадываюсь, но вставки всё равно не происходит, даже если заменить A1 на EmptyParam. Ошибку выдаёт дебагер во время выполнения "Could not convert type (Error) to type(Boolean)" - точно не помню, что-то вроде этого Далее ![]() ![]() ExcelWorksheet1.Paste; Но у Workшитов нету такой функции! Когда я пишу Workbooks[1].Worksheets[1].paste , Delphi не понимает! 2 volvo877 & 2 ALL На форме TExcelApplication AutoConnect=FALSE AutoQuit=TRUE В программе: ![]() ![]() with ExcelApplication1 do begin Connect; Workbooks.Add(EmptyParam, 0); Clipboard.Clear; //... // Здесь в буфер обмена накапливаются нужные данные // ... OLEVariant(Workbooks[1].Worksheets[1] ).PasteSpecial; //Вот эту строчку нужно заменить //чтобы текст вставлялся в нужную книгу //... // Здесь форматирование ячеек и всё такое //... Visible[0]:=true; //сделать Excel видимым if WindowState[0] = xlMinimized then WindowState[0] := xlNormal; ScreenUpdating[0] := true; Clipboard.Clear; end; |
Сообщ.
#8
,
|
|
|
Цитата ILUXER @ омпилируется, если убрать знак подчёркивания перед _PasteSpecial у тебя какая версия Delphi и Office ? У меня именно они и есть... Цитата ILUXER @ Но у Workшитов нету такой функции! Когда я пишу Workbooks[1].Worksheets[1].paste есть... но тот который ты используешь неверен (!!!).... ![]() ![]() ... ExcelApplication1.ConnectKind:=ckNewInstance; ExcelApplication1.AutoConnect:=true; ExcelApplication1.SheetsInNewWorkbook[LOCALE_USER_DEFAULT]:=1; ExcelApplication1.Workbooks.Add(EmptyParam,LOCALE_USER_DEFAULT); ExcelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkbook.ActiveSheet as ExcelWorkSheet); //... // Здесь в буфер обмена накапливаются нужные данные // ... ExcelWorksheet1._PasteSpecial; //чтобы текст вставлялся в нужную книгу //... // Здесь форматирование ячеек и всё такое //... ExcelApplication1.Visible[LOCALE_USER_DEFAULT]:=true; //сделать Excel видимым if WindowState[0] = xlMinimized then WindowState[0] := xlNormal; ScreenUpdating[0] := true; Clipboard.Clear; ... в наборе имеется восемь методов ExcelWorksheet1._PasteSpecial с нулём и до 7 параметров: ExcelWorksheet1._PasteSpecial(Format, Link, DisplayAsIcon, IconFileName, IconIdex, IconLabel, lcid); все OleVariant кроме последнего, он Integer... Добавлено Цитата Albinos_X @ но тот который ты используешь неверен (!!!)... с помощью него получишь только ссылку на объект... и к тому же это не решит твою проблему с "промахом" страницей... Добавлено да и ещё... кинь на форму ТExcelWorksheet... Добавлено Цитата Albinos_X @ есть... но тот который ты используешь неверен (!!!).... ты попутал доступ через компоненту и через OleVariant... |
Сообщ.
#9
,
|
|
|
Всё заработало, огромное спасибо!
Версия Delphi 7, Office 2002. Комоненты на поллитре компонентов (вкладка Servers) - все с добавкой 2000! А будет ли программа работать с другой версией Офиса? ![]() |
Сообщ.
#10
,
|
|
|
должна... если бы было _PasteSpecial с параметрами, то может чем-то ХР от 2000 и отличалось бы, так проблем не должно возникать...
Удачи! |
Сообщ.
#11
,
|
|
|
С чем связано то, что данные иногда вставляются в непонятной кодировке?
|
Сообщ.
#12
,
|
|
|
вероятно с тем, откуда копируешь... тоже самое, как русский текст копируется в окно ответа здесь...
|