Jednostavan način za prijenos tabelarnih podataka iz PHP-a u Excel. Izvezi podatke iz php u excel Izvezi php tabelu u excel

.
Metoda predstavljena u toj napomeni je zaista vrlo jednostavna, ali možda nije uvijek zgodna.
Postoji mnogo drugih načina za prijenos tabelarnih podataka iz PHP-a u Excel, opisat ću onaj koji mi se činio najjednostavnijim i najfunkcionalnijim. Posebno treba napomenuti da ne govorim o generisanju xls fajla, već samo predlažem da korisnik otvori primljene podatke koristeći Excel kako korisnici koji nisu iskusni u programiranju ne bi primetili falsifikat.

Dakle, prva stvar koju trebate učiniti je postaviti na našu stranicu link do skripte koja generiše sljedeća zaglavlja:
header("Pragma: javna");
header("Ističe: 0");
header("Kontrola predmemorije: mora se ponovo potvrditi, naknadna provjera=0, predprovjera=0");
header("Kontrola predmemorije: privatno", false);
header("Tip sadržaja: aplikacija/x-msexcel");
header("Content-Disposition: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Content-Transfer-Encoding: binary");
header("Dužina sadržaja: " . $object->getFileSize());

$object je sferni objekat u vakuumu, koji svaki čitalac može implementirati kako želi. Svrha getFileName() i getFileSize() gettera je jasna iz njihovih imena. Ovdje je vrijedno istaknuti jednu neočiglednu nijansu (hvala što ste me podsjetili na ovo) - getFileName() naravno može vratiti bilo koji naziv datoteke, ali ako želite da pretraživač ponudi otvaranje primljenog sadržaja u Excelu, onda bi ekstenzija datoteke trebala biti xls.
Nisam još rekao ništa novo, sve je to izmišljeno prije mene, međutim, kao što će biti opisano u nastavku.
Kao što je ispravno navedeno u komentarima na članak, Excel radi mnogo brže sa XML-om. Ali najvažnija prednost, možda, nije brzina, već mnogo šire mogućnosti. Neću ulaziti dublje u korov, već ću samo dati jednostavan primjer i link na detaljan opis sve oznake.

Dakle, nakon što su zaglavlja generirana, moramo dati stvarne podatke korisniku. Obično umotavam generisanje tabele u zasebnu metodu:
echo $object->getContent();

I generiram tabelu koristeći Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/foreach)(foreach from=$data.content item=red) (foreach from=$row item=col) ($col)(/foreach)(/foreach)

Kao što možete vidjeti iz koda, niz $data se prosljeđuje šablonu, koji sadrži dva niza - red naslova tablice i same podatke.
Vrijedi napomenuti da je korištenje šablona samo za generiranje XML-a pomalo skupo, a XML se može dobiti na mnoge druge načine. U mom konkretnom slučaju, generisanje XML-a je samo mali bonus u velikom projektu u kojem je predložak nezamjenjiv.

Kao primjer sam naveo najjednostavniji sto, mnogo više atributa se može manipulirati po želji. Ovo je posebno lijepo s obzirom na to da za implementaciju nisu potrebne biblioteke trećih strana.
Opisani metod radi na jednom projektu već nekoliko godina i još nijedan korisnik nije posumnjao da podaci koje otvara nisu MS Office dokument.

Više o XML strukturi koja se koristi u MS Excelu možete pročitati u

(podaci dobijeni iz mysql baze podataka) da bi uspjeli. Koristim Zend Framework. Moram napraviti neke promjene u svojim podacima prije izvoza u excel. U stvari, moram da napravim mesečnu blagajnu.

Pročitao sam mnogo dokumenata, ali sam se našao u neredu. Zaista ne znam kako da počnem. Da li mi zaista treba KRUŠKA? Trebam li učitati bilo koju biblioteku klasa? zar ne jednostavan način uradi ovo?

hvala unapred

Predlažem da koristite PHPExcel biblioteku. Zaista je moćan, podržava više formata, može vizualno formatirati i jednostavan je za korištenje.

Više o tome možete saznati na njihovoj web stranici: http://phpexcel.codeplex.com/, (PHPExcel se već preselio na https://github.com/PHPOffice/PHPExcel)

Primjer upotrebe:

$objPHPExcel = novi PHPExcel(); /** Možete postaviti mnoga svojstva */ $objPHPExcel->getProperties()->setCreator("Moja kompanija") ->setLastModifiedBy("John Doe") ->setTitle("Godišnji izvještaj") ->setSubject("Sales ") ->setDescription("Godišnji izvještaj o prodaji John Doea") ->setCategory("Finansije"); /** Odaberite jedan od listova */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Jednostavno postavite vrijednost ćelije */ $activeSheet->setCellValue("A1", "plural");

Možete, naravno, mnogo više, čitajući excel datoteke, postavljanje vizuelnih stilova, kreiranje grafikona, izraza i još mnogo toga.

Napisao sam izvještaj o varijaciji inventara od 94 reda u kojem uzimam podatke iz MySQL-a (6kb + zapisi po tabeli), kreiram višedimenzionalni niz iz MySQL podataka, izvučeni iz nekoliko tabela i zatim sve izbačeni u jedan red i generisani .xls na ovaj način:

Nisu potrebna proširenja.

Jedina upozorenje je da još nisam shvatio kako da ispljunem .xls bez Excela, prijavljujući da su podaci možda oštećeni - i nisam pokušao napraviti formatiranje ili bilo šta složenije od samo "izvoza" podataka, Datoteka/podaci su u redu, naravno, ali generiše upozorenje iz Excela.

EDIT: Trebao bih napomenuti da se "setup" i "dump" odnose na sljedeće: daniweb.com

Možete koristiti phpexcel biblioteku. Omogućava vam da pišete i čitate iz različitim formatima datoteke proračunske tablice

za zend integraciju možete koristiti pomoć sljedećeg linka.

Možete koristiti CSV da napravite uvezivi format za Excel. Ovo je najlakši način da to učinite.

CSV izgleda ovako:

"sadržaj moje prve ćelije", "sadržaj moje druge ćelije", "sadržaj moje treće ćelije" "drugi red, sadržaj prve ćelije", "itd", "itd

Svaki red predstavlja Excel red, između kojeg stavljate sadržaj ćelije dvostruki navodnici i odvojiti zarezima. Budite oprezni ako imate neke svoje podatke, to može pokvariti vaš CSV i stvoriti neželjene nove redove.

Uz malo Google-a pronašli biste ovo: http://www.the-art-of-web.com/php/dataexport/

Priprema podataka

$data = array(array("firstname" => "Mary", "lastname" => "Johnson", "age" => 25), array("firstname" => "Amanda", "prezime" => " Miller", "age" => 18), array("firstname" => "James", "lastname" => "Brown", "age" => 31), array("firstname" => "Patricia", "lastname" => "Williams", "age" => 7), array("firstname" => "Michael", "lastname" => "Davis", "age" => 43), array("firstname" => "Sarah", "lastname" => "Miller", "age" => 24), array("firstname" => "Patrick", "lastname" => "Miller", "age" => 27) );

Prvi korak je ispisivanje podataka u formatu razdvojenom tabulatorima (može se koristiti i CSV, ali je malo komplikovaniji). Za to koristimo sljedeći kod:

Postavili smo tip sadržaja na tekst/običan tako da se rezultat može lakše vidjeti u pretraživaču. U suprotnom, pošto nema HTML formatiranja, izlaz će se pojaviti kao jedan red teksta.

Prvi red izlaza će biti naslovi kolona (u ovom slučaju se koriste nazivi polja). Vrijednosti su odvojene tabulatorom \t i redovima s prijelomima reda \n. Rezultat bi trebao izgledati otprilike ovako:

Ime prezime godine Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

Postoji slabost u ovom kodu koja možda nije odmah očigledna. Šta ako jedno od polja koje treba da se ispiše već sadrži jedan ili više znakova tabulatora ili, još gore, nova linija? Ovo će pokrenuti cijeli proces budući da se oslanjamo na ove znakove za označavanje stupaca i prijeloma redova.

Rješenje je da se "izbjegnu" znakovi tabulatora. U ovom slučaju, zamijenit ćemo tabove s literalom \t i prijelome reda s literalom \n tako da ne utječu na formatiranje:

Sada, prije nego što se svaki red odzvanja, svi znakovi tabulatora se zamjenjuju sa "\t" tako da se naši stupci ne pokvare. Također, svi prijelomi reda unutar podataka zamjenjuju se sa "\n".

Za mnoge, kada rade sa PHP u sprezi sa MySQL postoji potreba kao što je izvoz podataka iz baze podataka u xls format, kako bi ljudi kojima su ti podaci potrebni obrađivali ih u Excel program ili je korisnicima jednostavno bilo zgodno da vide ove podatke. Nedavno sam imao takvu potrebu i danas ću vam reći kako se ovo može implementirati.

Odmah ću reći da je ova metoda prilično jednostavna, ali podaci se prenose normalno.

Za početak, dat ću primjer konačne xls datoteke u Excelu, učitavanje će izgledati otprilike ovako:

Drugim riječima, neće biti učitane slike ili stilovi, već samo zaglavlja kolona i sami podaci.

Prije nego što sam došao do ove konkretne opcije upload-a, pokušao sam sa upload-om u csv format, ali je ispalo malo nespretno, onda sam pokušao nacrtati tabelu i sačuvati je sa ekstenzijom xls, ispostavilo se i da je to bila neka glupost, metoda koju ću sada opisati mi je u potpunosti odgovarala, a sada ću je podijeliti sa vama.

Za početak daću vam sav kod, koji sam komentarisao koliko god je moguće, možete ga odabrati i sačuvati sa php ekstenzija i pokušajte, samo ne zaboravite navesti postavke veze s bazom podataka.

Izvezite podatke iz MySQL-a u Excel u PHP-u

I da biste razumjeli koje podatke učitavam, dat ću primjer jednostavne tabele u bazi podataka ( Imam test imena):

Test tablica:

id ime ime
1 Ivanov Ivane
2 Petrov Peter
2 Petrov2 Peter2
xlsData = pack("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0);

) // Ako je funkcija broja RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $value return ) //Ako je tekstualna funkcija RecText($row, $value)($len = strlen($value); $this->xlsData .= pack); (" s*", 0x0204, 8 + $len, $col, 0x00, $this->xlsData .= $value); if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $ vrijednost $this->countCol++) // Umetanje tekstualne funkcije InsertText($value)(if ($this->countCol) ($this->countCol = 0; $this-); >countRow++ ) $this->countRow, $this->countCol++ // Idi na funkciju novog reda ($this->); countCol = 0 ) //Kraj funkcije podataka EndData() ($this->xlsData .= pack("ss", 0x00); povratak;) // Sačuvajte funkciju datoteke SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // Pošaljite funkciju datoteke SendFile())( $this->EndData(); zaglavlje (" Last-Modified: " . gmdate("D,d M YH:i:s") . "GMT" zaglavlje ("Kontrola predmemorije: bez skladištenja, bez predmemorije, mora se ponovo potvrditi"); zaglavlje ("Pragma: no-cache" zaglavlje ("Content-type: application/x-msexcel"); ->xlsData ) ) ) if(isset($_GET["id"])) ( //filtriranje podataka $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES))))) $filename = "File_with_id_".$id // postavite ime datoteke $excel = new ExportToExcel( // kreirajte instancu klase $sql="SELECT * FROM test.test"); //upit do baze podataka $rez= mysql_query($sql->InsertText("Identifier"); excel->GoNewLine( row=mysql_fetch_assoc($rez))( $excel->InsertNumber($row["id"]); $excel->InsertText($row["firstname"]);$excel->InsertText($row["name"]); $excel->GoNewLine();.

Kako biste provjerili funkcionalnost ovog koda, uzimajući u obzir činjenicu da ste konfigurirali vezu s bazom podataka i kreirali sličnu tablicu, možete poslati sljedeći zahtjev:

Http://your_site/file_name. php?id=2

I trebali biste isprazniti dvije linije sa id jednakim 2.

I sada svako kome dozvolite da učitava podatke može ih lako izvesti na svoje lokalni računar kroz web interfejs. Ova metoda je pogodna kako za korporativne korisnike, ako razvijate aplikaciju za svoju organizaciju, tako i za korisnike vaše web stranice na Internetu. nada, ovu metodu Pomogao ti. Sretno!

.
Metoda predstavljena u toj napomeni je zaista vrlo jednostavna, ali možda nije uvijek zgodna.
Postoji mnogo drugih načina za prijenos tabelarnih podataka iz PHP-a u Excel, opisat ću onaj koji mi se činio najjednostavnijim i najfunkcionalnijim. Posebno treba napomenuti da ne govorim o generisanju xls fajla, već samo predlažem da korisnik otvori primljene podatke koristeći Excel kako korisnici koji nisu iskusni u programiranju ne bi primetili falsifikat.

Dakle, prva stvar koju trebate učiniti je postaviti na našu stranicu link do skripte koja generiše sljedeća zaglavlja:
header("Pragma: javna");
header("Ističe: 0");
header("Kontrola predmemorije: mora se ponovo potvrditi, naknadna provjera=0, predprovjera=0");
header("Kontrola predmemorije: privatno", false);
header("Tip sadržaja: aplikacija/x-msexcel");
header("Content-Disposition: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Content-Transfer-Encoding: binary");
header("Dužina sadržaja: " . $object->getFileSize());

$object je sferni objekat u vakuumu, koji svaki čitalac može implementirati kako želi. Svrha getFileName() i getFileSize() gettera je jasna iz njihovih imena. Ovdje je vrijedno istaknuti jednu neočiglednu nijansu (hvala savostinu što me podsjetio na ovo) - getFileName() naravno može vratiti bilo koji naziv datoteke, ali ako želite da pretraživač ponudi otvaranje primljenog sadržaja u Excelu, onda fajl ekstenzija bi trebala biti xls.
Nisam još rekao ništa novo, sve je to izmišljeno prije mene, međutim, kao što će biti opisano u nastavku.
Kao što je ispravno navedeno u komentarima na post o xls generisanju u PHP-u, Excel radi mnogo brže sa XML-om. Ali najvažnija prednost, možda, nije brzina, već mnogo šire mogućnosti. Neću ulaziti dublje u korov, već ću samo dati jednostavan primjer i link do detaljnog opisa svih oznaka.

Dakle, nakon što su zaglavlja generirana, moramo dati stvarne podatke korisniku. Obično umotavam generisanje tabele u zasebnu metodu:
echo $object->getContent();

I generiram tabelu koristeći Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/foreach)(foreach from=$data.content item=red) (foreach from=$row item=col) ($col)(/foreach)(/foreach)

Kao što možete vidjeti iz koda, niz $data se prosljeđuje šablonu, koji sadrži dva niza - red naslova tablice i same podatke.
Vrijedi napomenuti da je korištenje šablona samo za generiranje XML-a pomalo skupo, a XML se može dobiti na mnoge druge načine. U mom konkretnom slučaju, generisanje XML-a je samo mali bonus u velikom projektu u kojem je predložak nezamjenjiv.

Kao primjer, dao sam jednostavnu tabelu, ako želite, možete manipulirati mnogo većim brojem atributa. Ovo je posebno lijepo s obzirom da za implementaciju nisu potrebne biblioteke trećih strana.
Opisani metod radi na jednom projektu već nekoliko godina i još nijedan korisnik nije posumnjao da podaci koje otvara nisu MS Office dokument.

Više o XML strukturi koja se koristi u MS Excelu možete pročitati u