Temat: PHPExcel i Zend2 Controller
Kamil S.:
Witam,
Staram się zintegrowac PHPExcel z Zend2. Wprawdzie udało mi się to w kwestii zapisywania pliku na dysk, ale nie wiem jak (still beginner in zend) udostepnić plik do sciagniecia bezposrednio po kliknieciu linku. Szczegolowo temat opisalem na SO:
http://stackoverflow.com/questions/16551375/phpexcel-i...
Czy ktos probowal polaczyc oba te narzedzia? Wolalbym nie robic "workaroundu" zapisujac najpierw plik na dysk, a potem go udostepnic do sciagniecia.
Jest to możliwe ale nie będzie proste ponieważ PHPExcel nie zapewnia z automatu mechanizmu zapisu dokumentu do pamięci i nie ma to nic wspólnego z Zend.
Najprostszy sposób to odziedziczyć po dowolnej klasie Writer, która zapisuje obiekt PHPExcel do pliku określonego formatu jaki cię interesuje i przewalić metodę save() 1:1 poprawiając tylko te fragmenty, które odpowiadają za wypluwanie danych do pliku i skierować je do pamięci.
Tylko jak sobie zobaczysz na implementację metody save() w dowolnym Writer to ci się IMHO odechce i wybierzesz drogę przez plik na dysku ;)
EDYTA 1=============================
Tak mnie zaciekawił problem, że go rozwiązałem :)
Daj maila na priv to dostaniesz gotową klasę oddającą dokument do pamięci.
Narazie tylko postać HTML na wzór.
EDYTA 2=================================
Rozwiązanie "na wykop" to zapisanie pliku tymczasowego na dysk, wysłanie do klienta i usunięcie pliku.
$objPHPExcel = new PHPExcel();
$objPHPExcel->getActiveSheet()->setCellValue( 'B8', 'Some value' );
$objWriter = \PHPExcel_IOFactory::createWriter( $objPHPExcel, 'Excel5' );
$objWriter->save('./test.xls');
$ret = fopen('./test.xls', "rb");
$buffer = fread($ret, filesize('./test.xls'));
fclose($ret);
$response = $this->getEvent()->getResponse();
$response->getHeaders()->clearHeaders()->addHeaders( array(
'Pragma' => 'public',
'Content-Type' => 'application/vnd.ms-excel',
'Content-Length' => filesize('./test.xls'),
'Content-Disposition' => 'attachment; filename="test.xls"',
'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
'Content-Transfer-Encoding' => 'binary',
) );
$response->setContent($buffer);
Ten post został edytowany przez Autora dnia 15.05.13 o godzinie 01:31