O modalitate ușoară de a transfera date tabulare din PHP în Excel. Exportați date din php în excel Exportați tabelul 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 mai 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, astfel încât utilizatorii care nu au experiență în programare să nu observe falsificarea.

Deci, primul lucru pe care trebuie să-l faceți este să plasați 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 poate implementa după cum vrea. Scopul getter-urilor getFileName() și getFileSize() este clar din numele lor. Merită să evidențiezi o nuanță neevidentă aici (mulțumesc că mi-ai amintit asta) - getFileName() poate returna, desigur, orice nume de fișier, dar dacă vrei ca browserul să ofere deschiderea conținutului primit în Excel, atunci extensia fișierului ar trebui să fie xls.
Nu am spus încă nimic nou; toate acestea au fost inventate înaintea mea, la fel ca ceea ce va fi descris mai jos.
După cum s-a menționat pe bună dreptate în comentariile articolului, Excel funcționează mult mai rapid cu XML. Dar cel mai important avantaj, poate, nu este viteza, ci capabilități mult mai largi. Nu voi intra mai adânc în buruieni, ci voi da doar un exemplu simplu și un link către descriere detaliată toate etichetele.

Deci, după ce anteturile sunt generate, trebuie să dăm datele reale utilizatorului. 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)(/foreach)(foreach from=$data.content item=row) (foreach from=$row item=col) ($col)(/foreach)(/foreach)

După cum puteți vedea din cod, matricea $data este transmisă șablonului, care conține două matrice - linia de titlu a tabelului și datele în sine.
Este demn de remarcat faptul că utilizarea unui motor de șablon numai pentru a genera XML este oarecum costisitoare, iar XML poate fi obținut în multe alte moduri. Î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 cea mai simplă masă, multe alte atribute pot fi manipulate dacă se dorește. Acest lucru este deosebit de frumos având în vedere că nu sunt necesare biblioteci terțe pentru implementare.
Metoda descrisă lucrează la un singur 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 obținute 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, trebuie să creez o carte de numerar lunară.

Am citit o mulțime de documente, dar m-am trezit în mizerie. Chiar nu știu cum să încep. Chiar am nevoie de PEAR? Trebuie să încarc vreo bibliotecă de clasă? Nu-i aşa mod simplu face asta?

Mulţumesc anticipat

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

Puteți afla mai multe despre el 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, stabilirea stilurilor vizuale, crearea de 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 (6kb + înregistrări per tabel), creez matrice multidimensională din datele MySQL, extrase din mai multe tabele și apoi aruncat totul într-un singur rând și generat .xls în acest fel:

Nu sunt necesare extensii.

Singurele avertismente sunt că încă nu mi-am dat seama cum să scuipă .xls fără Excel, raportând că datele pot fi corupte - și nu am încercat să formatez sau să fac ceva mai complex decât doar „exportarea” 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 următoarele: daniweb.com

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

pentru integrarea zend puteți lua 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 puneți conținutul celulei ghilimele dubleși separați cu virgule. Fiți atenți dacă aveți unele dintre datele dvs., acestea ar putea rupe CSV și crea rânduri noi nedorite.

Cu puțin Google ați 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 a face acest lucru folosim următorul cod:

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

Prima linie de ieșire 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 trebuie să fie scoase deja conține 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 simboluri pentru a indica coloanele și rupturile de linie.

Soluția este să „escape” caracterele de filă. În acest caz, vom înlocui filele 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 tabulație 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”.

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 format xls, astfel încât persoanele care au nevoie de aceste date le procesează programul Excel sau pur și simplu era convenabil pentru utilizatori să vadă aceste date. Recent am avut o astfel de nevoie și astăzi vă voi spune cum poate fi implementată această chestiune.

Voi spune 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 de coloană și datele în sine.

Înainte să ajung exact la această opțiune de încărcare, am încercat încărcarea î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 și acum o voi împărtăși cu voi.

Pentru început, vă dau tot codul, pe care l-am comentat cât mai mult posibil, îl puteți selecta și salva cu extensia phpși încercați, nu uitați să specificați setările de conectare la baza de date.

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

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

Tabel de testare:

id prenume nume
1 Ivanov Ivan
2 Petrov Petru
2 Petrov2 Petru2
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 . = pack("d", $valoare ) //Dacă funcția text RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= (" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len->xlsData .= $value ) // Inserați o funcție numerică ($value); if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $ valoare); $this->countCol++; >countRow++ ) $this->RecText($this->countRow, $this->countCol++)( $this->; countCol = 0 ; $this->countRow++; reveni; ) // Salvați funcția fișier SaveFile($fileName)( $this->fileName = $fișierName; $this->SendFile(); ) // Trimiteți funcția fișier SendFile())( $this->EndData(); antet (" Last-Modified: " . gmdate ("D,d M YH:i:s") . " GMT" ("Cache-Control: no-store, no-cache, must-revalidate"); header ("Pragma: no-cache"); header("Tip de conținut: aplicație/x-msexcel"); ->xlsData ; ) ) ) if(isset($_GET["id"])) ( //filtrați 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(); //interogare la baza de date $rez= mysql_query($sql->InsertText("Identifier"->InsertText("Last Name->InsertText"); excel->GoNewLine(); row=mysql_fetch_assoc($rez))( $excel->InsertNumber($row["id"]);$excel->InsertText($row["prenume"]); $excel->InsertText($row[„nume”]);$excel->GoNewLine(); ) $excel->SaveFile($filename);.

Pentru a verifica funcționalitatea acestui cod, ținând cont de faptul că ați configurat 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ă linii cu id egal cu 2.

Și acum oricine îi permiteți să încarce date le poate exporta cu ușurință în propria lor calculator local prin 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. de pe Internet. Speranţă, această metodă Te-am ajutat. Noroc!

.
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 mai 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, astfel încât utilizatorii care nu au experiență în programare să nu observe falsificarea.

Deci, primul lucru pe care trebuie să-l faceți este să plasați 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 poate implementa după cum vrea. Scopul getter-urilor getFileName() și getFileSize() este clar din numele lor. Merită să subliniem aici o nuanță neevidentă (mulțumesc lui Savostin pentru că mi-a amintit de 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 fișierul extensia ar trebui să fie xls.
Nu am spus încă nimic nou; toate acestea au fost inventate înaintea mea, la fel ca ceea ce va fi descris mai jos.
După cum s-a menționat pe bună dreptate în comentariile postării despre generarea xls în PHP, Excel funcționează mult mai rapid cu XML. Dar cel mai important avantaj, poate, nu este viteza, ci capabilități mult mai largi. Nu voi intra mai adânc în buruieni, ci voi da doar un exemplu simplu și un link către o descriere detaliată a tuturor etichetelor.

Deci, după ce anteturile sunt generate, trebuie să dăm datele reale utilizatorului. 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)(/foreach)(foreach from=$data.content item=row) (foreach from=$row item=col) ($col)(/foreach)(/foreach)

După cum puteți vedea din cod, matricea $data este transmisă șablonului, care conține două matrice - linia de titlu a tabelului și datele în sine.
Este demn de remarcat faptul că utilizarea unui motor de șablon numai pentru a genera XML este oarecum costisitoare, iar XML poate fi obținut în multe alte moduri. Î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 un tabel simplu, dacă doriți, puteți manipula un număr mult mai mare de atribute; Acest lucru este deosebit de frumos având în vedere că nu sunt necesare biblioteci terțe pentru implementare.
Metoda descrisă lucrează la un singur 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