|  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 | 
| Участник | Цитата: 
		
			У меня еще не ни разу возникало необходимости писать руками выгрузку данных из Аксапты в Эксель.
		
	  По моим наблюдениям программисты даже простейших бытовых операций(не говоря уже об использовани ERP-системы) не могут совершать без использования красивого програмного кода и при этом еще желательно собственноручно написанного.  С уважением, 
				__________________ Эдуард Киселев, сотрудник Группы Компаний "Счастливый Кроха" | 
|  | 
|  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 | 
| Участник | 
			
			Не нашел?? Странно. Может правда это я сам добавлял, и уже не помню.  Всегда рад помочь. | 
|  |