Generování XLS nebo CSV souborů
- despiq
- Člen | 320
xls – http://phpexcel.codeplex.com/
a na csv bych zkusil tohle http://cz.php.net/….fputcsv.php
- tombom
- Člen | 10
Jo v phpmyadminu to vim, ale potřebuju to nějak dostat do podoby BFU, když mu lidi naplní DB objednávkama, tak aby si seznam objednávek mohl stáhnout a zpracovat v Exlu. Díky za odkazy, ale moc se v NETTE ještě nevyznám, tak si nějak nedokážu představit jak to tam zaimplementovat.
- Honza Kuchař
- Člen | 1662
Doporučuji převést do vícerozměrného pole a poté pomocí pár implode z toho udělat text.
- wdolek
- Člen | 331
jak implementovat – snad nebudu rikat velke nesmysly nebo neco, co povazujete za naprostou samozrejmost.
ja bych si udelal v nejake modelove tride funkci, ktera bude vracet pozadovana data (vrati pole, nebo nejakou sadu objektu, kolekci)
v presenteru bych pak vyrobil nejakou akci downloadData
,
v ktere bych:
- nastavil header na spravny content-type
$this->getHttpResponse()->setContentType('text/csv');
- poslal bych data primo na vystup (
echo
) a ukoncil pak akci$this->terminate();
(ale to asi neni uplne koser) - vyrobil bych sablonu, ktera by ta data nejak vypsala na vystup (toto by mohlo byt univerzalnejsi reseni)
- pro vypis bych pouzil zminenou funkci
fputcsv
(http://cz.php.net/….fputcsv.php), pomoci ktere bych zapisoval primo na vystup
$fh = fopen('php://output', 'w');
// csv
foreach ($data as $row) {
fputcsv($fh, $row);
}
fclose($fh);
… a to bud primo v action
, a nebo v sablone – ale
v sablone by precejen nemel byt nejaky slozitejsi kod
Editoval wdolek (25. 5. 2010 22:15)
- Honza Kuchař
- Člen | 1662
Přesně tak. A pokud to chceš mít úplně Nette-integrated, tak si k tomu dopiš jednoduchou třídu implementující IPresenterResponse a tu potom předávej pomocí $this->terminate($tovojeTridaObalujiciPHPExcelCiJakSeToJmenuje);
- tom
- Člen | 171
iguana007 napsal(a):
Úplně stejně jako jinou knihovnu :)
Imho by mělo stačit to hodit mezi ostatní libs, promazat /temp a zavolat třídu PHPExcelu … a jedeš ;)
Vyzkousel jsem funguje perfektne, ale me bohuzel jen na localhostu. Na hostingu mi vubec nenabehne ani samotny web natoz abych se dostal ke generovani XLSX. Do logu dostanu hlasku:
PHP Fatal error: Uncaught exception ‚FatalErrorException‘ with message ‚Allowed memory size of 37748736 bytes exhausted (tried to allocate 72 bytes)‘ in /www/sites/6/site23896/public_html/test/libs/Nette/Loaders/RobotLoader.php:283
Pomoci Nette Framework Requirements Checker jsem zjistil ze na hostingu mam Memory limit 36M, na locale dokonce jen 32M. Zkousel jsem reseni typu ini_set(„memory_limit“,„512M“) ale bez uspechu.
Cim by to mohlo byt? A pouzivaji z toho PHPExcel opravdu vsechny zdrojaky anebo z toho lze pouzit jen nejaka minimalni verze?
- Lopo
- Člen | 277
osobne som PHPExcel tiez pouzil, ale ma problem s narocnostou …
kedze tu pracujem s tabulkami ktore maju radovo 10 az 100 tisice riadkov tak
uz je to nepouzitelne
Preto teraz vsetko exportujem do XML …
mam urobenu sablonu v ktorej nastavim content-type, hlavicku celeho formatu +
zakladne formatovanie najdolezitejsich typov buniek a potom v sablone pohladu
uz len naformatujem data
je to rychle a v ohlade pouzitelnosti na zhruba rovnakej urovni ako samotne
xls/xlsx
v pripade zaujmu mozem poskytnut sablonu layout-u a nejaku ukazkovu pohladu
- peci1
- Člen | 60
tombom napsal(a):
jo tak ten PHPExcel je super, rozchodit sel uplne krasne, ale presto v NETTE vubec nevim jak na to…
Ahoj, ted jsem zkoumal PHPExcel :) Technicky problem s rozchozenim nebyl, spis ale filozoficky. Dle meho nazoru si totiz tahle knihovna s MVC moc nerozumi. Nechtelo se mi zabordelit actio/renderNeco() vytvarenim XLS, ale ani nemam pocit, ze by to byla vec, kterou by mel celou resit model (preci jenom urcujeme, do ktere bunky ktery udaj pujde, jakym fontem bude napsany atd).
Na vytvareni CSV se mi osvedcila jednoducha sablona a nechtel jsem se sablony vzdat ani tady.
Tak jsem Nette trosku priohnul a jsem spokojeny =)
Napsal jsem cely kod pro generovani XLS do sablony
mezi <?php a ?>
To je celkem jednoduche, ale neciste reseni, ze? Chtel bych nadhodit otazku, jak takovou vec vyresit i filozoficky spravne =) Zde je mych par navrhu:
- Pouzit .xls sablonu (ta je ale binarni a to se mi nelibi)
- Napsat si nejakou ExcelResponse a predat ji PHPExcel objekt (tohle ale neresi to, ze bych rad mel nejakou nebinarni sablonu)
- vyse popsany priohybaci postup (konecne mam nejakou nebinarni „sablonu“)
- ruzne silene konverze (z CSV, XML, XSLT a jeste hur…)
Co vy na to? Jak byste to rozlouskli?
- Mesiah
- Člen | 240
nevím, jesli budu přínosný pro tuhle diskusi, ale asi bych to řešil následovně.
v controlleru/presenteru rozhodnu o tom, že chci získat XLS, řízení převezme první vrstva modelu, ta se postará o načtení dat a vytvoření instance PHPExcel(u) – něco jako druhá vrstva. Tady se provede nastavení a vratí se to co vytvoří třída PHPExcel zpět do první vrstvy a ta to pošle opět zpět a controller/presenter nabídne stažení…
- Filip Procházka
- Moderator | 4668
class ExportPresenter extends BasePresenter
{
public function renderXls($id)
{
$data = Model::findOne(array('id' => $id));
// žádné načítání include ani use není potřeba, nette to načítá samo, opravdu :)
$objPHPExcel = new PHPExcel();
// Set properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
// ...
// Add some data
echo date('H:i:s') . " Add some data\n";
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
// ...
// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');
// Save Excel 2007 file
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$file = DOWNLOAD_DIR . '/export.' . date('Y-m-d-H-i-s').'.xlsx';
$objWriter->save($file);
// hotovo
$this->sendResponse(new DownloadResponse($file));
}
}