PHPExcell и JPEG: растягивание изображений

Borman

Новичок
Вставляю изображение, и несмотря на запрет изменения пропорций и принудительного указания размеров
$iDrowing->setResizeProportional(false);
$iDrowing->setWidth(150);
$iDrowing->setHeight(226);

изображение всё равно растягивается!

Как сделать так, чтобы картинка вставлялась так как есть, то есть без растягивания?

Что не так делаю? Вот код:

Код:
set_include_path(get_include_path() . PATH_SEPARATOR .'Classes/'); 
include_once 'PHPExcel.php'; 
$pExcel = new PHPExcel(); 
$pExcel->setActiveSheetIndex(0); 
$aSheet = $pExcel->getActiveSheet(); 
$aSheet->setTitle('Ïåðâûé ëèñò'); 

$iDrowing = new PHPExcel_Worksheet_Drawing(); 
$iDrowing->setPath('img.jpg'); 
$iDrowing->setCoordinates('A1'); 
$iDrowing->setResizeProportional(false); 
$iDrowing->setWidth(150); 
$iDrowing->setHeight(226); 
$iDrowing->setWorksheet($pExcel->getActiveSheet()); 

include("PHPExcel/Writer/Excel5.php"); 
$objWriter = new PHPExcel_Writer_Excel5($pExcel); 
$objWriter->save('img.xls');
 
Вот в таком слегка измененном формате все должно работать.
Советую проверить версию PHPExcel и PHP.
У меня PHPExcel - 1.7.4 и PHP 5.3.5.

Writer подключать отдельно необязательно, достаточно просто его создать.

PHP:
	include_once ('../classes/PHPExcel.php'); 
	$pExcel = new PHPExcel(); 
	$pExcel->setActiveSheetIndex(0); 
	$aSheet = $pExcel->getActiveSheet(); 
	$aSheet->setTitle('test_file'); 
	
	$iDrowing = new PHPExcel_Worksheet_Drawing(); 
	$iDrowing->setPath('../img.jpg'); 
	$iDrowing->setCoordinates('A1'); 
	$iDrowing->setResizeProportional(false); 
	$iDrowing->setWidth(100); 
	$iDrowing->setHeight(100); 
	$iDrowing->setWorksheet($pExcel->getActiveSheet()); 
	
	$objWriter = PHPExcel_IOFactory::createWriter($pExcel, 'Excel5');	
	$objWriter->save('img.xls');
 

Borman

Новичок
Всё равно растягивается :(
Сплющивается по высоте, растягивается по ширине.

Версии:
PHPExcel version 1.7.6, 2011-02-27
PHP Version 5.3.1
OpenOffice.org 3.2.1

Здесь создаваемый .xls http://files.mail.ru/W5C9RK
Здесь файл тестового изображения http://files.mail.ru/W5C9RK?t=1

Собственно код
PHP:
    $pExcel = new PHPExcel(); 
    $pExcel->setActiveSheetIndex(0); 
    $aSheet = $pExcel->getActiveSheet(); 
    $aSheet->setTitle('test_file'); 
    
    $iDrowing = new PHPExcel_Worksheet_Drawing(); 
    $iDrowing->setPath('img1.jpg'); 
    $iDrowing->setCoordinates('A1'); 
    $iDrowing->setResizeProportional(false); 
    $iDrowing->setWidth(150); 
    $iDrowing->setHeight(200); 
    $iDrowing->setWorksheet($pExcel->getActiveSheet());
	
    $objWriter = PHPExcel_IOFactory::createWriter($pExcel, 'Excel5');    
    $objWriter->save('img.xls');
 
Странно, странно.
Кстати в Excel 2010 всё отображается нормально. Возможно, проблема в OpenOffice, но разработчики на своем форуме вроде с этим не сталкивались.
Давайте попробуем перейти в формат 2007 офиса и сгенерировать файл xlsx.

PHP:
    $objWriter = PHPExcel_IOFactory::createWriter($pExcel, 'Excel2007');    
    $objWriter->save('img.xlsx');
 

Borman

Новичок
Отлично! В формате 2007-го работает. Достаточно setResizeProportional(false); без установки размеров - не растягиваются!
> Максим Шугуров - спасибо!

Однако остаётся ещё одна непонятка: изображения не ложаться в ячейку, накладываются друг на друга.
Даже setAutoSize(true); не помогает.

Вот код с 3-мя изображениями:

PHP:
for($i=1;$i<=3;$i++)
	{
    $iDrowing = new PHPExcel_Worksheet_Drawing(); 
    $iDrowing->setPath('img'.$i.'.jpg'); 
    $iDrowing->setCoordinates('A'.$i); 
    $iDrowing->setResizeProportional(false);
    $iDrowing->setWorksheet($pExcel->getActiveSheet());
	}
	
$aSheet->getColumnDimension('A')->setAutoSize(true);

$objWriter = PHPExcel_IOFactory::createWriter($pExcel, 'Excel2007');    
$objWriter->save('img.xlsx');
 
Отлично! В формате 2007-го работает. Достаточно setResizeProportional(false); без установки размеров - не растягиваются!

Однако остаётся ещё одна непонятка: изображения не ложаться в ячейку, накладываются друг на друга.
Даже setAutoSize(true); не помогает.

Вот код с 3-мя изображениями:

PHP:
for($i=1;$i<=3;$i++)
	{
    $iDrowing = new PHPExcel_Worksheet_Drawing(); 
    $iDrowing->setPath('img'.$i.'.jpg'); 
    $iDrowing->setCoordinates('A'.$i); 
    $iDrowing->setResizeProportional(false);
    $iDrowing->setWorksheet($pExcel->getActiveSheet());
	}
	
$aSheet->getColumnDimension('A')->setAutoSize(true);

$objWriter = PHPExcel_IOFactory::createWriter($pExcel, 'Excel2007');    
$objWriter->save('img.xlsx');
Насколько я понял ячейка при вставке картинки - это только способ определить место, где вставлять. А автоширина работает только для текста, да и работает не самым лучшим образом.
Можно немного схитрить: вычислить размеры картинки и с учетом различий в единицах измерения выставить ширину колонки.
У меня получилось так:
PHP:
	$aSheet->getColumnDimension('A')->setWidth($iDrowing->getWidth()/6.87);
В Вашем случае, когда картинок много нужно сначала вычислить ширина какой будет наибольшей и потом выставлять ширину столбца.
 

Borman

Новичок
С шириной понятно, проще на этапе подготовке изображений подогнать все картинки по ширине.

Непонятно другое: как быть с высотой изобржения и подготовкой ячейки под высоту изображения?
 

Borman

Новичок
Спасибо! Пока всё получается.

Вот только не могу понять: число 6.87 откуда взялось?
 
Спасибо! Пока всё получается.

Вот только не могу понять: число 6.87 откуда взялось?
Грубый перебор. Более чистый коэффициент можно узнать если определить в каких единицах измеряется ширина и высота столбцов и поставить их в соотношение с пикселями.
 
Сверху