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, выгрузить данные |
|
|