20.03.2002, 16:44 | #1 |
Moderator
|
Как вставить значение из Аксапты в Excel
Подскажите пожалуйста, как вставить какое нибудь значение в Excel из Аксапты ?
Пробовал, так: X++: COM cn = new COM("Excel.Application"); cn.ActiveCell.Value = "1" Хотя вот это работает: X++: COM cn = new COM("ADODB.Connection"); COM rs = new COM("ADODB.Recordset"); COM flds; COM fld; COMVariant cv1,cv2; ; cn.Provider("sqloledb"); cn.Open("DSN=BMSDSM;DATABASE=Northwind;Trusted_Connection=Yes"); rs.Open("SELECT * FROM Customers",cn); ........ 1. Почему второй код работает ? Ведь у класса COM нет такого свойства Provider и метода Open тоже нет. Или у ком объекта можно вызывать методы напрямую ? 2. Если все таки можно, почему не работает первый код ? И как вставить значение в Excel ? Заранее спасибо. |
|
20.03.2002, 18:16 | #2 |
Участник
|
1. Работает, потому что правильно.
У класса COM таких методов и свойств нет. Но они есть у объектов COM, классов соответсвенно ADODB.Connection и ADODB.Recordset. В этом и состоит концепция COM (ActiveCell - тоже ведь не свойство COM! а объекта COM-класса Excel.Application) 2. Не работает потому что неправильно. Axapta тут ни при чем. Если аналогичное написать в VBA напрмер в том же Word, то будет ошибка, т.к сразу после создания объекта ActiveCell не определено (Nothing). Соответственно и о его свойстве Value никто не знает. Используйте чтонибудь ниже уровнем, например Excel.Worksheet, у которого есть Sheets, а у тех Cells |
|
20.03.2002, 18:58 | #3 |
Moderator
|
Мда, поспешил.
X++: COM wb; COM cn cn = new COM("Excel.Application"); cn.Visible = True; wb = cn.Workbooks.Add(); cn.ActiveCell.Value = "1"; Говорит, что в строке ( cn.Visible = True; ) - "Таблица находится вне диапазона или не существует". Непонятно также откуда Аксапта берет информацию о методах и свойствах СОМ сервера. В VB я подключаю соответсвующую библиотеку, в Delphi делаю импорт tlb, здесь же нет ничего подобного. |
|
20.03.2002, 20:37 | #4 |
Участник
|
1. Аксапта работает через позднее связывание. tlb нужны для раннего связывания. См. документацию на COM.
2. Может быть не в тему... Данные гораздо удобнее переносить не программированием, а через обычный буфер обмена. = Выделяем несколько строк (или все строки) в любой таблице (гриде) = копируем в буфе (Ctrl+C) = в Excel-е вставляем из буфера (Ctrl+V) |
|
20.03.2002, 21:00 | #5 |
Участник
|
Цитата:
Изначально опубликовано Андре
COM wb; COM cn cn = new COM("Excel.Application"); cn.Visible = True; wb = cn.Workbooks.Add(); cn.ActiveCell.Value = "1"; Вот этот код работает в Word'е, но не работает в Аксапте. Второе, - присвоение может и не поддердживаться. Попытайтесь так - сn.Visible(True); Это такое же свойство как и Provider для ADODB.Connection Цитата:
Непонятно также откуда Аксапта берет информацию о методах и свойствах СОМ сервера. В VB я подключаю соответсвующую библиотеку, в Delphi делаю импорт tlb, здесь же нет ничего подобного. А можно ведь ничего и не импортировать. - Смысл использования COM в том, что приложение может и не знать заранее объект какого приложения, какого класса вы создаете, а определять это в момент выполнения. Так и здесь - Аксапта(Delphi-приложение, Word что угодно) обращается к библиотекам COM инетерфейса (ole), та в registry смотрит id класса имеющего нимаенование Excel.Application, находит сервер-приложение, активизирует его, опрашивает и т.д..... |
|
21.03.2002, 15:20 | #6 |
Moderator
|
Цитата:
rkouznet
Навряд ли. Word на попытке выполнить здесь Workbooks.Add оно свалится, т.к. на момент связывания Workbooks будет не иметь определнных свойств. Цитата:
Лучше обращаться напрямую к объекту класса ExcelWorksheet, или Execl.Workspace
Excel.Worksheet у меня не существует, так как в момент создания Excel.Application у меня нет ни Worbook, ни Worksheet. Что такое Excel.WorkSpace я вообще не нашел. Цитата:
А можно ведь ничего и не импортировать. - Смысл использования COM в том, что приложение может и не знать заранее объект какого приложения, какого класса вы создаете, а определять это в момент выполнения. Так и здесь - Аксапта(Delphi-приложение, Word что угодно) обращается к библиотекам COM инетерфейса (ole), та в registry смотрит id класса имеющего нимаенование Excel.Application, находит сервер-приложение, активизирует его, опрашивает и т.д.....
cn. у меня не появляется список доступных методов. Например как в других средах разработки. Разработчики Аксапты не предусмотрели ? А каким образом я могу узнать, что я могу указать после точки. Я бы мог посмотреть это в любой другой среде разработки, но что толку то: приведенный выше код работает в Word (работает - я проверял !!!), но не работает в Аксапте. :-(( Как узнать какие методы сервер-приложения я могу вызывать в Аксапте ????? |
|
21.03.2002, 21:48 | #7 |
Участник
|
Цитата:
У меня это работало. В Word'е.
Цитата:
Что такое Excel.WorkSpace я вообще не нашел
Цитата:
Это я понял. Но почему, когда я набираю
cn. у меня не появляется список доступных методов. Например как в других средах разработки. Разработчики Аксапты не предусмотрели ? А каким образом я могу узнать, что я могу указать после точки. Я бы мог посмотреть это в любой другой среде разработки, но что толку то: приведенный выше код работает в Word (работает - я проверял !!!), но не работает в Аксапте. :-(( Как узнать какие методы сервер-приложения я могу вызывать в Аксапте ????? При позднем связывании не будет никакой подсказки. Какие методы/свойства становится известно в момент выполнения, т.е. в данном случае после создания объекта COM-класса ( не класса COM что в Axapta, а COM-класса.) Цитата:
Извините, но я не понял
|
|
21.03.2002, 21:59 | #8 |
Участник
|
И все таки...
Разрешите еще раз высказать, что: 1. данные можно перенести через clipboard 2. для переноса в эксель можно воспользоваться документооборотом (Разное \ Управление документооборотом \ Типы документов) У меня еще не ни разу возникало необходимости писать руками выгрузку данных из Аксапты в Эксель. Андре, мне кажется (я, конечно, могу ошибаться), что ты влезаешь в низкоуровневое программирование совершенно напрасно. Что у тебя за задача то? |
|
21.03.2002, 23:42 | #9 |
Участник
|
Цитата:
У меня еще не ни разу возникало необходимости писать руками выгрузку данных из Аксапты в Эксель.
С уважением,
__________________
Эдуард Киселев, сотрудник Группы Компаний "Счастливый Кроха" |
|
22.03.2002, 09:34 | #10 |
Administrator
|
Цитата:
Изначально опубликовано mazzy
...Данные гораздо удобнее переносить не программированием, а через обычный буфер обмена. У нас когда-то тоже возникала такая задача. В итоге появилось решение, которое можно использовать в качестве альтернативы двум, предложенным выше: было решено использовать автоотчет с выводом в текстовый файл. В итоге получается CSV-файл, в котором в качестве разделителя выступает символ табуляции. Excel такие файы прекрасно понимает. Разумеется, возникает проблема с выбором нужных строчек для включения в этот отчет (придется создавать query). В общем и это решение, и решение с буфером обмена не достаточно гибкие, для того, чтобы решить задачу по переносу данных в Excel в полном объеме. Можно попытаться довести до ума решение с отчетом (формировать query в зависимости от выбора пользователя), но идеологически решение по связи с Excel через COM Connector более правильное.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
22.03.2002, 09:40 | #11 |
Moderator
|
Спасибо всем за советы. Постараюсь с COM разобраться за выходные. Надеюсь получится, а нет - ждите новых вопросов.
Цитата:
mazzy
Андре, мне кажется (я, конечно, могу ошибаться), что ты влезаешь в низкоуровневое программирование совершенно напрасно. Что у тебя за задача то? Насчет документооборота - не уверен, что он мне всегда поможет. Например - подготовка договора. Договор составляется на основании заказа (Таблица 1 - Заказы), какие-то данные берутся из Таблицы 2 - Клиенты, плюс еще нужен счет из Таблицы 3 - Банковские счета. Документооборот помогает выводить данные из двух связанных таблиц, но заставить его делать это из цепочки трех связанных таблиц у меня не получилось. Документооборот выручает тогда, когда нужно взять какие-то данные из какой-то таблицы вывести их в документ. А если их предварительно надо как-то обработать, то боюсь он уже не поможет. Мне кажется возможность посчитать что-то в тексте своей программы и вывести результат в определенное место в Excel или Word будет очень полезной. |
|
22.03.2002, 17:11 | #12 |
Участник
|
max, точно!
Я забыл про этот способ. Про датасорс. Есть такая партия. Но! После переноса записи обработать в Екселе нормальными формулами гораздо легче, чем заниматься программированием. Не так ли? Будем ждать view... Андре, понял. Просто мне казалось, что гораздо проще выгрузить данные в Ексель как есть, а затем обрабатываеть их в Екселе. Причем: на обработку в Ексель можно посадить менеджера, а не программиста со знанием СОМ |
|
25.03.2002, 08:57 | #13 |
Moderator
|
Все. Проблема решена.
X++: COM ExApp,Wbs,Wb,Wss,Ws,Rng; ExApp = new COM("Excel.Application"); ExApp.Visible(True); Wbs = ExApp.Workbooks(); Wb = Wbs.Add(); Wss = Wb.WorkSheets(); Ws = Wss.Add(); Rng = Ws.Range("A1"); Rng.Value2(1); Как я понял: 1. Аксапта не допускает использовать конструкции такого вида "%.%.%" с объектами типа COM, то есть такое выражение следует разбить на два таких "%.%". Если мы нарушаем это правило, то Аксапта ругается - "Таблица находится вне диапазона или не существует". 2. При этом Аксапта на этапе компиляции не проверяет корректность вызываемых методов. То есть мы можем написать: ExApp.ProsoMetod() и Аксапта это откомпилирует, а ошибка появится только во время выполнения. P.S. Если последнюю строку заменить на: Rng.Value(1); то этот вариант перестанет работать в Аксапте, хотя он прекрасно работает в Worde, Delphi и т.д. Не понятно. P.S. Цитата:
rkouznet
Только если tlb импортировано. X++: procedure TForm1.Button1Click(Sender: TObject); var ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData : Variant; begin ExcelApp := CreateOleObject('Excel.Application'); Workbook := ExcelApp.WorkBooks.Add; WorkBook.WorkSheets[1].Cells[1, 1]:='11'; ExcelApp.Visible:=true; end; |
|
26.01.2005, 21:56 | #14 |
Участник
|
2 Mazzy:
Не подскажете каким образом через Разное \ Управление документооборотом \ Типы документов можно экспортировать данные в Excel? Через администрирование \ Периодические операции \ Экспорт импорт понятно, но сделать так чтобы при создании листа COM лист заполнялся данными из текущей формы или таблиц (доступных через кнопку Настройки) не получилост. |
|
09.02.2005, 17:31 | #15 |
Участник
|
2All
Не подскажете как в Axatpe реализовать такую строчку VB: Worksheets("Лист1").Range("B7").Borders(7).LineStyle = 1 |
|
09.02.2005, 17:36 | #16 |
Участник
|
Это метод класса COM_ExcelDocument_RU
Здесь есть все, что тебе нужно. PHP код:
|
|
|
За это сообщение автора поблагодарили: VKUR (1). |
09.02.2005, 18:06 | #17 |
Участник
|
kashperuk
Большое спасибо за ответ. Правда в ComExcelDocument_RU я такого метода (setRangeBorder) не нашел (3.0 SP3 CU1), поэтому пришлось делать без обертки: PHP код:
|
|
09.02.2005, 18:13 | #18 |
Участник
|
Не нашел?? Странно.
Может правда это я сам добавлял, и уже не помню. Всегда рад помочь. |
|