PHPExcel и высота строк

autosoft

Новичок
Создаю с помощью PHPExcel документы и вот возникла проблема.

Есть следующий код:
PHP:
<?php

$text = "Первая строка\nВторая строка\nТретья строка";

$excel = new PHPExcel();

$sheet = $excel->getActiveSheet();

// A1
$sheet->getStyle('A1')->getAlignment()->setWrapText(true);
$sheet->setCellValue('A1', $text);

// A2
$sheet->getStyle('B1')->getAlignment()->setWrapText(true);
$sheet->setCellValue('B1', $text);

$sheet->getStyle('A2')->getAlignment()->setWrapText(true);
$sheet->setCellValue('A2', $text);

// A2:B2
$sheet->mergeCells('A2:B2');

$Writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
$Writer->save('file.xls');

?>
Проблема с высотой объединенной ячейки 'A2:B2'.
По идее высота должна определяться автоматически.
Но высота остается равной одной строке текста.
Как сделать что бы она рассчитывалась для трех строк, как в примере.

Хотелось бы получить что-то на подобии следующего (на примере HTML):
PHP:
<?php

$text = "Первая строка<br>Вторая строка<br>Третья строка";

echo '<table>';
echo '<tr>';

// A1
echo '<td>', $text, '</td>';

// A2
echo '<td>', $text, '</td>';

echo '</tr>';
echo '<tr>';

// A2:B2
echo '<td colspan=2>', $text, '</td>';

echo '</tr>';
echo '</table>';

?>
Нужно что бы и в браузере и в Excel выглядело одинаково.
Как это сделать c PHPExcel?
 

SergXP

Новичок
Нашли решение?
Должно работать.
PHP:
$text = "Первая строка\nВторая строка\nТретья строка";

$excel = new PHPExcel();

$sheet = $excel->getActiveSheet();

$row_id = 3;  // номер строки

$sheet->getRowDimension($row_id)->setRowHeight(100); // для третьей строки
 

autosoft

Новичок
Это немного не то.
Работать конечно будет, но мне заранее неизвестно сколько строк текста будет в каждой ячейке.
В примере я три привел, а вообще может быть любой текст.

Документ формируется динамически.
Поэтому задавать высоту директивно это конечно выход, но как её рассчитать точно?

Не понятно почему Excel определяет высоту первой строки автоматически, а со второй и третьей этого не происходит.
Интересует именно автоматический подбор.
В случае с HTML высота именно так и подбирается.
Как заставить Excel вести себя точно так же.
Нужно именно с помощью PHP.
Решения пока нет.
 

SergXP

Новичок
Прошу прощения что так долго не отвечал.

Вам же известно сколько строк, верно?

PHP:
$row_id = 3;  // номер строки
$sheet->getRowDimension($row_id)->setRowHeight(-1);   // должно сработать на height=auto
Для всех строк
PHP:
$excel = new PHPExcel();

$sheet = $excel->getActiveSheet();

foreach($sheet->getRowDimensions() as $rd) { 
    $rd->setRowHeight(-1); 
}
 

xandr99

Новичок
Если имеем ячейку, объединённую с помощью mergeCells(), то setRowHeight(-1) работать не будет. Можно, зная ширину этой ячейки, создать дубликат в этой же строке, но в одинарной ячейке и применить к ней авто подбор высоты, перенос текста и после этого скрыть. Подробнее можно прочитать здесь
 

autosoft

Новичок
Спасибо за ещё один ответ. В принципе так тоже можно наверное, но будет один недостаток (чуть ниже описал).
Собственно я уже эту задачку решил.
Правда по-своему. Рассчитываю размеры вручную с помощью imagettfbbox.
Получилось может и не очень элегантно, но работает.
Код могу сюда запостить.

У меня возникла другая трудность — объединенные ячейки включающие смежные строки.
Например A1:A2 и B2:B3.
При таком варианте мало рассчитать высоту и ширину объединенной ячейки, нужно ещё его "уточнить" после всех расчетов. Потому что её размеры могли измениться из-за размеров других ячеек использующих те же строки. Так что за два раза приходится это делать.

А вообще странно что всё это нужно рассчитывать вместо MS Excel, LO Calc и тому подобных штук.
 

Lok105

Новичок
Мое решение подбора высоты объединенных ячеек. То же возможно не самое красивое, но работает. Может кому поможет
я через strlen выясняю длину строки и и принудительно ее увеличиваю (в моем случае в ячейку в ряд умещаются 100 символов)

PHP:
if(strlen($str) <= 100){
   $heigt = 6;
}elseif(strlen($str) <= 200){
   $heigt = 12;
}
и т.д.
PHP:
$activeSheet->getRowDimension('1')->setRowHeight($heigt);
Я знаю, что у меня больше 4х строк не будет, поэтому для меня такое решение вполне даже ни чего
 

Eugen

Новичок
универсальный костыль на любое количество строк
PHP:
$str='Яндекс — поисковая система и интернет-портал. Поиск по интернету и другие сервисы: на yandex.ru есть карты и навигатор, транспорт...';
$height=15; // высота одной строки
$line_length=130; // длина одной строки, считаем и прописываем
$_height=$height*ceil(strlen($str)/$line_length);
$activeSheet->getRowDimension('1')->setRowHeight($_height);
 
Сверху