Archive for the ‘excel’ tag
Nicht-HTML-Responses mit dem Zend Framework
Wenn man dynamische Bilder oder RSS-Feeds oder einen AJAX/JSON-Service oder ein Excel-Export mithilfe des Zend Frameworks erstellen will, mußt man 2-3 wichtige Dinge beachten. Der Code soll dann in einem Rss-/Graph-/Ajax-/Export-Controller stehen.
Ein Problem bekommt man, wenn man ein Layout benutzt (Zend_Layout). Denn dann wird dieses Layout immer ausgegeben. Im hier betrachteten Fall wäre das aber sehr schädlich, denn dadurch würden wir unser Bild/RSS-Feed/AJAX/Excel-Response zerstören.
Unschön kann man das wie folgt lösen:
1 2 3 4 5 6 | public function rssAction() { // calculate rss data and echo it (with correct headers) exit ; } |
Richtig und deutlich schöner ist das Abschalten des Layout in der Action, wie folgt:
1 2 3 4 5 6 7 8 9 10 | public function rssAction() { // disable layout $this ->_helper->layout()->disableLayout(); // disable view rendering $this ->_helper->viewRenderer->setNoRender(); // calculate rss data and echo it (with correct headers) } |
Wir schalten auch gleich noch den ViewRenderer mit aus, damit auch nicht versucht wird, ein Viewscript zu rendern (das es wahrscheinlich garnicht gibt).
Dieses RSS-Beispiel funktioniert natürlich genauso für die anderen Beispiele, wo kein klassischer HTML-Quelltext zurückgegeben werden soll, sondern eine Antwort in einem anderen Format gefordert ist.
Damit kann man dann seine dynmisch erstellten Bilder (z.B. mittels pChart, jpgraph oder direkt die GD-Funktionen/image* in php), RSS-Feeds (Zend_Feed), Ajax-Services (Zend_Json) usw. realisieren.
Hier noch schnell ein Beispiel eines Excel-Exports aus einer Datenbank, mit Hilfe der Spreadsheet-Klasse aus dem PEAR-Framework (vereinfacht auf das Wesentliche):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | class ExportController extends Zend_Controller_Action { public function excel() { // disable layout $this ->_helper->layout()->disableLayout(); // disable view rendering $this ->_helper->viewRenderer->setNoRender(); // get some data from database here // create empty file //include 'Spreadsheet/Excel/Writer.php'; $excel = new Spreadsheet_Excel_Writer(); // add worksheet $sheet =& $excel ->addWorksheet( 'Daily Export' ); $sheet ->setColumn(0,0,20); $sheet ->setColumn(1,1,15); $sheet ->setColumn(2,2,18); $sheet ->setColumn(3,3,23); $sheet ->setColumn(4,4,35); $sheet ->setColumn(5,5,15); $format_bold =& $excel ->addFormat(); $format_bold ->setBold(); $format_headline =& $excel ->addFormat(); $format_headline ->setBold(); $format_headline ->setSize(20); $format_headline ->setAlign( 'center' ); // headline $sheet ->write(0, 0, 'Results: ' . date ( 'd.m.Y H:i' ), $format_headline ); $sheet ->mergeCells(0,0,0,5); // add data to worksheet $rowCount =2; foreach ( $data as $groupName => $serverData ) { $sheet ->write( $rowCount , 0, $groupName , $format_bold ); $rowCount ++; foreach ( $serverData as $row ) { $colcount = 0; foreach ( $row as $key => $value ) { $sheet ->write( $rowCount , $colcount , $value ); $colcount ++; } $rowCount ++; } $rowCount ++; } // send client headers $excel ->send( 'daily_export_' . date ( "Ymd-His" ). '.xls' ); } } |
Dies hier ist alter Code, mittlerweile nutzen wir PHPExcel.