AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.07.2016, 08:47   #1  
Pandasama is offline
Pandasama
Участник
 
448 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Excel, быстрая группировка
Имеется отчет в Excel, при некоторых условиях достигающий 100 тысяч строк.
В нем необходимо сделать группировки по строкам.
При 100 тысячах строк для группировки есть 20 тысяч рэнджей.
Группировка идет через обычный COM, метод .group(), что при указанных объемах занимает чуть больше часа времени.

Есть ли более быстрые способы для осуществления группировок такого масштаба?
Вывод в Excel сейчас осуществляется также через COM, через вставку одного здоровенного строки-буфера (или разбития её на несколько кусков, если она сильно большая). Скорость вывода вполне нормальная, но при необходимости ускорения группировки способ вывода можно и поменять.

Используется в Ax2009
Старый 14.07.2016, 08:03   #2  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
Рекомендую работать с Excel используя DotNet библиотеку, на форуме множество примеров вывода данных не используя textbuffer.
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 14.07.2016, 08:17   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
.Net не поможет
Это надстройка на COM'ом и использование его будет, по сути, эквивалентно использованию в Аксапте. Проблема-то не в выводе массива данных, а в необходимости сделать вызов большого числа методов Экселя, что в любом случае будет не быстро

По-моему, в данному случае, надо двигаться в строну сводных таблиц
Или OLAP-кубов, в более широком смысле
__________________
Axapta v.3.0 sp5 kr2
Старый 14.07.2016, 09:14   #4  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
Про сводные таблицы хорошая идея, а перевод на DotNet все равно желателен, хотя бы для отказа вывода через текстбуфер, который элементарно крешится при параллельных операциях с буфером обмена. Вот такое ИМХО.
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
Старый 14.07.2016, 11:14   #5  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
Самый простой вариант - сделать шаблон Excel со сводной таблицей.
На втором листе - строки с данными, на первом - сводная таблица.
Последовательность создания шаблона такая:
вставляем данные в таблицу,
формируем сводную таблицу в нужном виде (выделение данных по колонкам)
удаляем данные
сохраняем шаблон
Далее из аксапты заполняем данными второй лист и все.
Старый 18.07.2016, 12:14   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Основная стратегия ускорения формирования Excel - это замена "штучных" команд на групповые. Т.е. вместо 20 тысяч отдельных команд на группировку надо попытаться сделать одну (несколько десятков или сотен) общих команд на группировку.

Судя по документации, команда на группировку имеет вид Range.group(). Но Range - это не обязательно непрерывный диапазон. В общем случае, это может быть вообще набор отдельных ячеек.

Может быть, Вам имеет смысл попробовать группировать Range "пакетами" и накладывать группировку на эти "пакеты"? Я не пробовал так делать, просто как идея

Для справки:

Есть такой метод Excel.Union(), который позволяет объединять несколько Range в один. Правда, в этом методе может быть не более 30 параметров в одной команде (не более 30 Range могут быть объединены одной командой), но можно сделать цикл и присоединять по одному Range за раз

В псевдо-коде как-то так

rangeAll = Excel.Range("A1:B1")
rangeAll = Excel.Union(rangeAll, Excel.Range("A2:B2"))
rangeAll = Excel.Union(rangeAll, Excel.Range("A3:B3"))
...
rangeAll.group()
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Pandasama (1).
Старый 18.07.2016, 13:21   #7  
Pandasama is offline
Pandasama
Участник
 
448 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
rangeAll.group()
Увы
Код:
Метод "group" в COM-объекте класса "Range" возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: Данная команда неприменима для несвязных диапазонов.
Старый 18.07.2016, 13:57   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Pandasama Посмотреть сообщение
Имеется отчет в Excel, при некоторых условиях достигающий 100 тысяч строк.
В нем необходимо сделать группировки по строкам.
При 100 тысячах строк для группировки есть 20 тысяч рэнджей.
Группировка идет через обычный COM, метод .group(), что при указанных объемах занимает чуть больше часа времени.
Проверяю

X++:
static void Job_test(Args _args)
{
    ComExcelDocument_RU ComExcelDocument_RU;
    Com                 comRange;
    MSOfficeBookMark_RU bookMark;
    int                 nextI;
    int                 timeNowBegin = timeNow();
    ;

    ComExcelDocument_RU = new ComExcelDocument_RU();
    ComExcelDocument_RU.newFile('',false);


    for (nextI = 1; nextI <= 20000; nextI++)
    {
        bookMark = int2str((nextI-1)*10 + 1)+':'+int2str(nextI*10 - 2);
        comRange = ComExcelDocument_RU.findRange(bookMark);
        comRange.group();
    }

    ComExcelDocument_RU.visible(true);

    info(time2str(timeNow()-timeNowBegin,1,1));
    info('end');
}
20 тысяч групп было создано за 00:07:46. Т.е. примерно за 8 минут. При этом последняя используемая строка Excel имеет номер 199`999. Т.е. 200 тысяч строк

Тест выполнял на Ax4.0. Почему у Вас получилось время более 1 часа ищите сами

PS: Надеюсь, вы метод select() не используете? Для программного формирования Excel обычно он не нужен и лишь является лишним тормозом. Используется только как завершающая команда непосредственно перед открытием.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 20.07.2016, 08:46   #9  
Pandasama is offline
Pandasama
Участник
 
448 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Как ни странно, оказалось, что заполненная таблица группируется заметно дольше чем пустая.
Поэтому поменяв местами группировку и заполнение - получилось заметно ускорить процесс.
Старый 20.07.2016, 10:38   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Да. Вопрос оптимизации процесс творческий

А не пробовали заполнять не чистый лист Excel, а предварительно созданный шаблон с преднастроенными группировками?

Насколько я понимаю, у Вас много мелких групп по 5..10 строк. Ну, и создать шаблон, например, с сотней группировок по 10 строк, а при подготовке буфера обмена добавлять пустые (фиктивные) строки в буфер, чтобы "вписаться" в группы шаблона.

Да, будут группы с пустыми строками, зато сами группировки при формировании отчета создавать не надо.

Можно еще поиграться добавлением/удалением пустых строк в предварительно настроенные группы шаблона. Может быть, это будет быстрее, чем собственно создание групп
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Теги
excel, group, performance

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Выгрузка данных в Excel и их группировка... NetBus DAX: Программирование 8 09.12.2013 11:28
atinkerersnotebook: Using Export To Excel in Dynamics AX to Create Reporting Data Sources Blog bot DAX Blogs 1 12.10.2013 01:13
atinkerersnotebook: Using the Dynamics AX Excel Add-In Blog bot DAX Blogs 1 25.09.2013 07:11
atinkerersnotebook: Walkthrough & Tutorial Summary Blog bot DAX Blogs 1 09.09.2013 09:11
Группировка сводной таблицы Excel AlexeyVS DAX: Программирование 4 29.07.2010 12:13
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:57.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.