AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 28.03.2007, 14:19   #1  
Protey is offline
Protey
Участник
 
143 / 15 (1) ++
Join Date: 22.09.2005
Location: Сургут
Вопрос по ComExcelDocument_RU
Можно из аксапты изменять шрифт, делать его жирным или курсивом, центрировать по ячейке?
Old 28.03.2007, 14:29   #2  
ice is offline
ice
Участник
ice's Avatar
Лучший по профессии 2014
 
1,821 / 402 (17) +++++++
Join Date: 23.03.2006
можно, но нужно доработать класс
Old 28.03.2007, 14:30   #3  
LEX is offline
LEX
NavAx
LEX's Avatar
NavAx Club
 
33 / 12 (1) ++
Join Date: 06.04.2004
Можно!
вот пример метода для изменения шрифта:
X++:
void setFontSize(MSOfficeBookMark_RU _bookMark, int _fontNumber)
{
    COM     comRange;
    COM     comFont;
    ;

    comRange = this.findRange(_bookMark);
    if (comRange)
    {
        comFont = comRange.Font();
        comFont.Size(_fontNumber);
    }
}
Old 28.03.2007, 14:40   #4  
Ashir is offline
Ashir
Участник
 
45 / 22 (1) +++
Join Date: 27.10.2005
X++:
public void setFontFormatInRange(   MSOfficeBookMark_RU _bookMark,
                                    int                 _workSheet  = 1,
                                    boolean             _Bold       = false,
                                    boolean             _Italic     = false,
                                    boolean             _Underline  = false )
{
    #define.xlUnderlineStyleSingle(2)
    #define.xlUnderlineStyleNone(-4142)
    COM Rng, Font;

    Rng  = this.findRange(_bookMark, _workSheet);
    Font = Rng.font();
    Font.Bold(_Bold);
    Font.Italic(_Italic);
    if (_Underline)
        Font.Underline(#xlUnderlineStyleSingle);
    else
        Font.Underline(#xlUnderlineStyleNone);
}
Old 28.03.2007, 15:11   #5  
Protey is offline
Protey
Участник
 
143 / 15 (1) ++
Join Date: 22.09.2005
Location: Сургут
А выравнивание в ячейке (слева, справа, в центре) никак?
Old 28.03.2007, 15:37   #6  
LEX is offline
LEX
NavAx
LEX's Avatar
NavAx Club
 
33 / 12 (1) ++
Join Date: 06.04.2004
X++:
void setHorAlignment(MSOfficeBookMark_RU _bookMark, int    _hAlign)
{
    COM     comRange;
    ;

    comRange = this.findRange(_bookMark);
    if (comRange)
    {
        comRange.horizontalAlignment(_hAlign);
    }
}
Old 28.03.2007, 15:42   #7  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 19
Quote:
Originally Posted by Protey View Post
А выравнивание в ячейке (слева, справа, в центре) никак?
Найдите у себя на компе поиском хелп-файл vbaxl*.chm (вместо звездочки будет конкретная версия: 9 или 10 или 11). В этом файле найдите поиском и почитайте про свойства: VerticalAlignment и HorizontalAlignment. Далее воплотите их в X++ (по аналогии с тем, как вам уже рассказали про фонты).

P.S. О! Вам уже и выравнивание воплотили. Но почитать хелп все равно рекомендую для творческого осмысления.
Old 29.03.2007, 13:34   #8  
Protey is offline
Protey
Участник
 
143 / 15 (1) ++
Join Date: 22.09.2005
Location: Сургут
Всем спасибо, а еще такой вопрос, такого я не нашел, можно сделать внешние границы ячейки?
Old 29.03.2007, 13:40   #9  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 19
Quote:
Originally Posted by Protey View Post
а еще такой вопрос, такого я не нашел, можно сделать внешние границы ячейки?
А где вы ищите? В хелп-файле, о котором я говорил, ищите слово Border и всё, что с ним связано.
Сделайте операцию, которую хотите, в Excel'е вручную и запишите макрорекордером. Посмотрите как это выглядит на VBA и всё будет ясно, какие ключевые слова нужно будет искать.

99.9 % того, что вы можете сделать в Excel вручную, вы можете сделать и из Аксапты программно.

Много и хорошо об Excel для программистов
Old 29.03.2007, 14:00   #10  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Более того, большую часть из того, что вам может понадобиться, кто - нибудь да уже написал.
Соответственно, вы можете это найти на форуме

Как вставить значение из Аксапты в Excel
Old 29.03.2007, 14:34   #11  
Ashir is offline
Ashir
Участник
 
45 / 22 (1) +++
Join Date: 27.10.2005
Quote:
можно сделать внешние границы ячейки
X++:
void setRangeBorder(COM _comRange, int _type  = 1)
{
    Com com;
    ;

    com = _comRange.Borders();
    com.LineStyle(_type);
}
Old 29.03.2007, 14:36   #12  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 19
А еще важен здравый баланс затрачиваемых усилий. Жирную левую границу ячейки, конечно, можно нарисовать и из Аксапты (как и из Дельфи, например). А можно и из Аксапты заставить Дельфи нарисовать границу ячейки в Excel

Всегда стоит подумать, не существенно ли проще, например, заготовить вручную в Excel соответствующий шаблон с крутым форматированием, а потом многократно его использовать, выводя в него из Аксапты только лишь данные. Можно даже использовать исходный код VBA, записанный макрорекордером в родном Excel и вызываемый из Аксапты для исполнения в Excel же, т.е. без "перевода" кода с языка VBA на язык X++.

Позволю себе немножко поразглагольствовать на любимую тему. Форматирование таблицы Excel из Аксапты - это как бы задача второго эшелона, а первоочередное - собственно вывод данных. Т.е. когда данные отчета находятся уже в Excel, почему бы не поручить самому Excel по-привычному "по-родному" с ними разобраться. Причем, вряд ли Excel'ю потребуются еще какие-нибудь данные от Аксапты во время форматирования (чего не скажешь об Аксапте, которую для комфортной работы разработчика необходимо, например, "набить" макросами эксельных констант). В теме "Axapta программирует Excel на VBA" у меня была такая цитата:
Quote:
Originally Posted by Gustav View Post
...форматирование выводимого списка используется исключительно для того, чтобы продемонстрировать ЧТО-ЛИБО, выполняемое на коде VBA (а не классом Axapta). С таким же успехом в рамках примера можно было бы построить, например, в Excel развесистую сводную таблицу. Средствами самого же Excel, причем дальнейший перевод VBA-кода в код X++ не требуется
Изящно подобный подход демонстрирует AndyD здесь: Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент). Т.е. я-то там (в "Axapta...на VBA") по неопытности тогдашней навернул какие-то таблицы для хранения кода (мечтал о том, что разработчики будут обмениваться наработками в таком формате ), а AndyD взял целую процедуру и в один стринг ее поместил. Вот фрагмент его кода, который я имею в виду:
X++:
    s = strfmt( "sub OpenDemo()\n" +
                "    Workbooks.OpenText Filename:=\"%1\", Origin:=1251, StartRow:= 1, _\n" +
                "        DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Tab:=True, _\n" +
                "        %2TrailingMinusNumbers:=True, _\n" +
                "        DecimalSeparator:=\",\", ThousandsSeparator:=\" \"\n" +
                "End Sub", #fileName, getFields());
Т.е. взята VBA-шная процедура, записанная в Excel макрорекордером, подчищена и вставлена стрингом в код X++. Затраты времени - минимальные. И фактически используются естественные инструменты той среды "обитания", где происходит выполнение задачи.
Old 29.03.2007, 15:49   #13  
belugin is offline
belugin
Участник
belugin's Avatar
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Join Date: 16.01.2004
Blog Entries: 5
Известен ли народу способ копирования шаблонных областей, не портящий буфер обмена?
Old 29.03.2007, 16:25   #14  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Join Date: 20.08.2005
Можно воспользоваться автозаполнением

Range.AutoFill(RangeDest, xlFillFormats);

xlFillFormats = 3

PS Только для связанных областей
Range("A1:C1") -> RangeDest("A1:C100")
__________________
Axapta v.3.0 sp5 kr2

Last edited by AndyD; 29.03.2007 at 16:32.
Old 30.03.2007, 20:33   #15  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 19
Quote:
Originally Posted by belugin View Post
Известен ли народу способ копирования шаблонных областей, не портящий буфер обмена?
Если речь идёт именно о копировании с целью распространения формата, то можно еще попробовать использовать стили, созданные при помощи команды "Стиль" из меню "Формат" Excel.

В прилагаемом шаблоне Book5.xlt определен форматный стиль по имени "MyCoolStyle", включающий в себя голубую заливку ячейки, а также рамку, состоящую из трёх тонких границ (сверху, слева, снизу) и одной толстой справа. Стиль был определен вручную при помощи команды меню Excel "Format \ Style" (стили сохраняются в workbook'ах). Далее при создании отчета на базе шаблона Book5.xlt стиль можно применить к желаемой ячейке или диапазону ячеек:
X++:
static void Job_TestExcelStyle(Args _args)
{
    COM xlApp;      // Excel.Application
    COM wbks, wbk;  // Workbooks, Workbook
    COM rng;        // Range
    ;

    xlApp = new COM('Excel.Application');
    xlApp.Visible(true);

    wbks = xlApp.Workbooks();
    wbk  = wbks.Open(@'C:\Book5.xlt');

    rng  = xlApp.Range('B2:H20');
    rng.Style('MyCoolStyle'); 
    // и всё зальётся голубым с правыми толстыми границами :-)
}
Для демонстрации эффекта вручную (без Аксапты) можно открыть файл в архиве, выделить диапазон ячеек Excel и выполнить команду меню Формат \ Стиль \ выбрать Имя стиля: MyCoolStyle \ OK
Attached Files
File Type: zip Book5.zip (1.9 KB, 82 views)
Old 05.04.2007, 10:34   #16  
Protey is offline
Protey
Участник
 
143 / 15 (1) ++
Join Date: 22.09.2005
Location: Сургут
Quote:
Originally Posted by Ashir View Post
X++:
void setRangeBorder(COM _comRange, int _type  = 1)
{
    Com com;
    ;

    com = _comRange.Borders();
    com.LineStyle(_type);
}
где то я туплю, а как при вызове этого метода задать ему диапазон?
чета не получается...
Old 05.04.2007, 10:39   #17  
Roman777 is offline
Roman777
NavAx
Roman777's Avatar
NavAx Club
 
320 / 64 (3) ++++
Join Date: 10.02.2005
Location: г. Москва
Вот так:
X++:
XLSrange        = this.findRange(_bookMark);
где _bookMark имеет формат ячеек (например "A1:C15")
Old 05.04.2007, 10:39   #18  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Это COM
X++:
    COM rng;        // Range
//more lines go here ...
    rng  = xlApp.Range('B2:H20');
  //Вот это и есть этот самый _comRange
Old 05.04.2007, 10:46   #19  
Protey is offline
Protey
Участник
 
143 / 15 (1) ++
Join Date: 22.09.2005
Location: Сургут
Quote:
Originally Posted by kashperuk View Post
Это COM
X++:
    COM rng;        // Range
//more lines go here ...
    rng  = xlApp.Range('B2:H20');
  //Вот это и есть этот самый _comRange
у меня шаблон объявляется так
excelDocument = new ComExcelDocument_RU();
он не понимает такого, или я чета не понимаю
Old 05.04.2007, 10:49   #20  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Скорее второе.

Напишите метод в классе ComExcelDocument_RU

X++:
void setRangeBorder(MSOfficeBookMark_RU bookMark, int _type  = 1, int _worksheet = 1)
{
    Com com;
    COM comRange;
    ;
    comRange = this.findRange(bookMark, _worksheet);
    com = comRange.Borders();
    com.LineStyle(_type);
}
Tags
excel

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Вопрос по модулю Расчеты с персоналом. Выплата заработной платы. Keks DAX: Функционал 7 28.12.2009 10:31
Вопрос по созданию отчета asd1274 DAX: Программирование 6 05.12.2008 21:44
Вопрос по Проектам PSA DAX: Функционал 35 19.01.2007 22:26
Еще вопрос про покрытие по аналитикам в Сводном планировании rt2 DAX: Функционал 3 24.03.2006 18:56
расчеты с персоналом. НДФЛ. вопрос чайника shumelka DAX: Функционал 2 25.03.2004 11:36

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 10:46.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.