Tietojen lataaminen excelistä php:hen. Helppo tapa siirtää taulukkotietoja PHP:stä Exceliin. Vie tietoja MySQL:stä Exceliin PHP:ssä

(tiedot saatu mysql-tietokannasta) onnistuaksesi. Käytän Zend Frameworkia. Minun on tehtävä joitain muutoksia tietoihini ennen vientiä Exceliin. Itse asiassa minun on itse asiassa luotava kuukausittainen kassakirja.

Luin paljon asiakirjoja, mutta huomasin olevani sekaisin. En todellakaan tiedä miten aloittaa. Tarvitsenko todella päärynää? Pitääkö minun ladata jokin luokan kirjasto? Eikö ole helppoa tapaa tehdä tämä?

Kiitos jo etukäteen

Suosittelen käyttämään PHPExcel-kirjastoa. Se on todella tehokas, tukee useita muotoja, voi tehdä visuaalista muotoilua ja on helppokäyttöinen.

Voit lukea siitä lisää heidän verkkosivuillaan: http://phpexcel.codeplex.com/, (PHPExcel on jo muuttanut osoitteeseen https://github.com/PHPOffice/PHPExcel)

Käyttöesimerkki:

$objPHPExcel = uusi PHPExcel(); /** Voit asettaa monia ominaisuuksia */ $objPHPExcel->getProperties()->setCreator("Oma yritys") ->setLastModifiedBy("John Doe") ->setTitle("Vuosiraportti") ->setSubject("Myynti" ") ->setDescription("John Doen vuosikertomus") ->setCategory("Rahoitus"); /** Valitse yksi taulukoista */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Aseta vain solun arvo */ $activeSheet->setCellValue("A1", "monikko");

Voit tietysti tehdä paljon muutakin lukemalla Excel-tiedostoja, asettamalla visuaalisia tyylejä, luomalla kaavioita, lausekkeita ja paljon muuta.

Kirjoitin 94 rivin inventaariovariaatioraportin, jossa otan tiedot MySQL:stä (6 kt + tietueet per taulukko), luon moniulotteisen taulukon MySQL-tiedoista, vedin useista taulukoista ja vedin sitten kaiken yhdeksi riviksi ja luon .xls:n.

Laajennuksia ei tarvita.

Ainoat varoitukset ovat, että en ole vielä keksinyt, kuinka sylkeä .xls ilman Exceliä ja ilmoittaa, että tiedot voivat olla vioittuneet - enkä ole yrittänyt tehdä muotoilua tai mitään monimutkaisempaa kuin vain "vienti" tietoja, Tiedosto/tiedot ovat tietysti kunnossa, mutta se luo varoituksen Excelistä.

EDIT: Huomaa, että "setup" ja "dump" viittaavat seuraavaan: daniweb.com

Voit käyttää phpexcel-kirjastoa. Sen avulla voit kirjoittaa ja lukea eria

Zend-integraatiossa voit käyttää seuraavaa linkkiä.

CSV:n avulla voit luoda tuotavan muodon Excelille. Tämä on helpoin tapa tehdä se.

CSV näyttää tältä:

"ensimmäisen solun sisältö", "toisen solun sisältö", "kolmannen solun sisältö" "toinen rivi, ensimmäisen solun sisältö", "etc", "etc

Jokainen rivi edustaa Excel-merkkijonoa, solun sisältö laitetaan lainausmerkkien väliin ja erotetaan pilkuilla. Ole varovainen, jos sinulla on tietojasi, se voi rikkoa CSV-tiedoston ja luoda ei-toivottuja uusia rivejä.

Pienellä Googlella löytäisit tämän: http://www.the-art-of-web.com/php/dataexport/

Tietojen valmistelu

$data = array(array("etunimi" => "Maria", "sukunimi" => "Johnson", "ikä" => 25), array("etunimi" => "Amanda", "sukunimi" => " Miller", "ikä" => 18), array("etunimi" => "James", "sukunimi" => "ruskea", "ikä" => 31), array("etunimi" => "Patricia", "sukunimi" => "Williams", "ikä" => 7), array("etunimi" => "Michael", "sukunimi" => "Davis", "ikä" => 43), array("etunimi" => "Sarah", "sukunimi" => "Miller", "ikä" => 24), array("etunimi" => "Patrick", "sukunimi" => "Miller", "ikä" => 27) );

Ensimmäinen vaihe on tulostaa tiedot sarkainerotetussa muodossa (myös CSV:tä voidaan käyttää, mutta se on hieman monimutkaisempaa). Tätä varten käytämme seuraavaa koodia:

Asetamme sisältötyypiksi teksti/plain, jotta tulos on helpompi tarkastella selaimessa. Muussa tapauksessa, koska HTML-muotoilua ei ole, tuloste näkyy yhtenä tekstirivinä.

Tulosteen ensimmäinen rivi on sarakeotsikot (tässä tapauksessa käytetään kenttien nimiä). Arvot erotetaan sarkaimella \t ja rivillä rivinvaihdoilla \n. Tuloksen pitäisi näyttää suunnilleen tältä:

Etunimi sukunimi ikä Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

Tässä koodissa on heikkous, joka ei välttämättä ole heti ilmeinen. Entä jos jokin tulostettavista kentistä sisältää jo yhden tai useamman sarkainmerkin tai, mikä pahempaa, rivinvaihdon? Tämä käynnistää koko prosessin, koska luotamme näihin symboleihin osoittamaan sarakkeita ja rivinvaihtoja.

Ratkaisu on "paeta" sarkainmerkkejä. Tässä tapauksessa korvaamme sarkaimet kirjaimella \t ja rivinvaihdot kirjaimella \n, jotta ne eivät vaikuta muotoiluun:

Nyt, ennen kuin jokainen rivi toistetaan, kaikki sarkainmerkit korvataan "\t":llä, jotta sarakkeet eivät katkea. Myös mahdolliset rivinvaihdot tiedoissa korvataan merkinnällä "\n".

.
Tässä huomautuksessa esitetty menetelmä on todellakin hyvin yksinkertainen, mutta ei välttämättä aina kätevä.
On monia muita tapoja siirtää taulukkotietoja PHP:stä Exceliin, kuvailen sen, joka näytti minusta yksinkertaisimmalta ja toimivimmalta. Erityisesti tulee huomioida, että en tarkoita xls-tiedoston luomista, vaan ehdotan vain, että käyttäjä avaa vastaanottamansa tiedot Excelillä, jotta ohjelmoinnista kokemattomat käyttäjät eivät huomaa väärennöstä.

Joten ensimmäinen asia, joka sinun on tehtävä, on sijoittaa sivullemme linkki skriptiin, joka luo seuraavat otsikot:
header("Pragma: julkinen");
header("Vanhenee: 0");
header("Cache-Control: täytyy vahvistaa uudelleen, post-check=0, pre-check=0");
header("Cache-Control: yksityinen", false);
header("Sisältötyyppi: application/x-msexcel");
header("Sisältö: liite; tiedostonimi=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Sisällönsiirto-koodaus: binaari");
header("Sisällön pituus: " . $object->getFileSize());

$objekti on pallomainen esine tyhjiössä, jonka jokainen lukija voi toteuttaa haluamallaan tavalla. GetFileName()- ja getFileSize()-getterien tarkoitus on selvä niiden nimistä. Tässä kannattaa korostaa yhtä ei-ilmeistä vivahdetta (kiitos, että muistutit tästä) - getFileName() voi tietysti palauttaa minkä tahansa tiedostonimen, mutta jos haluat selaimen tarjoutuvan avaamaan vastaanotetun sisällön Excelissä, tiedostotunnisteen pitäisi olla xls.
En ole vielä sanonut mitään uutta, kaikki tämä keksittiin kuitenkin ennen minua, kuten alla kuvataan.
Kuten artikkelin kommenteissa aivan oikein todettiin, Excel toimii paljon nopeammin XML:n kanssa. Mutta ehkä tärkein etu ei ole nopeus, vaan paljon laajemmat ominaisuudet. En mene syvemmälle rikkaruohoihin, vaan annan vain yksinkertaisen esimerkin ja linkin yksityiskohtaiseen kuvaukseen kaikista tunnisteista.

Joten, kun otsikot on luotu, meidän on annettava todelliset tiedot käyttäjälle. Käärin yleensä taulukon generoinnin erilliseen menetelmään:
echo $object->getContent();

Ja luon taulukon Smartylla:

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

Kuten koodista näkyy, $data-taulukko välitetään malliin, joka sisältää kaksi taulukkoa - taulukon otsikkorivin ja itse tiedot.
On syytä huomata, että mallimoottorin käyttäminen vain XML:n luomiseen on jonkin verran kallista ja XML voidaan hankkia monilla muilla tavoilla. Minun tapauksessani XML-sukupolvi on vain pieni bonus suuressa projektissa, jossa mallimoottori on välttämätön.

Esimerkkinä annoin yksinkertaisen taulukon, jos haluat, voit käsitellä paljon suurempia määritteitä. Tämä on erityisen mukavaa, kun otetaan huomioon, että käyttöönottoon ei tarvita kolmannen osapuolen kirjastoja.
Kuvattu menetelmä on työskennellyt yhdessä projektissa useita vuosia, eikä yksikään käyttäjä ole vielä epäillyt, että hänen avaamansa tiedot eivät ole MS Office -dokumentteja.

Voit lukea lisää MS Excelissä käytetystä XML-rakenteesta

Monille työskennellessään PHP yhdessä MySQL:n kanssa On olemassa sellainen tarve, kuten tietojen vienti tietokannasta xls-muotoon, jotta näitä tietoja tarvitsevat ihmiset käsittelevät ne Excelissä tai käyttäjien on yksinkertaisesti kätevä tarkastella näitä tietoja. Minulla oli äskettäin tällainen tarve ja tänään kerron teille, kuinka tämä asia voidaan toteuttaa.

Sanon heti, että tämä menetelmä on melko yksinkertainen, mutta tiedot ladataan normaalisti.

Aluksi annan esimerkin lopullisesta xls-tiedostosta Excelissä, lataus näyttää tältä:

Toisin sanoen kuvia tai tyylejä ei ladata, vain sarakeotsikot ja itse tiedot.

Ennen kuin päädyin juuri tähän latausvaihtoehtoon, yritin ladata csv-muodossa, mutta se osoittautui hieman kömpelöltä, sitten yritin piirtää taulukon ja tallentaa sen xls-laajennuksella, se osoittautui myös jonkinlaiseksi hölynpölyksi. , menetelmä, jota nyt kuvailen, sopi minulle täysin , ja nyt jaan sen kanssasi.

Aluksi annan sinulle kaiken koodin, jota kommentoin niin paljon kuin mahdollista, voit valita sen ja tallentaa sen php-laajennuksella ja kokeilla sitä, älä vain unohda määrittää tietokantaan yhteyden asetuksia .

Vie tiedot MySQL:stä Exceliin PHP:ssä

Ja jotta ymmärrät, mitä tietoja lataan, annan esimerkin yksinkertaisesta taulukosta tietokannassa ( Minulla on sen nimitesti):

Testitaulukko:

id etunimi nimi
1 Ivanov Ivan
2 Petrov Peter
2 Petrov2 Pietari 2
xlsData = pakkaus("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // Jos numerofunktio RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $arvo ) //Jos tekstifunktio RecText($row, $value)( $len = strlen($arvo); (" s*", 0x0204, 8 + $len, $rivi, $col, 0x00, $this->xlsData .= $arvo return ) // Lisää numerofunktio InsertNumber($arvo) if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $ arvo $this->countCol++ >countRow++ ) $this->RecText($this->countCol, $this->countCol++)($this->); countCol = 0 ; $this->countRow++ palata;

) // Tallenna tiedostotoiminto SaveFile($tiedostonimi)( $this->fileName = $tiedostonimi; $this->SendFile(); ) // Lähetä tiedostofunktio SendFile())( $this->EndData(); header (" Viimeksi muokattu: " . gmdate("D,d M YH:i:s") . " GMT" ("Cache-Control: no-store, no-cache, must-revalidate"); header ("Pragma: no-cache") ("Sisältötyyppi: Application/x-msexcel") ->xlsData ; ) ) ) if(isset($_GET["id"])) ( //suodata tiedot $id = mysql_real_escape_string(strislashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))) $filename = "Tiedoston_tunnus_".$id; // aseta tiedostonimi $excel = new ExportToExcel( // luo luokan $sql="SELECT * FROM test.test jossa id = $id"); //kysely tietokantaan $rez= $excel->InsertText("Identifier"("Sukunimi"); excel->GoNewLine(); rivi=mysql_fetch_assoc($rez))( $excel->InsertNumber($row["id"]); $excel->InsertText($row["etunimi"]); $excel->InsertText($row["nimi"]); $excel->GoNewLine(); ) $excel->SaveFile($tiedostonimi); ) ?> Koko idea tässä on funktio pakkaus() MySql-palvelimen asennus ja sen hallinta- ja hallintatyökalujen tarkistaminen käyttämällä normaalia toimintoa mysql_query().

Tämän koodin toimivuuden tarkistamiseksi, ottaen huomioon, että olet määrittänyt yhteyden tietokantaan ja luonut samanlaisen taulukon, voit lähettää seuraavan pyynnön:

Http://sivustosi/tiedoston_nimi. php?id=2

Ja sinun pitäisi purkaa kaksi riviä, joiden tunnus on 2.

Ja nyt kuka tahansa, jonka sallit ladata tietoja, voi helposti viedä ne paikalliselle tietokoneelleen verkkokäyttöliittymän kautta. Tämä menetelmä on kätevä sekä yrityskäyttäjille, jos olet kehittämässä sovellusta organisaatiollesi, että verkkosivustosi käyttäjille Internetissä. Toivottavasti tämä menetelmä auttoi sinua. Onnea!

.
Tässä huomautuksessa esitetty menetelmä on todellakin hyvin yksinkertainen, mutta ei välttämättä aina kätevä.
On monia muita tapoja siirtää taulukkotietoja PHP:stä Exceliin, kuvailen sen, joka näytti minusta yksinkertaisimmalta ja toimivimmalta. Erityisesti tulee huomioida, että en tarkoita xls-tiedoston luomista, vaan ehdotan vain, että käyttäjä avaa vastaanottamansa tiedot Excelillä, jotta ohjelmoinnista kokemattomat käyttäjät eivät huomaa väärennöstä.

Joten ensimmäinen asia, joka sinun on tehtävä, on sijoittaa sivullemme linkki skriptiin, joka luo seuraavat otsikot:
header("Pragma: julkinen");
header("Vanhenee: 0");
header("Cache-Control: täytyy vahvistaa uudelleen, post-check=0, pre-check=0");
header("Cache-Control: yksityinen", false);
header("Sisältötyyppi: application/x-msexcel");
header("Sisältö: liite; tiedostonimi=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Sisällönsiirto-koodaus: binaari");
header("Sisällön pituus: " . $object->getFileSize());

$objekti on pallomainen esine tyhjiössä, jonka jokainen lukija voi toteuttaa haluamallaan tavalla. GetFileName()- ja getFileSize()-getterien tarkoitus on selvä niiden nimistä. Tässä kannattaa korostaa yhtä ei-ilmeistä vivahdetta (kiitos savostinille, että muistutti tästä) - getFileName() voi tietysti palauttaa minkä tahansa tiedostonimen, mutta jos haluat selaimen tarjoutuvan avaamaan vastaanotetun sisällön Excelissä, tiedosto laajennuksen tulee olla xl.
En ole vielä sanonut mitään uutta, kaikki tämä keksittiin kuitenkin ennen minua, kuten alla kuvataan.
Kuten PHP:n xls-sukupolven julkaisun kommenteissa aivan oikein todettiin, Excel toimii paljon nopeammin XML:n kanssa. Mutta ehkä tärkein etu ei ole nopeus, vaan paljon laajemmat ominaisuudet. En mene syvemmälle rikkaruohoihin, vaan annan vain yksinkertaisen esimerkin ja linkin yksityiskohtaiseen kuvaukseen kaikista tunnisteista.

Joten, kun otsikot on luotu, meidän on annettava todelliset tiedot käyttäjälle. Käärin yleensä taulukon generoinnin erilliseen menetelmään:
echo $object->getContent();

Ja luon taulukon Smartylla:

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

Kuten koodista näkyy, $data-taulukko välitetään malliin, joka sisältää kaksi taulukkoa - taulukon otsikkorivin ja itse tiedot.
On syytä huomata, että mallimoottorin käyttäminen vain XML:n luomiseen on jonkin verran kallista ja XML voidaan hankkia monilla muilla tavoilla. Minun tapauksessani XML-sukupolvi on vain pieni bonus suuressa projektissa, jossa mallimoottori on välttämätön.

Esimerkkinä annoin yksinkertaisen taulukon, jos haluat, voit käsitellä paljon suurempia määritteitä. Tämä on erityisen mukavaa, kun otetaan huomioon, että käyttöönottoon ei tarvita kolmannen osapuolen kirjastoja.
Kuvattu menetelmä on työskennellyt yhdessä projektissa useita vuosia, eikä yksikään käyttäjä ole vielä epäillyt, että hänen avaamansa tiedot eivät ole MS Office -dokumentteja.

Voit lukea lisää MS Excelissä käytetystä XML-rakenteesta