konto usunięte

Temat: PHPExcel i Zend2 Controller

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.

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

konto usunięte

Temat: PHPExcel i Zend2 Controller

A ja z kolei znalazlem jeszcze inne rozwiazanie :) A wlasciwie na SO dostalem wskazowke.

Kluczem jest tu funkcja ob_start(); (o ktorej istnieniu nie mialem pojecia ;)). Po odczytaniu wszystkiego co PHPEXcel zapisuje, w zmiennej mam zawartosc Excela:


$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_start();
$objWriter->save('php://output');
$excelOutput = ob_get_clean();


A pozniej juz tylko

$response->setContent($excelOutput);


I bangla :) Oczywiscie rozwiazanie nie jest polecane przy duzych plikach, bo wszystko dzieje sie w pamieci. Ja przy swoich kilku KB moge sobie na to pozwolicTen post został edytowany przez Autora dnia 17.05.13 o godzinie 17:06

Temat: PHPExcel i Zend2 Controller

Kamil S.:
A ja z kolei znalazlem jeszcze inne rozwiazanie :) A wlasciwie na SO dostalem wskazowke.

Kluczem jest tu funkcja ob_start(); (o ktorej istnieniu nie mialem pojecia ;)). Po odczytaniu wszystkiego co PHPEXcel zapisuje, w zmiennej mam zawartosc Excela:


$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_start();
$objWriter->save('php://output');
$excelOutput = ob_get_clean();


A pozniej juz tylko

$response->setContent($excelOutput);


I bangla :) Oczywiscie rozwiazanie nie jest polecane przy duzych plikach, bo wszystko dzieje sie w pamieci. Ja przy swoich kilku KB moge sobie na to pozwolic

Nie prawda, że wszystko dzieje się w pamięci :) Na dysku jest tworzony plik tymczasowy. Poniżej framgment kody z metody save() :D


// If $pFilename is php://output or php://stdout, make it a temporary file...
$originalFilename = $pFilename;
if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') {
$pFilename = @tempnam(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp');
if ($pFilename == '') {
$pFilename = $originalFilename;
}
}

Podobne tematy


Następna dyskusja:

biblioteka PHPExcel




Wyślij zaproszenie do