@falcon_sapsan
DevOps

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

Вот похожая тема stackoverflow.com/questions/17920308/phpexcel-grou...
там есть скриншоты отражающие суть проблемы.
При группировке строк содержащих изображение - картинка остается поверх свернутых строк.
Я видел подобные файлы сгенерированные из 1с - там картинка сварачивается.
Причем если создавать файл обычным способом - в libreoffice - если картику поместить в диапазон сворачиваемых строк - картинка скрывается (формат файла xlsx), а если делать тоже самое в MS Office - картинка остается поверх свернутых строк.
Как решить эту проблему?
  • Вопрос задан
  • 3500 просмотров
Пригласить эксперта
Ответы на вопрос 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 - судя по их форуму такой возможности нет.. есть ли платные решения, которые способны решить эту проблему?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы