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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.05.2004, 15:49   #1  
Кирилл
Гость
 
n/a
;) Excel быстрый вывод
Вывод целой строкой много обсуждался, но готового рецепта я не нашел.
После экспериментов выкладываю работающий вариант (а то не по себе уже стало, что все спрашиваю, а пользы сообществу аксаптеров не приношу).
Это для еще более начинающих чем я.

PHP код:
Переменнные:
    
ComExcelDocument_RU     doc;
    
int  CurRow;
    array 
arr = new array (types::class);

Кусок кода с выводом таблицы:

CurRow с какой строки начинаем выводить
while select Таблица1
{
      
// Допустим хотим вывести 11 полей строчного типа
      
arr.value(1,COMVariant::createFromStr(Таблица1.Поле1));
      ...
      
arr.value(11,COMVariant::createFromStr(Таблица1.Поле11));
      
// в  COMVariant есть много всяких  createFrom, так что можно свои типы подобрать
      // или сначала в строку преобразовать

      // Сам вывод целой строки (с первой колонки ) 
      // этот кусок кода был в осуждении _http://www.axforum.info/forums/showthread.php?s=&threadid=1957 (только без пояснений)
     
doc.findRange(strfmt("A%1:",CurRow) +
     
COMExcelDocument_RU::numToNameCell(Arr.lastIndex(),CurRow)).value2
     
(COMVariant::createFromArray(Arr));

      
CurRow++;
//while select Таблица1 
У меня строк 300 секунд за 30 выводилось, а если с форматированием ячеек, то помедленнее.
Старый 28.05.2004, 17:26   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
спасибо.
не возражаете, если я перемещу в раздел проекты?
Старый 31.05.2004, 11:01   #3  
Кирилл
Гость
 
n/a
Ok
Ok
Старый 31.05.2004, 11:50   #4  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Если передавать в Excel только строковые значения, то можно сразу создать соответствующий массив:
PHP код:
Array arr = new array(types::String);
arr.value(1,"value1");
arr.value(2,"value2");
arr.value(3,"value3");
... 
Хочу ещё раз заметить, что такой способ передачи данных из Axapta в Excel имеет одно весьма существенное ограничение - передать данные можно только построчно (или по столбцам). Т.е нельзя заполнить сразу многострочный range. Такое ограничение накладывает реализация массивов в Axapta. Поэтому более эффективными являются способы предачи данных через буфер обмена (пример того как это делается выкладывался на форуме) или через XML.
Старый 01.06.2004, 13:10   #5  
Кирилл
Гость
 
n/a
Буфер обмена
Пробовал я выводить через буфер обмена, используя примеры с форума.
Но в них вывод производится вообще поячеечно, что медленне чем построчно.
Или я не те примеры смотрел?
Можно в этом обсуждении еще раз описать вывод многострочного range через буфер обмена?
Старый 01.06.2004, 15:07   #6  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Про буфер обмена писали например здесь:
http://www.axforum.info/forums/showt...4163#post24163

Но проще делать не через WinAPI, а использую TextBuffer.
Если кратко, то алгоритм такой:
Формируем текст, в котором значения в строке разделены табами (\t), а строки (\n).
Помещаем его в буфер обмена.
PHP код:
textBuffer = new TextBuffer();
textBuffer.appendText(text);
textBuffer.toClipboard(); 
В Excel выделяем ячейку, которая будет отправной точкой и вставляем данные методом pasteSpecial(1).
Старый 01.06.2004, 17:17   #7  
Кирилл
Гость
 
n/a
Попробовал
Действительно быстрее и быть не может.

А с форматированием разбирались?

Я в шаблоне делаю нужное форматирование на первой строке таблицы и на дополнительные строки его переношу копируя и вставляя целую строку.
Если выводить построчно это не страшно, т.к. и так процесс формирования не мгновенен,
а в свете использования вставки целых range, придется разбираться и с форматированием.
Вы в tlb файлах смотрите значения констант и форматы вызова функций Excel?
Старый 01.06.2004, 20:57   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
зачем?
значения между ячейками разделяются симовлом \t

так например
PHP код:
textBuffer = new TextBuffer();
textBuffer.appendText("1\\t2\\t3\\n4\\t5\\t6\\n7\\t8\\t9");
textBuffer.toClipboard(); 
вставит в эксель диапазон ячеек 3х3
Старый 02.06.2004, 12:09   #9  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
В Excel есть замечательный "пишущий плейер". Правда он не всегда генерит правильный код. Если отдебагерить полученный макрос, то можно и значения констант посмотреть...
Старый 02.06.2004, 12:43   #10  
Кирилл
Гость
 
n/a
Нашел ;-)
Я у себя открыл в Delphi файл Excel9.olb (Excel2000 типа), там есть и константы и методы с описанием параметров. Так что запись макросов + Type Library Editor - это сила.
Будем разбираться дальше ...
Старый 02.06.2004, 13:08   #11  
Dmitryus is offline
Dmitryus
Участник
Аватар для Dmitryus
 
38 / 10 (1) +
Регистрация: 23.10.2002
Адрес: Мос.обл. г.Королев
Информация к размышлению....
только что нашел что:

(набросок класса для формирования html в аттаче)

excel при вставке из буффера обмена отлично понимает html со всем фолрматированием
<html>
<body>
<table border=2>
<tr bgcolor=#ff0000><td colspan=2><b>Header </b></td></tr>
<tr bgcolor=#c7c7c7><td align=left>col1</td><td align=right>col2</td></tr>
</table>
</body>
</html>
Вложения
Тип файла: xpo chtml.xpo (2.7 Кб, 294 просмотров)
Старый 02.06.2004, 13:11   #12  
Dmitryus is offline
Dmitryus
Участник
Аватар для Dmitryus
 
38 / 10 (1) +
Регистрация: 23.10.2002
Адрес: Мос.обл. г.Королев
сорри в пред сообщении html обработался
это было :

PHP код:
<html>
<
body>
<
table border=2>
<
tr bgcolor=#ff0000><td colspan=2><b>Header :)/b></td></tr>
<tr bgcolor=#c7c7c7><td align=left>col1</td><td lign=right>col2</td></tr>
</table>
</
body>
</
html
Старый 02.06.2004, 13:52   #13  
Кирилл
Гость
 
n/a
Полезное обсуждение получается
html форматирование в коде аксапты прикольно наверное смотрится,
только трудоемкость выше получается

Вот пример как копировать форматирование из range в range:
здесь одна строка дублируется CurRow-1 раз вместе со всем форматированием.

XLSrange = COMCell.Range('A6:L6');
XLSrangeTo = COMCell.Range('A6:L'+int2str(CurRow-1));
XLSrange.select();
XLSrange.AutoFill(XLSrangeTo,0);

Т.е. создаем файл на основе шаблона, в котором одна строка отформатирована как следует и с помощью AutoFill распространяем форматирование на нужный range
Старый 02.06.2004, 15:08   #14  
Dmitryus is offline
Dmitryus
Участник
Аватар для Dmitryus
 
38 / 10 (1) +
Регистрация: 23.10.2002
Адрес: Мос.обл. г.Королев
Согласен.

Но работа с range сильно тормозит
а когда надо выводить отчеты с подитогами
соответственно разным объединением ячеек
по строкам,
HTML кажется более предпочтительным вариантом

а то что трудоемко это зря
вот пример кода

PHP код:
    while select  _dispatch  where        _dispatch.DispatchDate <= _to &&
                                          
_dispatch.DispatchDate >= _from
                        join _request  where _request
.RequestNumber == _dispatch.KRH000_RequestNumber &&
                                             
_request.COR_DestinationType == COR_DestinationType::Terminal
                        join _line     where _line
.RequestNumber == _request.RequestNumber &&
                                             
_line.LineNum == _dispatch.COR_RequestLineNum
    
{
    
'';
        if (
_transpart[1]) {
            
+= CHTML::Cell(_transpart[1]);
        } else {
            
+= CHTML::Cell(CHTML::FBold("Российская отгрузка"));
        }
        
+= CHTML::Cell(_request.ItemId);
        
+= CHTML::Cell(num2str(_dispatch.Qty,0,0,0,0));
        
+= CHTML::Cell(_dispatch.Dispatcher);
        
_rcontract RContractTable::find(RContractPartnerType::Cust,_request.RContractCode,_request.RContractAccount);
        
+= CHTML::Cell(_rcontract.COR_ContractWith);
        
s2 '';
        if (
export) {
            
s2 _sales.RcontractAccount;
        }
        
+= CHTML::Cell(s2);
        
HTMLstring += CHTML::Raw(s)
    }    

    if (
HTMLstring) {
        
_buffer.setText(CHTML::HTML(CHTML::BODY(CHTML::Table(HTMLstring))));
        
_doc.COR_insertText("A2",_buffer);
        
_doc.visible(true);
    } else {
        
Box::info("Отчет не содержит данных");
        
_doc.closeDocument();
    } 
Старый 03.06.2004, 12:23   #15  
online
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
В частности для облегчения вывода промежуточных итогов по строкам я сделал класс двумерного массива

http://www.axforum.info/forums/showt...&threadid=5263

Файл RTG_2DimArray (который очень не нравится mazzy)

Т.е. я предварительно заполняю этот массив, а потом одной командой заполняю весь лист EXCEL через буфер обмена. Потом остается только отформатировать лист, если необходимо.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вывод в Excel с терминала NNB DAX: Программирование 2 24.12.2008 18:17
Быстрый способ вывода данных в Excel с картинками Zlojbarsuk DAX: Программирование 10 23.10.2008 20:13
Маленькое замечание про вывод в Excel NNB DAX: Программирование 11 23.06.2008 16:23
Вывод в Excel в формате XML и ширина колонок gl00mie DAX: Программирование 1 30.10.2006 10:45
Вывод в Excel в определнный Worksheet... soin DAX: Программирование 1 22.10.2004 13:53

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

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

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