O modalitate ușoară de a transfera date tabulare din PHP în Excel. Exportați date din php în excel tabelul de export PHP în excel

.
Metoda prezentată în acea notă este într-adevăr foarte simplă, dar poate să nu fie întotdeauna convenabilă.
Există multe alte modalități de a transfera date tabulare din PHP în Excel, o voi descrie pe cea care mi s-a părut cea mai simplă și funcțională. De remarcat mai ales că nu vorbesc despre generarea unui fișier xls, ci doar sugerez ca utilizatorul să deschidă datele primite folosind Excel pentru ca utilizatorii care nu au experiență în programare să nu observe falsificarea.

Deci, primul lucru de făcut este să plasăm pe pagina noastră un link către un script care generează următoarele antete:
antet("Pragma: public");
antet ("Expiră: 0");
header("Controlul cache: trebuie revalidat, post-verificare=0, pre-verificare=0");
header("Control-cache: privat", false);
header("Tip de conținut: aplicație/x-msexcel");
header("Conținut-Dispoziție: atașament; nume fișier=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Conținut-Transfer-Codare: binar");
header("Lungimea conținutului: " . $object->getFileSize());

$object este un obiect sferic în vid, pe care fiecare cititor îl implementează cum vrea. Scopul getter-urilor getFileName() și getFileSize() este clar din nume. Aici merită să evidențiem o nuanță neevidentă (mulțumesc că mi-ai amintit despre asta) - getFileName () poate returna, desigur, orice nume de fișier, dar dacă doriți ca browserul să ofere deschiderea conținutului primit în Excel, atunci extensia de fișier trebuie să fie xls.
Nu am spus nimic nou încă, toate acestea au fost inventate înaintea mea, totuși, precum și ceea ce va fi descris mai jos.
După cum s-a menționat pe bună dreptate în comentariile la notă, Excel funcționează mult mai rapid cu XML. Dar cel mai important avantaj, poate, nu este încă în viteză, ci în posibilități mult mai largi. Nu mă voi adânci în sălbăticie, ci voi da doar un exemplu simplu și un link către descriere detaliata toate etichetele.

Deci, după ce anteturile sunt generate, trebuie să oferim utilizatorului datele reale. De obicei, împachetez generarea tabelelor într-o metodă separată:
echo $obiect->getContent();

Și generez tabelul folosind Smarty:

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

După cum puteți vedea din cod, matricea $data care conține două matrice este transmisă șablonului - linia antetului tabelului și datele reale.
Este demn de remarcat faptul că utilizarea unui motor de șablon numai pentru a genera XML este oarecum costisitoare și există multe alte modalități de a obține XML. În cazul meu particular, generarea XML este doar un mic bonus într-un proiect mare în care un motor de șablon este indispensabil.

Ca exemplu, am dat cel mai simplu tabel, dacă doriți, puteți manipula un număr mult mai mare de atribute. Acest lucru este deosebit de frumos dacă țineți cont de faptul că nu sunt necesare biblioteci terțe pentru implementare.
Metoda descrisă lucrează la același proiect de câțiva ani și niciun utilizator nu a bănuit încă că datele pe care le deschide nu sunt un document MS Office.

Puteți citi mai multe despre structura XML utilizată în MS Excel în

(date preluate din baza de date mysql) pentru a reuși. Folosesc Zend Framework. Trebuie să fac unele modificări la datele mele înainte de a exporta în Excel. De fapt, chiar trebuie să-mi creez o carte de numerar lunară.

Am citit o mulțime de documente, dar am ajuns în mizerie. Chiar nu înțeleg cum să încep. Chiar am nevoie de PEAR? Trebuie să încarc vreo bibliotecă de clasă? nu-i aşa? calea ușoară pentru a face acest lucru?

multumesc anticipat

Vă sugerez să utilizați biblioteca PHPExcel PHPExcel. Este cu adevărat puternic, acceptă diverse formate, poate face formatare vizuală și este ușor de utilizat.

Puteți afla mai multe despre aceasta pe pagina lor web: http://phpexcel.codeplex.com/ (PHPExcel s-a mutat deja la https://github.com/PHPOffice/PHPExcel)

Exemplu de utilizare:

$objPHPExcel = PHPExcel nou(); /** Puteți seta multe proprietăți */ $objPHPExcel->getProperties()->setCreator("Compania mea") ->setLastModifiedBy("John Doe") ->setTitle("Raport anual") ->setSubject("Vânzări ") ->setDescription("Raport anual de vânzări de John Doe") ->setCategory("Finanțe"); /** Alegeți una dintre foi */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Pur și simplu setați valoarea celulei */ $activeSheet->setCellValue("A1", "plural");

Puteți face mult mai mult, desigur, citind fișiere Excel, setând stiluri vizuale, creând grafice, expresii și multe altele.

Am scris un raport de variație a inventarului pe 94 de rânduri în care iau date din MySQL (6 kb + înregistrări per tabel), creez matrice multidimensională din datele MySQL, extrase din mai multe tabele și apoi aruncat totul într-o singură linie și generat .xls astfel:

Nu sunt necesare extensii.

Singurele avertismente sunt că încă nu mi-am dat seama cum să scuipat .xls fără Excel, spunându-vă că datele pot fi corupte - și nu am încercat să formatez sau să fac ceva mai complicat decât doar „exportul” datelor. , fișierul/datele sunt ok desigur, dar generează un avertisment din excel.

EDIT: Ar trebui să rețin că „setup” și „dump” se referă la: daniweb.com

Puteți folosi biblioteca phpexcel. Acest lucru vă permite să scrieți și să citiți din diferite formate fișiere foi de calcul

pentru a te integra cu zend poți folosi ajutorul următorului link.

Puteți folosi CSV pentru a crea un format importabil pentru Excel. Acesta este cel mai simplu mod de a o face.

CSV arată astfel:

„conținutul primei celule”, „conținutul celui de-al doilea”, „conținutul celui de-al treilea” „a doua linie, conținutul primei celule”, „etc”, „etc

Fiecare rând reprezintă un rând Excel, între care plasați conținutul celulei ghilimele dubleși separați cu virgule. Fiți atenți dacă aveți unele dintre datele dvs., acest lucru vă poate rupe CSV și poate crea linii noi nedorite.

Cu puțin Google ai găsi asta: http://www.the-art-of-web.com/php/dataexport/

Pregătirea datelor

$date = array(array("firstname" => "Mary", "lastname" => "Johnson", "varsta" => 25), array("firstname" => "Amanda", "lastname" => " Miller", "varsta" => 18), array("firstname" => "James", "lastname" => "Maro", "varsta" => 31), array("firstname" => "Patricia", "lastname" => "Williams", "varsta" => 7), array("firstname" => "Michael", "lastname" => "Davis", "varsta" => 43), array("prenume" => "Sarah", "lastname" => "Miller", "varsta" => 24), array ("firstname" => "Patrick", "lastname" => "Miller", "varsta" => 27) );

Primul pas este să scoateți datele în format delimitat de tabulatori (se poate folosi și CSV, dar este puțin mai complicat). Pentru aceasta folosim următorul cod:

Am setat tipul de conținut la text/plain, astfel încât rezultatul să poată fi vizualizat mai ușor într-un browser. În caz contrar, deoarece nu există format HTML, rezultatul va fi afișat ca o singură linie de text.

Prima linie a rezultatului va fi anteturile coloanelor (în acest caz, sunt folosite numele câmpurilor). Valorile sunt separate prin tab \t și linii cu întreruperi de linie \n. Rezultatul ar trebui să arate cam așa:

Prenume prenume vârsta Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

Există o slăbiciune în acest cod care poate să nu fie imediat evidentă. Ce se întâmplă dacă unul dintre câmpurile care urmează să fie afișate conține deja unul sau mai multe caractere de tabulație sau, mai rău, linie nouă? Acest lucru va declanșa întregul proces, deoarece ne bazăm pe aceste caractere pentru a indica coloanele și rupturile de rând.

Soluția este să „escape” caracterele de filă. În acest caz, vom înlocui file-urile cu literal \t și rupturile de linie cu literal \n, astfel încât acestea să nu afecteze formatarea:

Acum, înainte ca fiecare linie să fie ecou, ​​orice caractere de tabulatură sunt înlocuite cu „\t”, astfel încât coloanele noastre să nu se rupă. De asemenea, orice întreruperi de linie din date sunt înlocuite cu „\n”.

.
Metoda prezentată în acea notă este într-adevăr foarte simplă, dar poate să nu fie întotdeauna convenabilă.
Există multe alte modalități de a transfera date tabulare din PHP în Excel, o voi descrie pe cea care mi s-a părut cea mai simplă și funcțională. De remarcat mai ales că nu vorbesc despre generarea unui fișier xls, ci doar sugerez ca utilizatorul să deschidă datele primite folosind Excel pentru ca utilizatorii care nu au experiență în programare să nu observe falsificarea.

Deci, primul lucru de făcut este să plasăm pe pagina noastră un link către un script care generează următoarele antete:
antet("Pragma: public");
antet ("Expiră: 0");
header("Controlul cache: trebuie revalidat, post-verificare=0, pre-verificare=0");
header("Control-cache: privat", false);
header("Tip de conținut: aplicație/x-msexcel");
header("Conținut-Dispoziție: atașament; nume fișier=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Conținut-Transfer-Codare: binar");
header("Lungimea conținutului: " . $object->getFileSize());

$object este un obiect sferic în vid, pe care fiecare cititor îl implementează cum vrea. Scopul getter-urilor getFileName() și getFileSize() este clar din nume. Aici merită să evidențiem o nuanță neevidentă (mulțumesc lui Savostin pentru că mi-a reamintit despre asta) - getFileName() poate returna, desigur, orice nume de fișier, dar dacă doriți ca browserul să ofere deschiderea conținutului primit în Excel, atunci extensia fișierului trebuie să fie xls.
Nu am spus nimic nou încă, toate acestea au fost inventate înaintea mea, totuși, precum și ceea ce va fi descris mai jos.
După cum s-a subliniat pe bună dreptate în comentariile postării despre generarea xls în PHP, Excel este mult mai rapid cu XML. Dar cel mai important avantaj, poate, nu este încă în viteză, ci în posibilități mult mai largi. Nu mă voi adânci în sălbăticie, ci voi oferi doar un exemplu simplu și un link către o descriere detaliată a tuturor etichetelor.

Deci, după ce anteturile sunt generate, trebuie să oferim utilizatorului datele reale. De obicei, împachetez generarea tabelelor într-o metodă separată:
echo $obiect->getContent();

Și generez tabelul folosind Smarty:

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

După cum puteți vedea din cod, matricea $data care conține două matrice este transmisă șablonului - linia antetului tabelului și datele reale.
Este demn de remarcat faptul că utilizarea unui motor de șablon numai pentru a genera XML este oarecum costisitoare și există multe alte modalități de a obține XML. În cazul meu particular, generarea XML este doar un mic bonus într-un proiect mare în care un motor de șablon este indispensabil.

Ca exemplu, am dat cel mai simplu tabel, dacă doriți, puteți manipula un număr mult mai mare de atribute. Acest lucru este deosebit de frumos dacă țineți cont de faptul că nu sunt necesare biblioteci terțe pentru implementare.
Metoda descrisă lucrează la același proiect de câțiva ani și niciun utilizator nu a bănuit încă că datele pe care le deschide nu sunt un document MS Office.

Puteți citi mai multe despre structura XML utilizată în MS Excel în

Pentru mulți, atunci când lucrează cu PHP împreună cu MySQL există o astfel de nevoie precum exportul de date din baza de date în formatul xls, astfel încât persoanele care au nevoie de aceste date le prelucrează în Excel sau pur și simplu să le faciliteze utilizatorilor să vizualizeze aceste date. Recent am avut o astfel de nevoie și astăzi vă voi spune cum se poate implementa această afacere.

Trebuie să spun imediat că această metodă este destul de simplă, dar datele sunt încărcate normal.

Pentru început, voi da un exemplu de fișier xls final, în Excel încărcarea va arăta cam așa:

Cu alte cuvinte, nu vor fi încărcate imagini sau stiluri, ci doar antetele coloanelor și datele în sine.

Înainte de a ajunge la o astfel de opțiune de încărcare, am încercat să încărc în format csv, dar a ieșit puțin stângaci, apoi am încercat să desenez un tabel și să-l salvez cu extensia xls, s-a dovedit și un fel de prostie, metoda pe care o voi descrie acum mi s-a potrivit pe deplin si acum o voi impartasi cu voi.

Pentru început, voi da tot codul pe care l-am comentat pe cât posibil, îl puteți selecta și salva cu extensia phpși încercați, doar nu uitați să setați setările de conexiune la baza de date.

Exportați date din MySQL în Excel în PHP

Și pentru a înțelege ce date descarc, voi da un exemplu de tabel simplu în baza de date ( Am testul numelui ei):

Tabel de testare:

id Nume Nume
1 Ivanov Ivan
2 Petrov Petru
2 Petrov2 Petr2
xlsData = pachet("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // Dacă funcția de număr RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pachet("d", $valoare); return; ) //Dacă funcția text RecText($rând, $col, $valoare)( $len = strlen($valoare); $this->xlsData .= pachet(" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $valoare; return; ) // Inserați funcția de număr InsertNumber($valoare)( dacă ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $valoare); $this->countCol++; return; ) // Inserați funcția text InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Treceți la o nouă funcție de linie GoNewLine()( $this->countCol = 0 ; $this->countRow++; return; ) //Încheierea funcției de date EndData()( $this->xlsData .= pack("ss", 0x0A, 0x00); întoarcere; ) // Salvați funcția fișier SaveFile($fileName)( $this->fileName = $fișierName; $this->SendFile(); ) // Trimiteți funcția fișier SendFile()( $this->EndData(); antet (" Ultima modificare: " . gmdate ("D,d M YH:i:s") . " GMT"); antet ("Cache-Control: fără stocare, fără cache, revalidare obligatorie"); antet ("Pragma: fără cache"); antet ("Tip de conținut: aplicație/x-msexcel"); antet ("Dispoziție de conținut: atașament; nume fișier=$this->fileName.xls"); imprimați $this- >xlsData ; ) ) ) if(isset($_GET["id"])) ( //filtrează datele $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))); $ filename = "File_with_id_".$id; // setează numele fișierului $excel = new ExportToExcel(); // creează o instanță a clasei $sql="SELECT * FROM test.test unde id = $id";// interogare la baza de date $rez= mysql_query($sql); $excel->InsertText("ID"); $excel->InsertText("Last Name"); $excel->InsertText("First Name"); $excel ->GoNewLine(); While($ row=mysql_fetch_assoc($rez))($excel->InsertNumber($r) ow[„id”]); $excel->InsertText($row["prenume"]); $excel->InsertText($row["nume"]); $excel->GoNewLine(); ) $excel->SaveFile($filename); ) ?>

Întreaga idee aici este în funcție ambalaj(), care împachetează datele într-un șir binar și noi, la rândul nostru, umplem secvențial acest șir cu datele pe care le-am descărcat din baza de date mysql folosind funcția normală mysql_query().

Pentru a verifica performanța acestui cod, având în vedere că ați stabilit o conexiune la baza de date și ați creat un tabel similar, puteți trimite următoarea solicitare:

Http://site-ul_dvs./nume_fișier. php?id=2

Și ar trebui să descărcați două rânduri cu id-ul egal cu 2.

Și acum toți cei cărora le permiteți să încarce date le pot exporta cu ușurință pe computerul local prin intermediul interfata web. Această metodă este convenabilă atât pentru utilizatorii corporativi, dacă dezvoltați o aplicație pentru organizația dvs., cât și pentru utilizatorii site-ului dvs. web de pe Internet. Speranţă, Pe aici Te-am ajutat. Noroc!