PhpSpreadsheet: распределить строку по ячейкам

Есть excel таблица и некоторая строка, нужно определить поместится ли она в первую ячейку (верхняя желтая) и если нет, то разбить ее по строчкам ниже. Таких строчек и ячеек несколько. Учитывая, что ширина символов разная, вопрос - как это можно реализовать?

Пример ячеек


Ответы (1 шт):

Автор решения: WGPavell

Пришлось прибегнуть к костылю, но все же кое-как удалось сделать задуманное. Для определения ширины текста я использовал функцию imagettfbbox со шрифтом и размером ячейки. Для каждой такой ячейки определил в константах ее размер в пикселях (пришлось прогонять рандомный текст, который полностью заполняет ячейку через функцию выше). Далее сравниваю ширину текста с константой и если она больше, то дроблю текст до тех пор, пока ширина не станет меньше. Далее вписываю текст в ячейку и проворачиваю то же самое с оставшимся текстом. Вроде работает.

for ($i = 0; $i <= count($cell); $i++) {
    $stringPixelWidth = imagettfbbox(11, 0, $this->getParameter('kernel.project_dir') . self::FONT_FILE, $neededString)[2];
    if ($i < count($cell) && $stringPixelWidth > $cell[$i]['width']) {
        $words = explode(" ", $neededString);
        $lastWords = [];
        do {
            $lastWord = array_pop($words);
            array_unshift($lastWords, $lastWord);
            $stringPixelWidth = imagettfbbox(11, 0, $this->getParameter('kernel.project_dir') . self::FONT_FILE, implode(" ", $words))[2];
        } while ($stringPixelWidth > $cell[$i]['width']);
        $clonedActSheet->setCellValue($cell[$i]['cell'], implode(" ", $words));
        $neededString = implode(" ", $lastWords);
    } else {
        $clonedActSheet->setCellValue($cell[$i]['cell'], $neededString);
        break;
    }
}
→ Ссылка