09.02.2008, 16:24 | #1 |
Участник
|
Форматирование на Excel
Добрый день ,
Такой вопрос возник: при выводе информации в Excel из AXAPTA хочу делать через COM чтобы ячейка A1 имела четки рамки. Пишу X++: Com ComBorder;
Com ComCells;
Com ComWorkSheet;
;
ComWorkSheet = ComExcelDocument.GetWorkSheet(1).
ComCells = comWorkSheet.range("A1");
ComBorder = comCells.Borders(7);
ComBorder.LineStyle(1);
comBorder.ColorIndex(0);
comBorder.TintAndShade(0);
comBorder.Weight(0); X++: ComBorder = comCells.Borders(7) В чем проблема здесь ? |
|
10.02.2008, 06:08 | #2 |
Участник
|
а если передать туда 0 или 1, будет ошибка?
|
|
10.02.2008, 11:59 | #3 |
Участник
|
Все равно будет ошибка.
Сам разобрался. Надо было так X++: COM ComBorders, ComBorder; ComBorders = comCells.Borders(); ComBorder = comBorders.Item(7); |
|
11.02.2008, 09:44 | #4 |
Moderator
|
на заметку
Недавно обратил внимание, что свойства LineStyle, ColorIndex, Weight есть не только у элементов (Item) коллекции Borders, но и у самой коллекции. Еще одна любезность со стороны Excel - из 8 границ по умолчанию "включены" все, за исключением диагональных. Таким образом, сплошная сетка на некоторый диапазон кладётся дух захватывающе просто:
на VBA: Код: Range("A1:H10").Borders.LineStyle = xlContinuous 'где константа xlContinuous = 1 X++: ComCells = comWorkSheet.range("A1:H10"); // следующая строка покроет сеткой диапазон A1:H10 COM::createFromObject( ComCells.Borders() ).LineStyle(1); |
|
|
За это сообщение автора поблагодарили: Proba (1), Eugene Murka (1), kpoxa (1). |
11.02.2008, 10:28 | #5 |
MCT
|
Так же можно использовать контейнер
X++: excelDocument.setBorder(ExcelDocument::bm(startCol,startRow,lastCol,lastRow), [[#xlEdgeBottom,#fmBorderStyleSingle, #xlMedium, 0], [#xlEdgeLeft, #fmBorderStyleSingle, #xlMedium, 0], [#xlEdgeRight, #fmBorderStyleSingle, #xlMedium, 0], [#xlEdgeTop, #fmBorderStyleSingle, #xlMedium, 0]]); |
|
11.02.2008, 10:54 | #6 |
Участник
|
|
|
11.02.2008, 11:24 | #7 |
MCITP
|
У Вас 3-ка или 4 DAX ? Если 4-ка, то для доступа к Excel не лучше ли и удобнее использовать .NET а не COM?
|
|
11.02.2008, 15:34 | #8 |
Участник
|
У меня AX 3.0.
Опыта программирования на AX 4.0 у меня нет. |
|
11.02.2008, 16:49 | #9 |
Moderator
|
Если еще предполагаются и внутренние линии (11 и 12), то в данном частном случае можно попробовать сократиться до двух строчек кода
X++: COM::createFromObject( _range.Borders() ).LineStyle( 1 ); COM::createFromObject( _range.Borders() ).Color( WinApi::RGB2int( 0, 0, 0 ) ); А для операции обрамления можно использовать метод Range.BorderAround |
|
11.02.2008, 16:50 | #10 |
Участник
|
Эти два макроопределения получается не используются?
|
|
11.02.2008, 16:51 | #11 |
Участник
|
Мы делаем примерно так:
X++: #define.edgeBottom(9)
#define.edgeLeft(7)
#define.edgeRight(10)
#define.edgeTop(8)
#define.insideHorizontal(12)
#define.insideVertical(11)
COM borders;
COM border;
;
// Обрамить все выделенное
borders = _range.borders();
color = WinApi::RGB2int( 0, 0, 0 );
border = borders.item( #edgeTop );
border.color( color );
border.lineStyle( 1 );
border = borders.item( #edgeBottom );
border.color( color );
border.lineStyle( 1 );
border = borders.item( #edgeLeft );
border.color( color );
border.lineStyle( 1 );
border = borders.item( #edgeRight );
border.color( color );
border.lineStyle( 1 ); |
|
11.02.2008, 17:39 | #12 |
Участник
|
Когда-то написал вот такой код - пытался учесть выделение "внутри" по вертикали/горизонтали. Вроде работает
X++: void setRangeBorder(BookMark _bookMark, int _lineStyle = 1, // xlContinuous int _lineWeight = 1, // xlContinuous boolean _inside = False, int _workSheetNumber = 1, container _lines2Draw = [true, true, true, true]) { COM comRange, comBorders, comBorder, comWorkSheet; TextBuffer textBuffer; int fromRow; int toRow; ; try { comWorkSheet = this.getWorkSheet(_workSheetNumber); comRange = comWorkSheet.Range(_bookMark); if (comRange) { comBorders = comRange.Borders(); if (conPeek(_lines2Draw, 1)) { comBorder = comBorders.Item(7); // left comBorder.Weight(_lineWeight); comBorder.LineStyle(_lineStyle); } if (conPeek(_lines2Draw, 2)) { comBorder = comBorders.Item(8); // top comBorder.Weight(_lineWeight); comBorder.LineStyle(_lineStyle); } if (conPeek(_lines2Draw, 3)) { comBorder = comBorders.Item(9); // bottom comBorder.Weight(_lineWeight); comBorder.LineStyle(_lineStyle); } if (conPeek(_lines2Draw, 4)) { comBorder = comBorders.Item(10); // right comBorder.Weight(_lineWeight); comBorder.LineStyle(_lineStyle); } if (_inside) { textBuffer = new TextBuffer(); textBuffer.setText(_bookMark); textBuffer.find('\\:'); if (textBuffer.matchPos() > 0 && textBuffer.matchLen() == 1) { textBuffer.find(@":a+"); fromRow = ZCH_ComExcelExportADO::colName2Num(textBuffer.subStr(textBuffer.matchPos(), textBuffer.matchLen())); textBuffer.find(@":a+", textBuffer.matchPos() + textBuffer.matchLen()); toRow = ZCH_ComExcelExportADO::colName2Num(textBuffer.subStr(textBuffer.matchPos(), textBuffer.matchLen())); if (fromRow < toRow) { comBorder = comBorders.Item(11); // inside vertical comBorder.Weight(_lineWeight); comBorder.LineStyle(_lineStyle); } textBuffer.find(@":d+"); fromRow = str2int(textBuffer.subStr(textBuffer.matchPos(), textBuffer.matchLen())); textBuffer.find(@":d+", textBuffer.matchPos() + textBuffer.matchLen()); toRow = str2int(textBuffer.subStr(textBuffer.matchPos(), textBuffer.matchLen())); if (fromRow < toRow) { comBorder = comBorders.Item(12); // inside horizontal comBorder.Weight(_lineWeight); comBorder.LineStyle(_lineStyle); } } } } } catch (exception::Error) { this.throwError("Ошибка такая-то"); } } |
|
11.02.2008, 17:57 | #13 |
Moderator
|
Цитата:
Сообщение от Gustav
P.S. 2EAlex: Лихо-лихо Вы сообщения переставили. Теперь выглядит так, что я вроде как про 11 и 12 сам с собой поговорил
А для операции обрамления можно использовать метод Range.BorderAround X++: _range.BorderAround( 1, COMVariant::createNoValue(), COMVariant::createNoValue(), WinAPI::RGB2int(0,0,0) ); |
|
11.02.2008, 18:22 | #14 |
Участник
|
Вот блин, опять я на 1 мессаж припознился.
Ну, поздравляем Gustav со штукой |
|
12.02.2008, 10:25 | #15 |
Moderator
|
Спасибо-спасибо-спасибо!!
Ничего-ничего, у нас с собой было |
|
09.12.2008, 17:11 | #16 |
Участник
|
|
|
11.12.2008, 12:38 | #17 |
совсем зелен
|
Gustav
а какое значение надо указать в BorderAround что бы линия была жирная сплошная??? перебирал методом подбора так и не нашел... |
|
11.12.2008, 13:12 | #18 |
совсем зелен
|
извините туплю...все нашел.., )
|
|
09.06.2011, 12:41 | #19 |
MS Dynamics AX 2012 R3
|
А ещё можно наложить сетку вот так:
X++: // наложение авто сетки на всю таблицу в генерируемом(не шаблон) отчёте в MS Excel, где 3 - начальная координата excelDocument.Borders(strfmt("A3:G%1",3 + countLoops)); X++: void Borders(MSOfficeBookMark_RU bookMark, int _workSheet = 1) { Com MultiRange; Com ComApplication; Com Borders; if (m_comDocument) { comApplication = m_comDocument.application(); if (comApplication) { //накладываем сетку на ячейки MultiRange = this.findRange(bookMark, _workSheet); Borders = MultiRange.Borders(); Borders.LineStyle(1); } } }
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов Последний раз редактировалось ZornFire; 09.06.2011 в 13:06. |
|
01.06.2012, 15:40 | #20 |
Участник
|
Есть что-нибудь подобное для класса ComExcelDocument_RU?
|
|