Preprost način za prenos tabelaričnih podatkov iz PHP v Excel. Preprost način za prenos tabelaričnih podatkov iz PHP v Excel PHP skript za nalaganje iz mysql v excel

(podatki pridobljeni iz baze podatkov mysql), da uspe. Uporabljam Zend Framework. Pred izvozom v excel moram narediti nekaj sprememb v svojih podatkih. Pravzaprav moram ustvariti mesečno knjigo blagajne.

Prebral sem veliko dokumentov, vendar sem končal v zmešnjavi. Res ne razumem, kako naj začnem. Ali res potrebujem HRUŠKO? Ali moram naložiti katero koli knjižnico razredov? Ali ne? enostaven način naredi?

Hvala v naprej

Predlagam, da uporabite knjižnico PHPExcel PHPExcel. Res je zmogljiv, podpira različne formate, omogoča vizualno oblikovanje in je enostaven za uporabo.

Več o tem lahko izveste na njihovi spletni strani: http://phpexcel.codeplex.com/ (PHPExcel se je že preselil na https://github.com/PHPOffice/PHPExcel)

Primer uporabe:

$objPHPExcel = nov PHPExcel(); /** Nastavite lahko številne lastnosti */ $objPHPExcel->getProperties()->setCreator("Moje podjetje") ->setLastModifiedBy("John Doe") ->setTitle("Letno poročilo") ->setSubject("Prodaja" ") ->setDescription("Letno poročilo o prodaji Johna Doeja") ->setCategory("Finance"); /** Izberite enega od listov */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Preprosto nastavite vrednost celice */ $activeSheet->setCellValue("A1", "plural");

Z branjem lahko naredite seveda veliko več datoteke excel, nastavitev vizualnih slogov, ustvarjanje grafov, izrazov in več.

Napisal sem poročilo o različicah inventarja s 94 vrsticami, kjer vzamem podatke iz MySQL (6 kb+zapisov na tabelo), ustvarim večdimenzionalno matriko iz podatkov MySQL, potegnem iz več tabel, nato vse prenesem v eno vrstico in ustvarim .xls Takole:

Razširitve niso potrebne.

Edina opozorila so ta, da še nisem ugotovil, kako izpljuniti .xls brez Excela, saj vam povem, da so podatki lahko poškodovani - in nisem poskušal narediti oblikovanja ali česar koli bolj zapletenega kot samo "izvoziti" podatke , datoteka/podatki v redu seveda, vendar ustvari opozorilo iz excela.

UREDI: Upoštevati moram, da se "setup" in "dump" nanašata na: daniweb.com

Uporabite lahko knjižnico phpexcel. Omogoča vam pisanje in branje iz različnih formatov datotek preglednic

za integracijo z zendom si lahko pomagate s pomočjo naslednje povezave.

CSV lahko uporabite za ustvarjanje uvozne oblike za excel. To je najlažji način za to.

CSV izgleda takole:

"vsebina moje prve celice", "vsebina moje druge celice", "vsebina moje tretje celice" "druga vrstica, vsebina prve celice", "itd", "itd

Vsaka vrstica predstavlja Excelov niz, postavite vsebino celice med dvojne narekovaje in jih ločite z vejicami. Bodite previdni, če imate nekaj svojih podatkov, to lahko pokvari vaš CSV in ustvari neželene nove vrstice.

Z malo Googla bi našli tole: http://www.the-art-of-web.com/php/dataexport/

Priprava podatkov

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

Prvi korak je izpis podatkov v obliki, ločeni s tabulatorji (lahko uporabite tudi CSV, vendar je nekoliko bolj zapleten). Za to uporabljamo naslednjo kodo:

Tip vsebine smo nastavili na text/plain, da si je rezultat lažje ogledati v brskalniku. Sicer pa od št Oblikovanje HTML, bo rezultat prikazan kot ena vrstica besedila.

Prva vrstica izhoda bodo naslovi stolpcev (v tem primeru se uporabijo imena polj). Vrednosti so ločene z zavihkom \t in vrsticami s prelomi vrstic \n. Rezultat bi moral izgledati nekako takole:

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

V tej kodi je slabost, ki morda ni takoj očitna. Kaj pa, če eno od polj za izpis že vsebuje enega ali več znakov tabulatorke ali še huje, novo vrstico? To bo sprožilo celoten postopek, saj se zanašamo na te znake za označevanje stolpcev in prelomov vrstic.

Rešitev je "pobeg" tabulatorjem. V tem primeru bomo zavihke zamenjali z dobesedom \t in prelome vrstic z dobesedom \n, tako da ne bodo vplivali na oblikovanje:

Zdaj, preden se odmeva vsaka vrstica, se vsi tabulatorski znaki zamenjajo z "\t", tako da se naši stolpci ne zlomijo. Tudi vsi prelomi vrstic v podatkih so nadomeščeni z "\n".

.
Metoda, predstavljena v tej opombi, je res zelo preprosta, vendar morda ni vedno priročna.
Obstaja veliko drugih načinov za prenos tabelarnih podatkov iz PHP v Excel, opisal bom tistega, ki se mi je zdel najbolj preprost in funkcionalen. Posebej je treba opozoriti, da ne govorim o generiranju xls datoteke, ampak le predlagam, da uporabnik prejete podatke odpre v Excelu, da uporabniki, ki nimajo izkušenj s programiranjem, ne bodo opazili ponaredka.

Torej, prva stvar je, da na našo stran postavite povezavo do skripta, ki ustvari naslednje glave:
header("Pragma: javno");
header("Poteče: 0");
header("Cache-Control: obvezno ponovno preverjanje, naknadno preverjanje=0, predhodno preverjanje=0");
header("Cache-Control: private", false);
header("Content-Type: application/x-msexcel");
header("Content-Disposition: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $object->getFileSize());

$object je sferični objekt v vakuumu, ki ga vsak bralec izvaja kakor hoče. Namen pridobivalnikov getFileName() in getFileSize() je jasen iz imen. Tukaj je vredno poudariti en neočiten odtenek (hvala, da ste me spomnili na to) - getFileName () seveda lahko vrne katero koli ime datoteke, vendar če želite, da brskalnik ponudi odpiranje prejete vsebine v Excelu, potem razširitev datoteke mora biti xls.
Nič novega še nisem povedal, vse to je bilo izumljeno pred mano, pa tudi tisto, kar bo opisano spodaj.
Kot je bilo pravilno omenjeno v komentarjih k opombi, Excel deluje veliko hitreje z XML. Toda najpomembnejša prednost morda še vedno ni v hitrosti, ampak v veliko več priložnosti. Ne bom se spuščal v divjino, ampak bom dal le preprost primer in povezavo do natančen opis vse oznake.

Torej, potem ko so glave ustvarjene, moramo uporabniku dati dejanske podatke. Generiranje tabele običajno zavijem v ločeno metodo:
echo $object->getContent();

In ustvarim tabelo s pomočjo Smarty:

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

Kot lahko vidite iz kode, je matrika $data, ki vsebuje dve matriki, posredovana predlogi - vrstica glave tabele in dejanski podatki.
Omeniti velja, da je uporaba mehanizma za predloge samo za generiranje XML nekoliko draga in obstaja veliko drugih načinov za pridobitev XML-ja. V mojem posebnem primeru je generiranje XML le majhen bonus v velikem projektu, kjer je mehanizem predloge nepogrešljiv.

Kot primer sem dal najpreprostejšo tabelo, če želite, lahko manipulirate z veliko večjim številom atributov. To je še posebej lepo, če upoštevate, da za implementacijo niso potrebne knjižnice tretjih oseb.
Opisana metoda deluje na istem projektu že nekaj let in niti en uporabnik še ni posumil, da podatki, ki jih odpira, niso dokument MS Office.

Več o strukturi XML, ki se uporablja v MS Excelu, lahko preberete v

Za mnoge pri delu z PHP v povezavi z MySQL obstaja takšna potreba, kot je izvoz podatkov iz baze podatkov v format xls, tako da jih ljudje, ki potrebujejo te podatke, obdelajo v Excelu ali preprosto omogočijo uporabnikom, da si te podatke ogledajo. Pred kratkim sem imel takšno potrebo in danes vam bom povedal, kako je mogoče ta posel izvesti.

Takoj moram reči, da je ta metoda precej preprosta, vendar se podatki nalagajo normalno.

Za začetek bom dal primer končne xls datoteke v programu Nalaganje v Excel bo videti nekako takole:

Z drugimi besedami, naložene ne bodo slike ali slogi, le naslovi stolpcev in sami podatki.

Preden sem prišel ravno do take možnosti nalaganja, sem poskusil naložiti v csv format, pa je izpadlo malo klavrno, potem sem poskusil narisati tabelo in jo shraniti s končnico xls, tudi izpadla je neka neumnost, metoda, ki jo bom zdaj opisal, mi je popolnoma ustrezala in jo bom zdaj delila z vami.

Za začetek bom dal vso kodo, ki sem jo komentiral, kolikor je to mogoče, lahko jo izberete in shranite z razširitvijo php in preizkusite, samo ne pozabite nastaviti nastavitev povezave z bazo podatkov.

Izvoz podatkov iz MySQL v Excel v PHP

In da boste razumeli, katere podatke razkladam, bom dal primer preproste tabele v bazi podatkov ( Imam test njenega imena):

Testna tabela:

id ime ime
1 Ivanov Ivan
2 Petrov Peter
2 Petrov2 Petr2
xlsData = paket ("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // Če je številska funkcija RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $value); return; ) //Če besedilna funkcija RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= pack(" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $value; return; ) // Vstavi številsko funkcijo InsertNumber($value)( if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Vstavi besedilno funkcijo InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Premik v novo vrstico funkcija GoNewLine()( $this->countCol = 0 ; $this->countRow++; return; ) //Končaj podatkovno funkcijo EndData()( $this->xlsData .= pack("ss", 0x0A, 0x00); vrnitev; ) // Shrani datoteko, funkcija SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // Pošlji datoteko, funkcija SendFile()( $this->EndData(); glava (" Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); glava ("Cache-Control: no-store, no-cache, must-revalidate"); glava (" Pragma: brez predpomnilnika"); header("Content-type: application/x-msexcel"); header("Content-Disposition: attachment; fileName=$this->fileName.xls"); print $this- >xlsData ; ) ) ) if(isset($_GET["id"])) ( //filtriraj podatke $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))); $ filename = "File_with_id_".$id; // nastavite ime datoteke $excel = new ExportToExcel(); // ustvarite primerek razreda $sql="SELECT * FROM test.test where id = $id";// poizvedba v zbirko podatkov $rez= mysql_query($sql); $excel->InsertText("ID"); $excel->InsertText("Priimek"); $excel->InsertText("Ime"); $excel ->GoNewLine(); While($ row=mysql_fetch_assoc($rez))( $excel->InsertNumber($row["id"]); $excel->InsertText($row["firstname"]); $excel->InsertText($row["name"]); $excel->GoNewLine(); ) $excel->SaveFile($filename); ) ?>

Celotna ideja tukaj je v funkciji paket(), ki zapakira podatke v binarni niz, mi pa ta niz zaporedno zapolnimo s podatki, ki smo jih razložili iz baze podatkov mysql z uporabo običajne funkcije mysql_query().

Če želite preveriti delovanje te kode, glede na to, da ste vzpostavili povezavo z bazo podatkov in ustvarili podobno tabelo, lahko pošljete naslednjo zahtevo:

http://vaše_mesto/ime_datoteke. php?id=2

Razložiti bi morali dve vrstici z id-jem enakim 2.

In zdaj lahko vsak, ki mu dovolite nalaganje podatkov, preprosto izvozi v svoj lokalni računalnik prek spletnega vmesnika. Ta metoda je primerna tako za poslovne uporabnike, če razvijate aplikacijo za svojo organizacijo, kot za uporabnike vaše spletne strani na internetu. upam, ta metoda Pomagal ti. Vso srečo!

.
Metoda, predstavljena v tej opombi, je res zelo preprosta, vendar morda ni vedno priročna.
Obstaja veliko drugih načinov za prenos tabelarnih podatkov iz PHP v Excel, opisal bom tistega, ki se mi je zdel najbolj preprost in funkcionalen. Posebej je treba opozoriti, da ne govorim o generiranju xls datoteke, ampak le predlagam, da uporabnik prejete podatke odpre v Excelu, da uporabniki, ki nimajo izkušenj s programiranjem, ne bodo opazili ponaredka.

Torej, prva stvar je, da na našo stran postavite povezavo do skripta, ki ustvari naslednje glave:
header("Pragma: javno");
header("Poteče: 0");
header("Cache-Control: obvezno ponovno preverjanje, naknadno preverjanje=0, predhodno preverjanje=0");
header("Cache-Control: private", false);
header("Content-Type: application/x-msexcel");
header("Content-Disposition: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $object->getFileSize());

$object je sferični objekt v vakuumu, ki ga vsak bralec izvaja kakor hoče. Namen pridobivalnikov getFileName() in getFileSize() je jasen iz imen. Tukaj je vredno poudariti eno neočitno nianso (hvala savostinu, da me je spomnil na to) - getFileName() seveda lahko vrne poljubno ime datoteke, če pa želite, da brskalnik ponudi odpiranje prejete vsebine v Excelu, potem končnica datoteke mora biti xls.
Nič novega še nisem povedal, vse to je bilo izumljeno pred mano, pa tudi tisto, kar bo opisano spodaj.
Kot je pravilno poudarjeno v komentarjih k objavi o generiranju xls v PHP, je Excel veliko hitrejši z XML. Toda najpomembnejša prednost morda še vedno ni v hitrosti, ampak v veliko širših možnostih. Ne bom se spuščal v divjino, ampak bom dal le preprost primer in povezavo do podrobnega opisa vseh oznak.

Torej, potem ko so glave ustvarjene, moramo uporabniku dati dejanske podatke. Generiranje tabele običajno zavijem v ločeno metodo:
echo $object->getContent();

In ustvarim tabelo s pomočjo Smarty:

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

Kot lahko vidite iz kode, je matrika $data, ki vsebuje dve matriki, posredovana predlogi - vrstica glave tabele in dejanski podatki.
Omeniti velja, da je uporaba mehanizma za predloge samo za generiranje XML nekoliko draga in obstaja veliko drugih načinov za pridobitev XML-ja. V mojem posebnem primeru je generiranje XML le majhen bonus v velikem projektu, kjer je mehanizem predloge nepogrešljiv.

Kot primer sem dal najpreprostejšo tabelo, če želite, lahko manipulirate z veliko večjim številom atributov. To je še posebej lepo, če upoštevate, da za implementacijo niso potrebne knjižnice tretjih oseb.
Opisana metoda deluje na istem projektu že nekaj let in niti en uporabnik še ni posumil, da podatki, ki jih odpira, niso dokument MS Office.

Več o strukturi XML, ki se uporablja v MS Excelu, lahko preberete v



Povezani članki: