Существует много способов разнообразить внешний вид таблицы в MS Excel. Например, иногда таблица может стать более наглядной, если в одной ячейке разместить сразу два значения, разделив ее по диагонали на две части. Одним из вариантов использования такой ячейки является шапка таблицы, в ячейке которой сразу два заголовка – для строк и для столбцов.
Давайте посмотрим, как MS Excel рисует диагональные границы ячейки.
Как вы видите, в ячейке A1 просто перечеркнутый текст, который не похож на нужный нам заголовок. Что бы "красиво" разместить сразу два значения в одной ячейке необходимо скомбинировать текст ячейки с пробелами, переводом строки (#10) и невидимым символом (#0). Как это сделать я продемонстрирую с использованием библиотеки TMS FlexCel.
program xlsDiagonalBorder; {$APPTYPE CONSOLE} uses System.SysUtils, VCL.FlexCel.Core, FlexCel.XlsAdapter, FlexCel.Render; procedure Test; var xls: TExcelFile; fmt: TFlxFormat; ApplyFormat: TFlxApplyFormat; begin xls := TXlsFile.Create(1, True); try // заполним заголовки строк и столбцов таблицы for var i := 1 to 5 do begin xls.SetCellValue(i + 1, 1, 'row ' + i.ToString); xls.SetCellValue(1, i + 1, 'col ' + i.ToString); end; // формат ячейки по умолчанию fmt := xls.GetDefaultFormat; // выравнивание по вертикали = по центру fmt.VAlignment := TVFlxAlignment.center; // выравнивание по горизонтали = по центру fmt.HAlignment := THFlxAlignment.center; // граница ячейки со всех сторон fmt.Borders.Left.Style := TFlxBorderStyle.Thin; fmt.Borders.Right.Style := TFlxBorderStyle.Thin; fmt.Borders.Top.Style := TFlxBorderStyle.Thin; fmt.Borders.Bottom.Style:= TFlxBorderStyle.Thin; // укажем, какие атрибуты формата будут применяться ApplyFormat := TFlxApplyFormat.Create; // отключим все атрибуты ApplyFormat.SetAllMembers(False); // включим границы ApplyFormat.Borders.SetAllMembers(True); // включим выравнивание ApplyFormat.VAlignment := True; ApplyFormat.HAlignment := True; ApplyFormat.Indent := True; // применим формат ко всем ячейкам таблицы xls.SetCellFormat(1, 1, 6, 6, fmt, ApplyFormat); // дополним формат диагональной границей fmt.Borders.Diagonal := TFlxOneBorder.Create(TFlxBorderStyle.Thin, TExcelColor.Automatic); // диагональная линия, идущая из левого верхнего угла в правый нижний fmt.Borders.DiagonalStyle := TFlxDiagonalBorder.DiagDown; // выравнивание по горизонтали = равномерно (отступ) fmt.HAlignment := THFlxAlignment.distributed; // что бы текст не прилипал к границе ячейки сделаем отступ fmt.Indent := 1; // применим формат к ячейке A1 xls.SetCellFormat(1, 1, 1, 1, fmt, ApplyFormat); // заполним ячейку A1 заголовками столбцов и строк xls.SetCellValue(1, 1, #0' col'#10'row '#0); // диагональная линия, идущая из левого нижнего угла в правый верхний fmt.Borders.DiagonalStyle := TFlxDiagonalBorder.DiagUp; // применим формат к ячейке D1 xls.SetCellFormat(1, 4, 6, 4, fmt, ApplyFormat); // заполним ячейку D1 заголовком xls.SetCellValue(1, 4, 'min '#0#10' max '); // заполним ячейки столбца D парными значениями for var iRow := 2 to 6 do xls.SetCellValue(iRow, 4, FormatFloat('0.0', iRow * 3.4) + ' '#0#10' ' + (iRow * 20).ToString + ' '); // перечеркнем правую нижнюю ячейку таблицы (F6) fmt.Borders.DiagonalStyle := TFlxDiagonalBorder.Both; // жирным диагональным крестом fmt.Borders.Diagonal.Style := TFlxBorderStyle.Medium; xls.SetCellFormat(6, 6, 6, 6, fmt, ApplyFormat); xls.Save('test.xlsx'); finally xls.Free; end; end; begin try Test; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.Все пояснения к тексту программы есть в комментариях. Поэтому обращу ваше внимание только на свойство Borders.DiagonalStyle (стиль диагональной границы ячейки), которое может принимать следующие значения (TFlxDiagonalBorder):
- None – без диагональной линии (по умолчанию);
- DiagDown – диагональная линия, идущая из левого верхнего угла в правый нижний;
- DiagUp – диагональная линия, идущая из левого нижнего угла в правый верхний;
- Both – обе диагональные линии (крест).
Комментариев нет:
Отправить комментарий