@falcon_sapsan
DevOps

Как сгруппировать строки c картинками в excel средствами PHP?

Вот похожая тема stackoverflow.com/questions/17920308/phpexcel-grou...
там есть скриншоты отражающие суть проблемы.
При группировке строк содержащих изображение - картинка остается поверх свернутых строк.
Я видел подобные файлы сгенерированные из 1с - там картинка сварачивается.
Причем если создавать файл обычным способом - в libreoffice - если картику поместить в диапазон сворачиваемых строк - картинка скрывается (формат файла xlsx), а если делать тоже самое в MS Office - картинка остается поверх свернутых строк.
Как решить эту проблему?
  • Вопрос задан
  • 3611 просмотров
Пригласить эксперта
Ответы на вопрос 4
@ligaliga
SilverSlice Спасибо за наводку! Не много скорректировал PHPExcel и все получилось, но при условии что картинка в пределах одной ячейки (мне нужно было для прайс-листа). Если картинка вылазит за пределы этой ячейки нужно будет еще думать.

В PHPExcel есть метод setResizeProportional, но он вообще ни где не задействован в PHPExcel/Writer/Excel2007/Drawing.php @version 1.7.9.

Добавил корректировки в функцию public function _writeDrawing у меня это 172 строчка:

Было :
$objWriter->startElement('xdr:oneCellAnchor');

Стало:

$aResizeProportional = $pDrawing->getResizeProportional();

			if ($aResizeProportional) {
				$objWriter->startElement('xdr:twoCellAnchor');
			}
			else {
				$objWriter->startElement('xdr:oneCellAnchor');
			}


И еще одна правка чуть ниже

Было :
// xdr:ext
					$objWriter->startElement('xdr:ext');
						$objWriter->writeAttribute('cx', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getWidth()));
						$objWriter->writeAttribute('cy', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getHeight()));
					$objWriter->endElement();


Стало

if ($aResizeProportional) {
					$objWriter->startElement('xdr:to');
						$objWriter->writeElement('xdr:col', $aCoordinates[0] - 1);
						$objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetX()) + PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getWidth()));
						$objWriter->writeElement('xdr:row', $aCoordinates[1] - 1);
						$objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetY()) + PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getHeight()));
					$objWriter->endElement();
				} else {
					// xdr:ext
					$objWriter->startElement('xdr:ext');
						$objWriter->writeAttribute('cx', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getWidth()));
						$objWriter->writeAttribute('cy', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getHeight()));
					$objWriter->endElement();
                }


Когда создаем объект добавляем это:

$objDrawing->setWidth($width);
$objDrawing->setHeight($height);
$objDrawing->setResizeProportional(true); 
$objDrawing->setWidthAndHeight($width,$height);
Ответ написан
@SilverSlice
Xlsx-файл - это zip-архив, распаковываете его средствами php и находите файл xl/drawings/drawing1.xml. В нем содержится информация о картинках на листе.

PHPExcel все картинки помещает в элементы oneCellAnchor (перемещать, но не изменять размеры), вам нужно поменять их на twoCellAnchor (перемещать и изменять объект вместе с ячейками). Обращайтесь к документации по Open Office XML за подробностями.

UPD. Реализовал этот алгоритм в библиотеке. Попробуйте, на моих тестовых данных все работает.
Ответ написан
Комментировать
AnnTHony
@AnnTHony
Интроверт
Нужно изменить свойства рисунка. По умолчанию подчеркнуто красным, нужно выставить отмеченное зеленой галочкой.
1229a4c16c9840d8a4754dac6db93b78.jpg
Ответ написан
Комментировать
@falcon_sapsan Автор вопроса
DevOps
Ну в самом экселе разобрались.. а можно ли программно установить это свойство для изображения? В PHPExcel - судя по их форуму такой возможности нет.. есть ли платные решения, которые способны решить эту проблему?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы