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

Пришлось недавно переделывать один документ в Excel, который формируется автоматически из программы написанной Delphi. Все бы ничего, но шаблон документа имеет объединенные ячейки в которые необходимо вписывать многострочный текст. И вот тут вылезла "особенность" Excel. Он не умеет автоматически подбирать высоту строки по многострочному тексту в объединенных ячейках. Приехали!!!
Время было позднее, а сроки давили на все части мозга. Погуглив тему нашел ряд примеров с громоздким кодом расчетов ширины-высоты-прочейлабуды. Но толкового ничего. Копаться в мегаскриптах не было ни сил ни желания. Да и код должен быть максимально быстрым. Документы формируются большими пачками и операция выполняется многократно, а всем известно что любой вывод Excel это не быстрая операция.
Итак решение "в лоб". Абсолютно не красивое но весьма эффективное:
- выбираем любой столбец листа Excel за пределами бланка документа и выставляем ширину столбца равной ширине объединенных ячеек (можно на глаз);
wb.Sheets[page_number].Range['DQ:DQ'].ColumnWidth := 27;
- формируем документ и при этом дублируем выводимый текст в эту колонку;
wb.Sheets[page].Range['DQ'+h].Value:=items[i].text;
- говорим "автоподобрать высоту";
wb.Sheets[page].Rows[h+':'+h].EntireRow.AutoFit;
- запоминаем высоту строки;
x:=wb.Sheets[page].Rows[h+':'+h].RowHeight;
- очищаем секретную ячейку;
wb.Sheets[page].Range['DQ'+h].Value:='';
- выставляем высоту строки;
wb.Sheets[page].Rows[h+':'+h].RowHeight := x;
- после формирования документа возвращаем ширину столбца в исходное состояние
wb.Sheets[page_number].Range['DQ:DQ'].ColumnWidth:=0.5;
Собственно все. Надеюсь не напугал. Код не вычищал, но никакой магии там нет. Все просто и тривиально.
Пользуйтесь...

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