.
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 despre 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, totuși, 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 oferi 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:
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
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 prelucrează în Excel sau pur și simplu este convenabil pentru utilizatori să vizualizeze 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 la această opțiune specială 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, de asemenea, a fi un fel de prostie, metoda pe care o voi descrie acum mi s-a potrivit pe deplin, iar acum o voi împărtăși cu voi.
Pentru început, vă voi da tot codul, pe care l-am comentat cât mai mult posibil, îl puteți selecta și salva cu extensia php și încercați, doar nu uitați să specificați setările conexiunii la baza de date.
Ș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 |
) // 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ță pe computerul local prin interfața 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. Sper că te-a ajutat această metodă. 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ă evidențiem o nuanță neevidentă aici (mulțumesc lui Savostin pentru că mi-a reamintit acest lucru) - 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, totuși, 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 oferi 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:
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
Un obiect. Dar lucrurile stau diferit dacă trebuie să generați un raport în format Excel pe PHP. Și pentru ca această creație să funcționeze UNIX-sisteme asemănătoare. Dar, din fericire, totul nu este atât de rău. Și există suficiente biblioteci pentru asta. Am ales PHPExcel. Lucrez cu această bibliotecă de câțiva ani și sunt mulțumit. Deoarece este multiplatformă, nu există probleme de portabilitate.
PHPExcel vă permite să importați și să exportați date în Excel. Aplicați diferite stiluri de design la rapoarte. În general, totul este excelent. Există chiar și capacitatea de a lucra cu formule. Este necesar doar să se țină cont de faptul că toate lucrările (citirea și scrierea) trebuie efectuate în codificare utf-8.
Instalarea bibliotecii
Pentru a funcționa, aveți nevoie de versiunea PHP 5.2.0 sau mai mare. Sunt necesare și următoarele extensii: php_zip, php_xml și php_gd2. Puteți descărca biblioteca de aici.
Folosind biblioteca PHPExcel, puteți scrie date în următoarele formate:
Să ne uităm la un exemplu de formare a unei tabele de înmulțire.
) ) // Ieșire antet HTTP ("Expiră: Luni, 1 Apr 1974 05:00:00 GMT"); header("Ultima modificare: " . gmdate ("D,d M YH:i:s") . " GMT");
header("Control-cache: fără cache, trebuie revalidat");
și în loc de „php://output” ar trebui să specificați calea către fișierul dvs. Rețineți că directorul în care ar trebui să fie creat fișierul trebuie să aibă permisiuni de scriere. Acest lucru se aplică sistemelor asemănătoare UNIX.
După cum putem vedea, metodele de mai sus sunt împerecheate. Prin urmare, putem lucra cu celule folosind șiruri de caractere sau reprezentarea numerică a coordonatelor. Ceea ce desigur este un avantaj suplimentar la locul de muncă.
Foarte des este nevoie de evidențierea unor date într-un raport. Evidențiați un font sau aplicați un cadru de umplere a fundalului unor celule etc. Acest lucru vă permite să vă concentrați asupra celor mai importante informații (deși vă poate distrage atenția). În aceste scopuri, biblioteca PHPExcel are un întreg set de stiluri care pot fi aplicate celulelor din Excel. Desigur, există un mic „minus” în această bibliotecă - nu puteți aplica un stil mai multor celule în același timp, ci numai fiecăruia individual. Dar acest lucru nu creează disconfort la dezvoltarea aplicațiilor web.
Există două moduri de a atribui un stil unei celule:
Valoarea parametrului umple este o matrice cu următorii parametri opționali:
FILL_NONE | nici unul |
FILL_SOLID | solid |
FILL_GRADIENT_LINEAR | liniar |
FILL_GRADIENT_PATH | cale |
FILL_PATTERN_DARKDOWN | întuneric în jos |
FILL_PATTERN_DARKGRAY | gri închis |
FILL_PATTERN_DARKGRID | darkGrid |
FILL_PATTERN_DARKHORIZONTAL | întunecatHorizontal |
FILL_PATTERN_DARKTRELLIS | DarkTrellis |
FILL_PATTERN_DARKUP | întuneric |
FILL_PATTERN_DARKVERTICAL | darkVertical |
FILL_PATTERN_GRAY0625 | gri0625 |
FILL_PATTERN_GRAY125 | gri125 |
FILL_PATTERN_LIGHTDOWN | lightDown |
FILL_PATTERN_LIGHTGRAY | gri deschis |
FILL_PATTERN_LIGHTGRID | lightGrid |
FILL_PATTERN_LIGHTHORIZONTAL | luminăOrizontală |
FILL_PATTERN_LIGHTTRELLIS | LightTrellis |
FILL_PATTERN_LIGHTUP | aprinde |
FILL_PATTERN_LIGHTVERTICAL | luminăVerticală |
FILL_PATTERN_MEDIUMGRAY | Gri mediu |
Sau puteți folosi următoarele metode:
$PHPExcel_Style->getFill()->setFillType(PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR);
$PHPExcel_Style->getFill()->setRotation(0);
$PHPExcel_Style->getFill()->getStartColor()->applyFromArray(array("rgb" => "C2FABD"));
$PHPExcel_Style->getFill()->getEndColor()->applyFromArray(array("argb" => "FFFFFFFF")).
Destul de rar, dar poate fi util să inserați o imagine într-un raport. Acesta ar putea fi un logo, o diagramă etc. Pentru a lucra vom avea nevoie de următoarele metode:
Codul care demonstrează algoritmul de inserare a unei imagini este prezentat mai jos:
Iată cum arată un raport cu o imagine inserată:
font este specificată o matrice care conține următorii parametri opționali:
UNDERLINE_NONE | Nu |
UNDERLINE_DOUBLE | subliniere dublă |
UNDERLINE_SINGLE | unică subliniere |
Sau utilizați următoarele metode:
$PHPExcel_Style->getFont()->setName(‘Arial’);
$PHPExcel_Style->getFont()->setBold(true);
$PHPExcel_Style->getFont()->setItalic(false);
$PHPExcel_Style->getFont()->setSuperScript(false);
$PHPExcel_Style->getFont()->setSubScript(false);
$PHPExcel_Style->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLE);
$PHPExcel_Style->getFont()->setStrikethrough(false);
$PHPExcel_Style->getFont()->getColor()->applyFromArray(array("rgb" => "808080"));
$PHPExcel_Style->getFont()->setSize(12).
Ca valoare a parametrului frontiere este specificată o matrice care conține următorii parametri opționali:
De asemenea, puteți recurge la următoarele metode:
$PHPExcel_Style->getBorders()->getLeft()->applyFromArray(array('style' =>PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')));
$PHPExcel_Style->getBorders()->getRight()->applyFromArray(array('style' =>PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')));
$PHPExcel_Style->getBorders()->getTop()->applyFromArray(array('style' =>PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')));
$PHPExcel_Style->getBorders()->getBottom()->applyFromArray(array('style' =>PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')));
$PHPExcel_Style->getBorders()->getDiagonal()->applyFromArray(array('style' => PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')));
$PHPExcel_Style->getBorders()->setDiagonalDirection(array('style' =>PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080'))).
Valoarea parametrului aliniere este o matrice care ia patru parametri opționali ca intrare:
VERTICAL_BOTTOM | de-a lungul marginii inferioare |
VERTICAL_SUS | de-a lungul marginii superioare |
VERTICAL_CENTER | în centru |
VERTICAL_JUSTIFY | in inaltime |
$PHPExcel_Style->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$PHPExcel_Style->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_JUSTIFY);
$PHPExcel_Style->getAlignment()->setTextRotation(10);
$PHPExcel_Style->getAlignment()->setWrapText(true);
$PHPExcel_Style->getAlignment()->setShrinkToFit(false);
$PHPExcel_Style->getAlignment()->setIndent(5).
Parametru format numeric este o matrice care include un singur parametru: cod- formatul datelor celulei.
FORMAT_GENERAL | General |
FORMAT_TEXT | @ |
FORMAT_NUMBER | 0 |
FORMAT_NUMBER_00 | 0.00 |
FORMAT_NUMBER_COMMA_SEPARATED1 | #,##0.00 |
FORMAT_NUMBER_COMMA_SEPARATED2 | #,##0.00_- |
FORMAT_PERCENTAGE | 0% |
FORMAT_PERCENTAGE_00 | 0.00% |
FORMAT_DATE_AAAAMMDD2 | aaaa-mm-zz |
FORMAT_DATE_AAAAMMDD | aa-mm-zz |
FORMAT_DATE_DDMMAAAA | zz/ll/aa |
FORMAT_DATE_DMYSLASH | d/l/a |
FORMAT_DATE_DMYMINUS | d-m-a |
FORMAT_DATE_DMMINUS | d-m |
FORMAT_DATE_MYMINUS | mele |
FORMAT_DATE_XLSX14 | mm-zz-aa |
FORMAT_DATE_XLSX15 | d-mmm-aa |
FORMAT_DATE_XLSX16 | d-mmm |
FORMAT_DATE_XLSX17 | mmm-aa |
FORMAT_DATE_XLSX22 | l/z/aa h:mm |
FORMAT_DATE_DATETIME | d/l/a h:mm |
FORMAT_DATE_TIME1 | h:mm AM/PM |
FORMAT_DATE_TIME2 | h:mm:ss AM/PM |
FORMAT_DATE_TIME3 | h:mm |
FORMAT_DATE_TIME4 | h:mm:ss |
FORMAT_DATE_TIME5 | mm:ss |
FORMAT_DATE_TIME6 | h:mm:ss |
FORMAT_DATE_TIME7 | eu:s.S |
FORMAT_DATE_TIME8 | h:mm:ss |
FORMAT_DATE_YYYYMMDDSLASH | aa/ll/zz; @ |
FORMAT_CURRENCY_USD_SIMPLE | "$"#,##0.00_-;@ |
FORMAT_CURRENCY_USD | $#,##0_- |
FORMAT_CURRENCY_EUR_SIMPLE | [$EUR ]#,##0,00_- |
Sau puteți folosi metoda:
$PHPExcel_Style->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE);
Ca valoare a parametrului protecţie acționează ca o matrice care conține doi parametri opționali:
Sau utilizați următoarele metode:
$PHPExcel_Style->getProtection()->setLocked(true);
$PHPExcel_Style->getProtection()->setHidden(false);
Acum știm ce setări de stil există și ce parametri are fiecare stil. Acum vom aplica un stil de design celulelor tabelului, dar vom face acest lucru în două moduri. Prima metodă este de a crea o matrice de setări, pe care le vom transmite ca parametru metodei applyFromArray, clasa PHPExcel_Style.
$sheet->getStyleByColumnAndRow($i - 2, $j)->applyFromArray($style);
Acum să aplicăm același stil, dar folosind o tehnică diferită.
Iată ce avem:
Dacă trebuie să aplicați stilul de mai multe ori, atunci prima metodă este mai bună, în alte cazuri, este mai bine să rămâneți la a doua. Pentru a obține un obiect (instanță de clasă PHPExcel_Style) celule responsabile pentru stil, trebuie să utilizați una dintre următoarele metode:
Cred că nu se întâmplă des ca cineva să folosească oportunitatea pentru a adăuga comentarii în celule, dar aceasta este părerea mea pur personală, dar o astfel de oportunitate există. Adăugarea unui comentariu la o celulă este destul de simplă, așa cum puteți vedea în exemplul de mai jos:
Trebuie remarcat faptul că atunci când apelați din nou metoda createTextRun() noul comentariu va fi adăugat celui existent, în loc să-l înlocuiască. Trebuie remarcat faptul că această metodă returnează un obiect din clasa PHPExcel_RichText_Run, care are metode pentru setarea și obținerea parametrilor fontului:
Acesta este genul de comentariu pe care ar trebui să-l primim.