Generování XLS nebo CSV souborů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tombom
Člen | 10
+
0
-

Ahoj, potřeboval bych data uložené v databázi vygenerovat do nějakého souboru, který by si administrátor mohl stáhnout. Nejlépe do XLS, nebo třeba CSV. Nikde jsem ale o tom nenašel jedinou zmínku. Kdoví jak na to? Díky :)

Aurielle
Člen | 1281
+
0
-

XLS je celkem dost složitý formát a existují na něj tuším nějaké knihovny a CSV je (pokud se nemýlím) standartní texťák s daty oddělenými čárkou nebo středníkem… ;)

despiq
Člen | 320
+
0
-
dotTwelve
Člen | 167
+
0
-

pokud se jedna o mysql, tak phpmyadmin disponuje exportem primo do csv

tombom
Člen | 10
+
0
-

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
+
0
-

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
+
0
-

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:

  1. 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)

despiq
Člen | 320
+
0
-

fputcsv je vlastne zbytecna blbost, musi se zapisovat do souboru,
takze sablonu, zmenit hlavicku na octec-stream a v sablone si udelat co je treba, vypsat sloupce oddeleny carkama a uvozovkama by nemel byt zadny problem, jen nezapomenout neincludovat layout

iguana007
Člen | 970
+
0
-

Jak psal despiq, udělje to s PHPExcel … používá se to jednoduše a výsledek je imho nejlepší z pohledu BFU ;) Sám používám v několika projektech a klient si to nemůže vynachválit.

tombom
Člen | 10
+
0
-

jo tak ten PHPExcel je super, rozchodit sel uplne krasne, ale presto v NETTE vubec nevim jak na to…

iguana007
Člen | 970
+
0
-

Ú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š ;)

Honza Kuchař
Člen | 1662
+
0
-

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
+
0
-

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?

tom
Člen | 171
+
0
-

tom napsal(a):

Cim by to mohlo byt? A pouzivaji z toho PHPExcel opravdu vsechny zdrojaky anebo z toho lze pouzit jen nejaka minimalni verze?

Tak snad už to mám – do rootu toho baliku PHPExcel jsem pridal souboru netterobots.txt kde mam Disallow: /PHPExcel

Lopo
Člen | 277
+
0
-

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
+
0
-

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
+
0
-

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í…

Tomato
Člen | 9
+
0
-

mohol by mi niekto napisat ako presne prinutit nette,aby mi zobralo ten phpexcel?
mam to robit cez include ( a upravit php.ini? ),cez use ( podobne ako nette ) som to skusal,ale bezvysledku
za akukolvek radu dakujem ;-)

Filip Procházka
Moderator | 4668
+
0
-
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));
	}
}
Tomato
Člen | 9
+
0
-

super,dakujem pekne HosipLan ;-) zase som sa nieco nove naucil :)

Editoval Tomato (3. 1. 2011 8:50)