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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.10.2008, 17:42   #1  
Zlojbarsuk is offline
Zlojbarsuk
Участник
 
26 / 12 (1) ++
Регистрация: 08.08.2007
Быстрый способ вывода данных в Excel с картинками
Здравствуйте!
Есть необходимость ускорить вывод данных в Excel. Отчёт содержит картинки.
Перечитал много тем на форуме, касающихся вывода данных в Excel. Сделал вариант через SpreadSheets. Работает на порядок быстрее. Но этот способ, к сожалению, не позволяет выводить картинки.
Быть может кто-нибудь подскажет быстрый способ вывода данных в Excel с картинками? :-)
Старый 23.10.2008, 17:48   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
я реализовывал вот так, через класс Image:
X++:
    Image           Image;
    COM             comWorksheet;
    COM             comShapes;
    COM             Range;
    ;

    while select tmpTableForImage
    {
        Image   = new Image();
        Image.setData(tmpTableForImage.Image);
        Image.resize(130,100,3);
        comWorksheet    = excel.ActiveSheet();
        comShapes       = comWorkSheet.shapes();
        Range           = excel.Range(tmpTableForImage.NumRow, tmpTableForImage.NumCol);
        Range.select();
        Image.clipboardCopy();
        excel.WorkSheetCur().pasteSpecial(0);

        excel.Range(tmpTableForImage.NumRow, tmpTableForImage.NumCol).select();
        excel.Selection().RowHeight(78);
    }
excel - это объект приложения Excel с которым работаем.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 23.10.2008, 17:50   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
забыла написать, поле Image, во временной табличке куда я собирал картинки, типа Container.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 23.10.2008, 17:54   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
вот инициализация временной таблицы, вытаскивал картинку из файла:
X++:
    FilePath    pathFileLoc;// путь к файлу
    Bindata     binData;
    ;

    binData     = new BinData();
    tmpTableForImage.clear();
    tmpTableForImage.NumCol = colPict;// столбец для вставки
    tmpTableForImage.NumRow = startRow + lineNum - 1; // строка для вставки
    if (binData.loadFile(pathFileLoc))
        tmpTableForImage.Image = binData.getData();

    tmpTableForImage.insert();
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 23.10.2008, 17:54   #5  
Zlojbarsuk is offline
Zlojbarsuk
Участник
 
26 / 12 (1) ++
Регистрация: 08.08.2007
я делаю вывод картинки аналогичным образом... но нужно ускорить этот процесс(желание не моё)...
Сейчас скорость такая: 400 строк выводятся за 1,5 минуты...
Старый 23.10.2008, 17:59   #6  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Zlojbarsuk Посмотреть сообщение
я делаю вывод картинки аналогичным образом... но нужно ускорить этот процесс(желание не моё)...
Сейчас скорость такая: 400 строк выводятся за 1,5 минуты...
Странно, у меня намного быстрее, с учетом того что картинки выводятся в отчет, у которого более 50 столбцов секунд 15-20. Класс выполняется на клиенте.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 23.10.2008, 18:43   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
visible(true) для Excel, конечно, в самом конце делаете? Если нет, то сделайте в самом конце.

Еще можно для Excel перед циклом поставить Application.ScreenUpdating(false), а после - Application.ScreenUpdating(true). Даже при visible = false это дает некоторую экономию по времени.
Старый 23.10.2008, 18:51   #8  
Zlojbarsuk is offline
Zlojbarsuk
Участник
 
26 / 12 (1) ++
Регистрация: 08.08.2007
приложение делаю видимым по окончании выгрузки...
Старый 23.10.2008, 19:00   #9  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Поскольку мне неоткуда почитать картинки из таблицы, набросал джоб, выводящий в файл 400 фрагментов экрана (image.captureScreen). Время работы 2-3 секунды.
X++:
static void Job98(Args _args)
{
    ComExcelDocument_RU doc = new ComExcelDocument_RU();
    Image   image = new Image();

    COM     xlApp;
    COM     wbook;
    COM     activeSheet;
    COM     range;
    int     i, timeStart;
    ;

    timeStart = timenow();

    doc.NewFile('',false);
    wbook = doc.getComDocument();

    xlApp = wbook.Parent();
    activeSheet = xlApp.ActiveSheet();

    range = activeSheet.Range('B1');

    xlApp.ScreenUpdating(false);
    for (i=1;i<=400;i++)
    {
        image.captureScreen(0+(i-1)*2, 0+(i-1)*2, 300+(i-1)*2, 100+(i-1)*2);
        image.clipboardCopy();

        range.RowHeight(78);

        //range.Select();
        //activeSheet.Paste();
        range.pasteSpecial(0);

        range = range.Offset(1,0);
    }
    xlApp.ScreenUpdating(true);

    doc.visible(true);

    box::info(strFmt('Всего секунд: %1', timenow()-timeStart));
}
P.S. Удалось избавиться от Range.Select (см.коммент.строки), поэтому теоретически должно быть еще быстрее на какие-то проценты.

Опять в упор не понимаю, что означает конструкция pasteSpecial(0) применительно к Range (не к Worksheet!). Ну, нет там такой подпольной константы! По логике должна быть какая-то -4104 = xlPasteAll, но с ней валится.... А с 0 работает! Во дела... В каких же недокументированных анналах это прописано?

Что-то подобное мы уже обсуждали здесь: Параметры pastespecial()
За это сообщение автора поблагодарили: gl00mie (3), Molchun (1).
Старый 23.10.2008, 19:41   #10  
Zlojbarsuk is offline
Zlojbarsuk
Участник
 
26 / 12 (1) ++
Регистрация: 08.08.2007
Спасибо всем за помощь! :-)
Старый 23.10.2008, 20:13   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Gustav Посмотреть сообщение
Опять в упор не понимаю, что означает конструкция pasteSpecial(0) применительно к Range (не к Worksheet!). Ну, нет там такой подпольной константы! По логике должна быть какая-то -4104 = xlPasteAll, но с ней валится.... А с 0 работает! Во дела... В каких же недокументированных анналах это прописано?
Похоже, дело не в Excel. Успешно работают следующие "пустые" варианты Аксапты:
X++:
range.pasteSpecial( 0                             );
range.pasteSpecial( 01\01\1900                    );
range.pasteSpecial( false                         );
range.pasteSpecial( ''                            );
range.pasteSpecial( 'какая-то фигня непонятная...');
range.pasteSpecial( COMArgument::NoValue          );
range.pasteSpecial( COMVariant::createNoValue()   );
Кто-нибудь может дать объяснение? Классно, что это работает, потому что в этом случае нет необходимости в использовании Range.Select, который всегда замедляет процесс. Но хотелось бы вразумительно вооружиться теорией.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Импорт данных в журнал ГК из Excel Toshk DAX: Функционал 6 23.10.2008 13:46
Excel, группировки: как программно изменить расположение итоговых данных? CDan DAX: Программирование 5 29.08.2008 18:14
Импорт данных из шаблона Excel farlander DAX: Функционал 4 23.11.2006 11:43
Какой способ для связи Axapta с Excel вы предпочитаете? Gustav DAX: База знаний и проекты 37 09.06.2006 09:02

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:49.