|  15.08.2013, 18:09 | #1 | 
| Участник | Быстрый способ выгрузить данные из формы в Excel 
			
			Видел несколько тем на эту тему )), решения весьма громоздкие, и замороченные,  нашел простой способ и решил поделиться. В Ax 2009 и Ax 2012, это уже есть, но для 3й и 4й версии пригодится. Не нужно перебирать объекты формы и париться с источниками данных, все просто ! X++: #Task void clicked() { TextBuffer TB = new TextBuffer(); ComExcelDocument_RU Excel; Table Cursor; ; //super(); if (!Table_ds.anyMarked()) { cursor.data(Table); element.task(#taskSelectAll); } element.task(#taskCopy); TB.fromClipboard(); if (cursor) { Table_ds.research(); Table_ds.findRecord(cursor); } excel = new COMExcelDocument_RU(); excel.newFile("",false); excel.pasteSpecialFromTextBuffer("A1", TB); excel.setAutoFiler("A1"); excel.visible(true); excel.finalize(); } | 
|  | |
| За это сообщение автора поблагодарили: lev (10), Jorj (1), Player1 (1). | |
|  19.08.2013, 08:05 | #2 | 
| Участник | 
			
			Ну а метод task() можно узреть? А заодно и pasteSpecialFromTextBuffer() с setAutoFiler() раз речь о dax3 и 4 зашла
		 | 
|  | 
|  19.08.2013, 09:20 | #3 | 
| Участник | 
			
			Task() не перекрыт, вставка данных в Excel с пом. буфера обмена - тема затертая до дыр, если еще не в курсе - поиск по форуму. или вот,  автофильтр и прочие "штуки-дрюки" в Excel, если их нет в классе ComExcelDocument_RU, Я лично выцепляю с пом. записи макроса. потом добавляю соответствующий метод в класс X++: void setAutoFiler(BookMark _bookMark, int _workSheet = 1) { COM comRange; ; comRange = this.findRange(_bookMark, _workSheet); comRange.AutoFilter(1); } | 
|  | 
|  19.08.2013, 10:04 | #4 | 
| Участник | 
			
			Можно тогда узнать Task ID макроса #taskSelectAll Цитата:  Цитата: 
		
			Сообщение от kair84
			   или вот[/XPP] Вы - молодец. Я не зря спросил про pasteSpecialFromTextBuffer(), мне вот непонятно зачем в него передается TB. | 
|  | 
|  19.08.2013, 11:11 | #5 | 
| Участник | Цитата: 
		
			Можно тогда узнать Task ID макроса #taskSelectAll
		
	 Да, можно было обойтись и без TB, продублировать проверки. и вызвать comRange.PasteSpecial(), но Я сторонник подхода, максимально использовать код повторно, и не плодить дубли. И я отправил Вас на форум к mazzy только потому, что там в одном месте собрано несколько полезных постов на эту тему, которые в свою очередь являются репостами инфы с данного форума. Цитата: Цитата: 
		
			вставка данных в Excel с пом. буфера обмена - тема затертая до дыр, если еще не в курсе - поиск по форуму
		
	 Цитата: 
		
			Я не зря спросил про pasteSpecialFromTextBuffer(), мне вот непонятно зачем в него передается TB.
		
	 Судя по дате регистрации на форуме, с Ах Вы знакомы давно, и мне не понятно как у Вас могут возникать такие вопросы. Если у Вас есть предложения как еще упростить/улучшить этот процесс, выкладывайте свой вариант, а не задавайте наводящие вопросы. | 
|  | 
|  19.08.2013, 11:40 | #6 | 
| Участник | 
			
			У меня нет, не говорит. X++: // Task-ID values, to be used with formControl's // return value from the method task() //-------------------------------------------------------- #define.taskF1(257) #define.taskEnter(288) #define.taskShiftEnter(307) #define.taskNew(260)... Вариант свой выложить немогу - у меня не получается реализовать без некоторых вещей, о которых я и спрашиваю в данной ветке. | 
|  | 
|  19.08.2013, 12:53 | #7 | 
| Участник | 
			
			Если нет кода нужного Вам, перекрываете на форме метод task(), добавляете точку останова, и ловите TaskID X++: #define.taskCopy(771) #define.taskSelectAll(778) X++: public void insertText(BookMark _bookMark, TextBuffer _text, int _workSheet = 1) { COM XLSWorkSheet, XLSrange; TextBuffer tempBuffer; // To store clipboard contents int nextI, maxI = 3; ; // Если содержимое TextBuffer вообще не введено, то PastSpecial даст ошибку, // а если заведена пустая строка, то нет смысла делать PastSpecial if (! _text.size()) { return; } // Initializing XLSWorkSheet object XLSWorkSheet = this.getWorkSheet(_workSheet); if (!XLSWorkSheet) { throw error("@DIS6043"); } // Initializing XLSRange object XLSrange = this.findRange(_bookMark,_workSheet); if (!XLSrange) { throw error("@SYS27391"); } XLSrange.select(); for (nextI = 1; nextI <= maxI; nextI++) { try { // Storing clipboard contents tempBuffer = new TextBuffer(); tempBuffer.fromClipboard(); // Preparing text to be inserted _text.toClipboard(); // Inserting text from clipboard ///ГЛЮК XLSWorkSheet.pasteSpecial(1); // 1 - "Text only" mode XLSWorkSheet.pasteSpecial(0); // Restoring clipboard contents tempBuffer.toClipboard(); // В случае успеха, прерываю цикл break; } catch(Exception::Error) { // в случае ошибки удаляю последнюю строку infolog, // которая генерится автоматически ошибкой COM if (infolog.line()) { infolog.clear(infolog.line()-1); } // предпринимаю очередную попытку сделать вставку через буфер } } // for (nextI) // Если выход из цикла for произошел "штатно", то значение счетчика будет больше максимально допустимого значения if (nextI > maxI) { throw error("Ошибка при копировании данных через буфер обмена."); } } X++: public void pasteSpecialFromTextBuffer(BookMark _bookMark, TextBuffer _buffer, int _workSheet = 1) { COM XLSWorkSheet, XLSrange; ; if (! _buffer.size()) return; if (! m_comDocument) throw error(strfmt("@GEE6401", this.getApplicationName())); XLSWorkSheet = this.getWorkSheet(_workSheet); if (!XLSWorkSheet) throw error("@DIS6043"); XLSrange = this.findRange(_bookMark,_workSheet); if (!XLSrange) throw error("@SYS27391"); XLSrange.select(); _buffer.toClipboard(); XLSrange.pasteSpecial(0); } | 
|  | 
| Теги | 
| excel, grid, выгрузить данные | 
|  | 
| 
 |