| 
			
			 | 
		#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) В чем проблема здесь ?  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			а если передать туда 0 или 1, будет ошибка?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Все равно будет ошибка. 
		
		
		
		
		
		
		
	Сам разобрался. Надо было так X++: COM ComBorders, ComBorder; ComBorders = comCells.Borders(); ComBorder = comBorders.Item(7);  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
			
			
			на заметку
			 
			
			Недавно обратил внимание, что свойства LineStyle, ColorIndex, Weight есть не только у элементов (Item) коллекции Borders, но и у самой коллекции. Еще одна любезность со стороны Excel - из 8 границ по умолчанию "включены" все, за исключением диагональных. Таким образом, сплошная сетка на некоторый диапазон кладётся дух захватывающе просто: 
		
		
		
		
		
		
		
	на VBA: Код: Range("A1:H10").Borders.LineStyle = xlContinuous 'где константа xlContinuous = 1X++: ComCells = comWorkSheet.range("A1:H10"); // следующая строка покроет сеткой диапазон A1:H10 COM::createFromObject( ComCells.Borders() ).LineStyle(1);  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Proba (1), Eugene Murka (1), kpoxa (1). | |
| 
			
			 | 
		#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]]); | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 MCITP 
		
			
	 | 
	
	
	
		
		
		
		 
			
			У Вас 3-ка или 4 DAX ?  Если 4-ка, то для доступа к Excel не лучше ли и удобнее использовать .NET а не COM?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			У меня AX 3.0.  
		
		
		
		
		
		
		
	Опыта программирования на AX 4.0 у меня нет.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Если еще предполагаются и внутренние линии (11 и 12), то в данном частном случае можно попробовать сократиться до двух строчек кода  
		
		
		
		
		
		
		
	![]() X++: COM::createFromObject( _range.Borders() ).LineStyle( 1 ); COM::createFromObject( _range.Borders() ).Color( WinApi::RGB2int( 0, 0, 0 ) ); ![]() А для операции обрамления можно использовать метод Range.BorderAround  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Эти два макроопределения получается не используются?
		 
		
		
		
		
		
		
			
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#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 ); | 
| 
	
 | 
| 
			
			 | 
		#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("Ошибка такая-то"); } }  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Gustav
			 
 
			P.S. 2EAlex: Лихо-лихо Вы сообщения переставили. Теперь выглядит так, что я вроде как про 11 и 12 сам с собой поговорил  
		
	![]() А для операции обрамления можно использовать метод Range.BorderAround X++: _range.BorderAround( 1, 
                     COMVariant::createNoValue(), 
                     COMVariant::createNoValue(), 
                     WinAPI::RGB2int(0,0,0) ); | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вот блин, опять я на 1 мессаж припознился. 
		
		
		
		
		
		
			
		
		
		
		
	Ну, поздравляем Gustav со штукой  | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Спасибо-спасибо-спасибо!! 
		
		
		
			Ничего-ничего, у нас с собой было  
		 | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#17 | 
| 
			
			 совсем зелен 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Gustav 
		
		
		
		
		
		
		
	а какое значение надо указать в BorderAround что бы линия была жирная сплошная??? перебирал методом подбора так и не нашел...  | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 совсем зелен 
		
			
	 | 
	
	
	
		
		
		
		 
			
			извините туплю...все нашел..,  
		
		
		
		
		
		
		
	 )
		 | 
| 
	
 | 
| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#20 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Есть что-нибудь подобное для класса ComExcelDocument_RU?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 |