21 февраля 2019

Автоподбор высоты строки MS Excel после объединения ячеек

    Шел 2019-й год... а MS Excel по-прежнему не научился рассчитывать высоту строки если в ней есть объединённые ячейки... И метод Range.AutoFit, который "Changes the height of the rows in the range to achieve the best fit", нас не спасёт.

Например, объединим ячейки A1 и B1 и поместим в них многострочный текст:
Var
  ea: TExcelApplication;
  ovRange: OleVariant;
begin
  ...
  ovRange := ea.Range['A1', 'B1'];
  ovRange.Merge;
  ovRange.Value := '1'#13#10'2'#13#10'3'#13#10'4'#13#10'5';
  ovRange.EntireRow.AutoFit;

Как видно на картинке, магии автоматизации не произошло - Excel ни на миллиметр не увеличил высоту строки. Даже вызов метода AutoFit не дал нам обещанный "best fit". Значит мы пойдем другим путем - рассчитаем высоту строки через временную ячейку:
Var
  ea: TExcelApplication;
  ovRange, ovTemp: OleVariant;
begin
  ...
  ovRange := ea.Range['A1', 'B1'];
  ovRange.Merge;
  ovRange.Value := '1'#13#10'2'#13#10'3'#13#10'4'#13#10'5';

  ovTemp := ea.Range['A15', 'A15'];
  // копируем форматирование
  ovTemp.Font.Name := ovRange.Font.Name;
  ovTemp.Font.Size := ovRange.Font.Size;
  ovTemp.Font.Bold := ovRange.Font.Bold;
  // копируем значение
  ovTemp.Value := ovRange.Value;
  //ovTemp.EntireRow.AutoFit;
  // копируем высоту
  ovRange.RowHeight := ovTemp.RowHeight;
  // убираем за собой
  ovTemp.EntireRow.Delete;
Вызывать EntireRow.AutoFit для ovTemp нет необходимости - Excel растянет строку по высоте текста сам:
P.S. Для подобных расчетов я добавлял в отчет временный лист, который удалял перед его сохранением.

Комментариев нет:

Отправить комментарий