Rýchly export PHP do excelu. Export údajov z php do excelu

Rýchly export PHP do excelu. Export údajov z php do excelu

.
Metóda uvedená v tejto poznámke je skutočne veľmi jednoduchá, ale nemusí byť vždy vhodná.
Existuje mnoho ďalších spôsobov, ako preniesť tabuľkové údaje z PHP do Excelu, opíšem ten, ktorý sa mi zdal najjednoduchší a najfunkčnejší. Zvlášť treba poznamenať, že nehovorím o generovaní xls súbor, ale používateľovi navrhnúť, aby otvoril prijaté údaje, len keď Pomocník programu Excel takže používatelia, ktorí nemajú skúsenosti s programovaním, si falzifikát nevšimli.

Takže prvá vec, ktorú musíte urobiť, je umiestniť na našu stránku odkaz na skript, ktorý generuje nasledujúce hlavičky:
header("Pragma: public");
header("Platnosť vyprší: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Typ obsahu: application/x-msexcel");
header("Content-Disposition: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Kódovanie pre prenos obsahu: binárne");
header("Content-Length: " . $object->getFileSize());

$object je sférický objekt vo vzduchoprázdne, ktorý si každý čitateľ môže implementovať ako chce. Účel getFileName() a getFileSize() je jasný z ich názvov. Tu stojí za to zdôrazniť jednu nezrejmú nuanciu (vďaka savostin, že mi to pripomenul) - getFileName() môže samozrejme vrátiť akýkoľvek názov súboru, ale ak chcete, aby prehliadač ponúkol otvorenie prijatého obsahu v Exceli, potom súbor rozšírenie by malo byť xls.
Zatiaľ som nepovedal nič nové, toto všetko bolo vynájdené predo mnou, ako bude popísané nižšie.
Ako bolo správne uvedené v komentároch k príspevku o generovaní xls v PHP, Excel pracuje oveľa rýchlejšie s XML. Najdôležitejšou výhodou však možno nie je rýchlosť, ale oveľa viac široké možnosti. Nebudem zachádzať hlbšie do buriny, ale uvediem len jednoduchý príklad a odkaz Detailný popis všetky značky.

Takže po vygenerovaní hlavičiek musíme používateľovi poskytnúť skutočné údaje. Generovanie tabuľky zvyčajne zabalím do samostatnej metódy:
echo $object->getContent();

A vygenerujem tabuľku pomocou Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/pre každý)(foreach from=$data.content item=row) (foreach from=$row item=col) ($col)(/pre každý)(/pre každý)

Ako môžete vidieť z kódu, do šablóny sa odovzdá pole $data, ktoré obsahuje dve polia – riadok názvu tabuľky a samotné údaje.
Stojí za zmienku, že používanie nástroja šablón iba na generovanie XML je trochu drahé a XML možno získať mnohými inými spôsobmi. V mojom konkrétnom prípade generovanie XML Toto je len malý bonus vo veľkom projekte, kde sa bez šablóny nezaobídete.

Ako príklad som uviedol jednoduchú tabuľku, v prípade potreby môžete manipulovať s oveľa väčším počtom atribútov. To je obzvlášť pekné vzhľadom na to, že na implementáciu nie sú potrebné žiadne knižnice tretích strán.
Opísaný spôsob funguje na jednom projekte už niekoľko rokov a nejeden používateľ ešte tušil, že dáta, ktoré otvára, nie sú dokument MS Office.

Viac o štruktúre XML používanej v MS Excel si môžete prečítať v

(údaje získané z databázy mysql) uspieť. Používam Zend Framework. Pred exportom do excelu potrebujem vykonať nejaké zmeny v údajoch. V skutočnosti potrebujem vytvoriť mesačnú pokladničnú knihu.

Prečítal som veľa dokumentov, ale ocitol som sa v neporiadku. Naozaj neviem ako začať. Naozaj potrebujem HRUŠKU? Musím načítať knižnicu tried? Nie? jednoduchý spôsob urob to?

vopred ďakujem

Odporúčam vám použiť knižnicu PHPExcel. Je skutočne výkonný, podporuje viacero formátov, dokáže vizuálne formátovať a ľahko sa používa.

Viac si o tom môžete prečítať na ich webovej stránke: http://phpexcel.codeplex.com/, (PHPExcel sa už presunul na https://github.com/PHPOffice/PHPExcel)

Príklad použitia:

$objPHPExcel = nový PHPExcel(); /** Môžete nastaviť veľa vlastností */ $objPHPExcel->getProperties()->setCreator("Moja spoločnosť") ->setLastModifiedBy("John Doe") ->setTitle("Výročná správa") ->setSubject("Predaje" ") ->setDescription("Výročná správa o predaji od Johna Doe") ->setCategory("Finance"); /** Vyberte jeden z hárkov */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Jednoducho nastavte hodnotu bunky */ $activeSheet->setCellValue("A1", "množné číslo");

Môžete robiť oveľa viac, samozrejme, čítať excel súbory, nastavenie vizuálnych štýlov, vytváranie grafov, výrazov a mnoho ďalšieho.

Napísal som 94-riadkovú správu o variáciách inventára, kde beriem údaje z MySQL (6 kb + záznamy na tabuľku), vytváram multidimenzionálne pole z údajov MySQL, ťahám z viacerých tabuliek a potom všetko vysypem do jedného riadka a vygenerujem .xls.

Nevyžadujú sa žiadne rozšírenia.

Jediná výhrada je, že som ešte neprišiel na to, ako vypľuť .xls bez Excelu s hlásením, že údaje môžu byť poškodené – a neskúšal som robiť formátovanie ani nič zložitejšie, ako len „exportovať“ údaje, Súbor/údaje sú samozrejme v poriadku, ale generuje to varovanie z Excelu.

EDIT: Mal by som poznamenať, že „nastavenie“ a „výpis“ sa týkajú nasledujúceho: daniweb.com

Môžete použiť knižnicu phpexcel. Umožňuje vám písať a čítať z rôznych formátov tabuľkových súborov

pre integráciu Zend môžete využiť nasledujúci odkaz.

Môžete použiť CSV na vytvorenie importovateľného formátu pre Excel. Toto je najjednoduchší spôsob, ako to urobiť.

CSV vyzerá takto:

"obsah mojej prvej bunky", "obsah mojej druhej bunky", "obsah mojej tretej bunky" "druhý riadok, obsah prvej bunky", "atď", "atď.

Každý riadok predstavuje riadok Excel, vložíte obsah bunky do dvojitých úvodzoviek a oddelíte ho čiarkami. Buďte opatrní, ak máte nejaké svoje údaje, môže to poškodiť váš CSV a vytvoriť nechcené nové riadky.

S trochou Google by ste našli toto: http://www.the-art-of-web.com/php/dataexport/

Príprava dát

$data = array(array("firstname" => "Mary", "priezvisko" => "Johnson", "vek" => 25), array("firstname" => "Amanda", "priezvisko" => " Miller", "vek" => 18), array("firstname" => "James", "priezvisko" => "Brown", "vek" => 31), array("firstname" => "Patricia", "priezvisko" => "Williams", "vek" => 7), array("krstne meno" => "Michael", "priezvisko" => "Davis", "vek" => 43), array("krstne meno" => "Sarah", "priezvisko" => "Miller", "vek" => 24), array("krstné meno" => "Patrick", "priezvisko" => "Miller", "vek" => 27) );

Prvým krokom je výstup údajov vo formáte oddelenom tabulátormi (možno použiť aj CSV, ale je to trochu komplikovanejšie). Na tento účel používame nasledujúci kód:

Typ obsahu sme nastavili na text/plain, aby sa výsledok dal ľahšie zobraziť v prehliadači. V opačnom prípade, pretože nie HTML formátovanie, výstup sa zobrazí ako jeden riadok textu.

Prvý riadok výstupu budú hlavičky stĺpcov (v tomto prípade sa použijú názvy polí). Hodnoty sú oddelené tabulátorom \t a riadkami so zalomenými riadkami \n. Výsledok by mal vyzerať asi takto:

Meno priezvisko vek Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

V tomto kóde je slabina, ktorá nemusí byť hneď zrejmá. Čo ak jedno z polí, ktoré je potrebné vypísať, už obsahuje jeden alebo viac znakov tabulátora alebo, čo je horšie, Nový riadok? Tým sa spustí celý proces, pretože sa spoliehame na tieto symboly na označenie stĺpcov a zlomov riadkov.

Riešením je „uniknutie“ znakov karty. V tomto prípade nahradíme tabulátory literálom \t a konce riadkov literálom \n, aby neovplyvnili formátovanie:

Teraz, pred odozvou každého riadku, sú všetky znaky tabulátora nahradené znakom "\t", aby sa naše stĺpce nezlomili. Všetky konce riadkov v údajoch sú nahradené znakom „\n“.

Pre mnohých pri práci s PHP v spojení s MySQL existuje taká potreba ako export údajov z databázy do xls formát, aby ľudia, ktorí tieto údaje potrebujú, ich spracovali v program Excel alebo bolo pre používateľov jednoducho pohodlné zobraziť tieto údaje. Nedávno som mal takúto potrebu a dnes vám poviem, ako sa táto záležitosť dá realizovať.

Hneď poviem, že táto metóda je pomerne jednoduchá, ale údaje sa nahrávajú normálne.

Na začiatok uvediem príklad konečného súboru xls, v Exceli bude nahrávanie vyzerať asi takto:

Inými slovami, nenahrajú sa žiadne obrázky ani štýly, iba hlavičky stĺpcov a samotné údaje.

Predtým, ako som sa dostal k tejto konkrétnej možnosti nahrávania, skúsil som nahrať do vo formáte csv, ale dopadlo to trosku nemotorne, potom som skusila nakreslit tabulku a ulozit ju s priponou xls, tiez mi to vyslo nejaky nezmysel, ten sposob, ktory teraz opisem, mi uplne vyhovoval a teraz budem zdieľajte to s vami.

Na začiatok uvediem všetok kód, ktorý som okomentoval čo najviac, môžete si ho vybrať a uložiť s koncovkou php a vyskúšať, len nezabudnite uviesť nastavenia pre pripojenie k databáze.

Export údajov z MySQL do Excelu v PHP

A aby ste pochopili, aké údaje nahrávam, uvediem príklad jednoduchej tabuľky v databáze ( Mám test na jeho meno):

Testovacia tabuľka:

id krstné meno názov
1 Ivanov Ivan
2 Petrov Peter
2 Petrov2 Peter2
xlsData = pack("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // Ak je číselná funkcia RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $value); return; ) //Ak textová funkcia RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= pack (" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $value; return; ) // Vloženie číselnej funkcie InsertNumber($value)( if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $ hodnota); $this->countCol++; return; ) // Vloženie textovej funkcie InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this- >countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Prejsť na novú riadkovú funkciu GoNewLine())( $this ->countCol = 0 ; $this->countRow++; return; ) //Koniec dátovej funkcie EndData())( $this->xlsData .= pack("ss", 0x0A, 0x00); návrat; ) // Uloženie funkcie súboru SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // Odoslanie funkcie súboru SendFile())( $this->EndData(); hlavička (" Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); hlavička ("Cache-Control: no-store, no-cache, must-revalidate"); hlavička (" Pragma: no-cache"); hlavička ("Typ obsahu: application/x-msexcel"); hlavička ("Obsah-Dispozícia: príloha; názov súboru=$this->názov_súboru.xls"); tlač $this ->xlsData ; ) ) ) if(isset($_GET["id"])) ( //filtrovanie údajov $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES))))) $filename = "File_with_id_".$id; // nastavenie názvu súboru $excel = new ExportToExcel(); // vytvorenie inštancie triedy $sql="SELECT * FROM test.test kde id = $id"; //dotaz do databázy $rez= mysql_query($sql); $excel->InsertText("Identifier"); $excel->InsertText("Priezvisko"); $excel->InsertText("Name"); $ excel->GoNewLine(); While($ row=mysql_fetch_assoc($rez))( $excel->InsertNumber($row["id"]); $excel->InsertText($row["firstname"]); $excel->InsertText($row["meno"]); $excel->GoNewLine(); ) $excel->SaveFile($názov súboru); ) ?>

Celá myšlienka je tu funkcia balenie(), ktorý zbalí údaje do binárneho reťazca a tento reťazec následne naplníme údajmi, ktoré sme stiahli z databázy MySql pomocou normálnej funkcie mysql_query().

Ak chcete skontrolovať funkčnosť tohto kódu, berúc do úvahy skutočnosť, že ste nakonfigurovali pripojenie k databáze a vytvorili podobnú tabuľku, môžete odoslať nasledujúcu požiadavku:

Http://vasa_stranka/nazov_suboru. php?id=2

A mali by ste vyložiť dva riadky s ID rovným 2.

A teraz každý, komu povolíte nahrávať údaje, ich môže jednoducho exportovať do svojho lokálny počítač cez webové rozhranie. Táto metóda je vhodná pre oboch firemných používateľov, ak vyvíjate aplikáciu pre vašu organizáciu a pre používateľov vašej webovej lokality na internete. Nádej, túto metódu Pomohol ti. Veľa štastia!

.
Metóda uvedená v tejto poznámke je skutočne veľmi jednoduchá, ale nemusí byť vždy vhodná.
Existuje mnoho ďalších spôsobov, ako preniesť tabuľkové údaje z PHP do Excelu, opíšem ten, ktorý sa mi zdal najjednoduchší a najfunkčnejší. Zvlášť je potrebné poznamenať, že nehovorím o generovaní súboru xls, ale len o tom, že používateľovi navrhujem otvoriť prijaté údaje pomocou Excelu, aby si používatelia, ktorí nemajú skúsenosti s programovaním, falzifikát nevšimli.

Takže prvá vec, ktorú musíte urobiť, je umiestniť na našu stránku odkaz na skript, ktorý generuje nasledujúce hlavičky:
header("Pragma: public");
header("Platnosť vyprší: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Typ obsahu: application/x-msexcel");
header("Content-Disposition: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Kódovanie pre prenos obsahu: binárne");
header("Content-Length: " . $object->getFileSize());

$object je sférický objekt vo vzduchoprázdne, ktorý si každý čitateľ môže implementovať ako chce. Účel getFileName() a getFileSize() je jasný z ich názvov. Tu stojí za to zdôrazniť jednu nezrejmú nuanciu (ďakujem, že ste mi to pripomenuli) - getFileName() môže samozrejme vrátiť akýkoľvek názov súboru, ale ak chcete, aby prehliadač ponúkol otvorenie prijatého obsahu v Exceli, potom by prípona súboru mala byť xls.
Zatiaľ som nepovedal nič nové, toto všetko bolo vynájdené predo mnou, ako bude popísané nižšie.
Ako bolo správne uvedené v komentároch k článku, Excel pracuje oveľa rýchlejšie s XML. Najdôležitejšou výhodou však možno nie je rýchlosť, ale oveľa širšie možnosti. Nebudem zachádzať hlbšie do buriny, ale uvediem iba jednoduchý príklad a odkaz na podrobný popis všetkých značiek.

Takže po vygenerovaní hlavičiek musíme používateľovi poskytnúť skutočné údaje. Generovanie tabuľky zvyčajne zabalím do samostatnej metódy:
echo $object->getContent();

A vygenerujem tabuľku pomocou Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/pre každý)(foreach from=$data.content item=row) (foreach from=$row item=col) ($col)(/pre každý)(/pre každý)

Ako môžete vidieť z kódu, do šablóny sa odovzdá pole $data, ktoré obsahuje dve polia – riadok názvu tabuľky a samotné údaje.
Stojí za zmienku, že používanie nástroja šablón iba na generovanie XML je trochu drahé a XML možno získať mnohými inými spôsobmi. V mojom konkrétnom prípade je generovanie XML len malým bonusom vo veľkom projekte, kde je šablónový engine nevyhnutný.

Ako príklad som uviedol jednoduchú tabuľku, v prípade potreby môžete manipulovať s oveľa väčším počtom atribútov. To je obzvlášť pekné vzhľadom na to, že na implementáciu nie sú potrebné žiadne knižnice tretích strán.
Opísaný spôsob funguje na jednom projekte už niekoľko rokov a nejeden používateľ ešte tušil, že dáta, ktoré otvára, nie sú dokument MS Office.

Viac o štruktúre XML používanej v MS Excel si môžete prečítať v