Snadný způsob přenosu tabulkových dat z PHP do Excelu. Snadný způsob přenosu tabulkových dat z PHP do Excelu PHP skript pro nahrání z mysql do Excelu

(data načtená z databáze mysql) uspět. Používám Zend Framework. Před exportem do Excelu musím provést nějaké změny v datech. Ve skutečnosti opravdu potřebuji vytvořit měsíční pokladní knihu.

Přečetl jsem spoustu dokumentů, ale skončil jsem v nepořádku. Opravdu nechápu, jak začít. Opravdu potřebuji HRUŠKU? Musím načíst nějakou knihovnu tříd? Neexistuje snadná cesta, jak to udělat?

Díky předem

Doporučuji použít knihovnu PHPExcel PHPExcel . Je opravdu výkonný, podporuje různé formáty, umí vizuální formátování a snadno se používá.

Více se o tom můžete dozvědět na jejich webové stránce: http://phpexcel.codeplex.com/. (PHPExcel se již přesunul na https://github.com/PHPOffice/PHPExcel)

Příklad použití:

$objPHPExcel = new PHPExcel(); /** Můžete nastavit mnoho vlastností */ $objPHPExcel->getProperties()->setCreator("Moje společnost") ->setLastModifiedBy("John Doe") ->setTitle("Výroční zpráva") ->setSubject("Sales ") ->setDescription("Výroční zpráva o prodeji od Johna Doe") ->setCategory("Finance"); /** Vyberte jeden z listů */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Jednoduše nastavte hodnotu buňky */ $activeSheet->setCellValue("A1", "množné číslo");

Můžete samozřejmě dělat mnohem víc, číst excelové soubory, nastavovat vizuální styly, vytvářet grafy, výrazy a další.

Napsal jsem 94řádkový přehled variací inventáře, kde vezmu data z MySQL (6 kb + záznamy na tabulku), vytvořím multidimenzionální pole z dat MySQL, vytáhnu z více tabulek, pak vše vysypu do jednoho řádku a vygeneruji .xls takto:

Nejsou nutná žádná rozšíření.

Jediná výhrada je, že jsem ještě nepřišel na to, jak vyplivnout .xls bez Excelu, abych vám řekl, že data mohou být poškozena - a nezkoušel jsem dělat formátování nebo něco složitějšího, než jen "exportovat" data , soubor/data jsou samozřejmě v pořádku, ale generuje varování z excelu.

EDIT: Měl bych poznamenat, že "setup" a "dump" odkazují na: daniweb.com

Můžete použít knihovnu phpexcel. Umožňuje vám zapisovat a číst z různých formátů tabulkových souborů

k integraci se Zend můžete použít nápovědu následujícího odkazu.

CSV můžete použít k vytvoření importovatelného formátu pro Excel. Je to nejjednodušší způsob, jak to udělat.

CSV vypadá takto:

"obsah mé první buňky", "obsah mé druhé buňky", "obsah mé třetí buňky" "druhý řádek, obsah první buňky", "atd", "atd.

Každý řádek představuje řetězec Excelu, obsah buňky vložíte do dvojitých uvozovek a oddělíte čárkami. Buďte opatrní, pokud máte některá svá data, mohlo by to poškodit váš CSV a vytvořit nežádoucí nové řádky.

S trochou Google byste našli toto: http://www.the-art-of-web.com/php/dataexport/

Příprava dat

$data = array(array("firstname" => "Mary", "lastname" => "Johnson", "age" => 25), array("firstname" => "Amanda", "lastname" => " Miller", "věk" => 18), array("křestní jméno" => "James", "příjmení" => "Hnědá", "věk" => 31), array("křestní jméno" => "Patricia", "lastname" => "Williams", "age" => 7), array("firstname" => "Michael", "lastname" => "Davis", "age" => 43), array("firstname" => "Sarah", "příjmení" => "Miller", "věk" => 24), array("křestní jméno" => "Patrick", "příjmení" => "Miller", "věk" => 27) );

Prvním krokem je výstup dat ve formátu odděleném tabulátory (lze použít i CSV, ale je to trochu složitější). K tomu používáme následující kód:

Typ obsahu jsme nastavili na text/plain, aby bylo možné výsledek snadněji zobrazit v prohlížeči. V opačném případě, protože neexistuje žádné formátování HTML, bude výstup zobrazen jako jeden řádek textu.

Na prvním řádku výstupu budou záhlaví sloupců (v tomto případě se použijí názvy polí). Hodnoty jsou odděleny tabulátorem \t a řádky se zalomenými řádky \n. Výsledek by měl vypadat nějak takto:

Jméno příjmení věk Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

V tomto kódu je slabina, která nemusí být hned zřejmá. Co když jedno z polí k výstupu již obsahuje jeden nebo více znaků tabulátoru, v horším případě nový řádek? To spustí celý proces, protože se spoléháme na tyto znaky pro označení sloupců a zalomení řádků.

Řešením je „uniknutí“ znaků tabulátoru. V tomto případě nahradíme tabulátory literálem \t a konce řádků literálem \n, aby neovlivnily formátování:

Nyní, před každým řádkem, jsou všechny znaky tabulátoru nahrazeny "\t", aby se naše sloupce nelámaly. Také jakékoli konce řádků v datech jsou nahrazeny "\n".

.
Metoda uvedená v této poznámce je opravdu velmi jednoduchá, ale nemusí být vždy vhodná.
Existuje mnoho dalších způsobů, jak přenést tabulková data z PHP do Excelu, já popíšu ten, který se mi zdál nejjednodušší a nejfunkčnější. Zvláště je třeba poznamenat, že nemluvím o generování xls souboru, ale pouze o návrhu, aby uživatel otevřel přijatá data pomocí Excelu, aby si uživatelé, kteří nemají zkušenosti s programováním, padělku nevšimli.

Takže první věc, kterou musíte udělat, je umístit na naši stránku odkaz na skript, který generuje následující záhlaví:
header("Pragma: public");
header("Platnost vyprší: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=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: binární");
header("Content-Length: " . $object->getFileSize());

$object je kulovitý objekt ve vakuu, který si každý čtenář implementuje, jak chce. Účel getFileName() a getFileSize() je jasný z názvů. Zde stojí za to zdůraznit jednu nezřejmou nuanci (děkuji za připomenutí) - getFileName () samozřejmě může vrátit jakýkoli název souboru, ale pokud chcete, aby prohlížeč nabídl otevření přijatého obsahu v aplikaci Excel, pak přípona souboru musí být xls.
Zatím jsem neřekl nic nového, to vše bylo vynalezeno přede mnou, stejně jako to, co bude popsáno níže.
Jak bylo správně uvedeno v komentářích k poznámce, Excel pracuje s XML mnohem rychleji. Ale ta nejdůležitější výhoda snad stále není v rychlosti, ale v mnohem širších možnostech. Nebudu se pouštět do divočiny, ale uvedu pouze jednoduchý příklad a odkaz na podrobný popis všech tagů.

Po vygenerování hlaviček tedy musíme uživateli poskytnout skutečná data. Generování tabulky obvykle zabalím samostatnou metodou:
echo $object->getContent();

A vygeneruji tabulku pomocí Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/pro každého)(foreach from=$data.content item=row) (foreach from=$row item=col) ($col)(/pro každého)(/pro každého)

Jak je vidět z kódu, do šablony je předáno pole $data obsahující dvě pole – řádek záhlaví tabulky a skutečná data.
Stojí za zmínku, že použití šablonového enginu pouze pro generování XML je poněkud nákladné a existuje mnoho dalších způsobů, jak XML získat. V mém konkrétním případě je generování XML jen malým bonusem ve velkém projektu, kde je šablonový engine nepostradatelný.

Jako příklad jsem uvedl nejjednodušší tabulku, na přání lze manipulovat s mnohem větším počtem atributů. To je obzvláště příjemné, když uvážíte, že pro implementaci nejsou vyžadovány žádné knihovny třetích stran.
Popsaná metoda pracuje na stejném projektu již několik let a nejeden uživatel dosud tušil, že data, která otevírá, nejsou dokument MS Office.

Více o struktuře XML používané v MS Excel si můžete přečíst v

Pro mnohé při práci s PHP ve spojení s MySQL je potřeba exportovat data z databáze do formátu xls, aby je lidé, kteří tato data potřebují, zpracovali v Excelu nebo jen zpříjemnili uživatelům prohlížení těchto dat. Nedávno jsem měl takovou potřebu a dnes vám řeknu, jak lze tento obchod realizovat.

Hned musím říci, že tato metoda je poměrně jednoduchá, ale data se nahrávají normálně.

Pro začátek uvedu příklad finálního xls souboru, v Excelu bude nahrávání vypadat nějak takto:

Jinými slovy, nebudou nahrány žádné obrázky ani styly, pouze záhlaví sloupců a samotná data.

Než jsem došel právě k takové možnosti nahrávání, zkusil jsem nahrát do formátu csv, ale dopadlo to trochu neohrabaně, pak jsem zkusil nakreslit tabulku a uložit ji s příponou xls, taky se z toho vyklubal nějaký nesmysl, metoda, kterou nyní popíšu, mi zcela vyhovovala a nyní se o ni s vámi podělím.

Pro začátek uvedu maximálně všechen kód, který jsem komentoval, můžete si ho vybrat a uložit s příponou php a vyzkoušet, jen nezapomeňte nastavit připojení k databázi.

Export dat z MySQL do Excelu v PHP

A abyste pochopili, jaká data vykládám, uvedu příklad jednoduché tabulky v databázi ( Mám její test na jméno):

Testovací tabulka:

id jméno název
1 Ivanov Ivane
2 Petrov Petr
2 Petrov2 Petr2
xlsData = pack("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // Pokud číselná funkce RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $value); return; ) //Pokud textová funkce RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= pack(" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $value; return; ) // Vložení číselné funkce InsertNumber($value)( if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Vložení textové funkce InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Přechod na novou řádkovou funkci GoNewLine()( $this->countCol = 0 ; $this->countRow++; return; ) //Ukončení datové funkce EndData()( $this->xlsData .= pack("ss", 0x0A, 0x00); vrátit se; ) // Uložte funkci souboru SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // Odešlete funkci souboru SendFile()( $this->EndData(); hlavička (" Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); hlavička ("Cache-Control: no-store, no-cache, must-revalidate"); hlavička (" Pragma: no-cache"); header("Content-type: application/x-msexcel"); header("Content-Disposition: attachment; fileName=$this->fileName.xls"); print $this- >xlsData ; ) ) ) if(isset($_GET["id"])) ( //filtrovat data $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))); $ filename = "File_with_id_".$id; // nastavení názvu souboru $excel = new ExportToExcel(); // vytvoření instance třídy $sql="SELECT * FROM test.test kde id = $id";// dotaz do databáze $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["jméno"]); $excel->InsertText($row["name"]); $excel->GoNewLine(); ) $excel->SaveFile($filename); ) ?>

Celá myšlenka je zde ve funkci balíček(), který sbalí data do binárního řetězce a my tento řetězec postupně naplníme daty, která jsme stáhli z databáze mysql pomocí normální funkce mysql_query().

Chcete-li zkontrolovat výkon tohoto kódu, za předpokladu, že jste nastavili připojení k databázi a vytvořili podobnou tabulku, můžete odeslat následující požadavek:

Http://vas_web/nazev_souboru. php?id=2

A měli byste vyložit dva řádky s ID rovným 2.

A nyní každý, komu umožníte nahrávat data, je může jednoduše exportovat do svého lokálního počítače přes webové rozhraní. Tato metoda je vhodná jak pro firemní uživatele, pokud vyvíjíte aplikaci pro vaši organizaci, tak pro uživatele vašeho webu na internetu. Doufám, že vám tato metoda pomohla. Hodně štěstí!

.
Metoda uvedená v této poznámce je opravdu velmi jednoduchá, ale nemusí být vždy vhodná.
Existuje mnoho dalších způsobů, jak přenést tabulková data z PHP do Excelu, já popíšu ten, který se mi zdál nejjednodušší a nejfunkčnější. Zvláště je třeba poznamenat, že nemluvím o generování xls souboru, ale pouze o návrhu, aby uživatel otevřel přijatá data pomocí Excelu, aby si uživatelé, kteří nemají zkušenosti s programováním, padělku nevšimli.

Takže první věc, kterou musíte udělat, je umístit na naši stránku odkaz na skript, který generuje následující záhlaví:
header("Pragma: public");
header("Platnost vyprší: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=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: binární");
header("Content-Length: " . $object->getFileSize());

$object je kulovitý objekt ve vakuu, který si každý čtenář implementuje, jak chce. Účel getFileName() a getFileSize() je jasný z názvů. Zde stojí za to zdůraznit jednu nezřejmou nuanci (díky savostin, že mi to připomněl) - getFileName() může samozřejmě vrátit jakýkoli název souboru, ale pokud chcete, aby prohlížeč nabídl otevření přijatého obsahu v aplikaci Excel, pak přípona souboru musí být xls.
Zatím jsem neřekl nic nového, to vše bylo vynalezeno přede mnou, stejně jako to, co bude popsáno níže.
Jak bylo správně uvedeno v komentářích k příspěvku o generování xls v PHP, Excel je mnohem rychlejší s XML. Ale ta nejdůležitější výhoda snad stále není v rychlosti, ale v mnohem širších možnostech. Nebudu se pouštět do divočiny, ale uvedu pouze jednoduchý příklad a odkaz na podrobný popis všech tagů.

Po vygenerování hlaviček tedy musíme uživateli poskytnout skutečná data. Generování tabulky obvykle zabalím samostatnou metodou:
echo $object->getContent();

A vygeneruji tabulku pomocí Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/pro každého)(foreach from=$data.content item=row) (foreach from=$row item=col) ($col)(/pro každého)(/pro každého)

Jak je vidět z kódu, do šablony je předáno pole $data obsahující dvě pole – řádek záhlaví tabulky a skutečná data.
Stojí za zmínku, že použití šablonového enginu pouze pro generování XML je poněkud nákladné a existuje mnoho dalších způsobů, jak XML získat. V mém konkrétním případě je generování XML jen malým bonusem ve velkém projektu, kde je šablonový engine nepostradatelný.

Jako příklad jsem uvedl nejjednodušší tabulku, na přání lze manipulovat s mnohem větším počtem atributů. To je obzvláště příjemné, když uvážíte, že pro implementaci nejsou vyžadovány žádné knihovny třetích stran.
Popsaná metoda pracuje na stejném projektu již několik let a nejeden uživatel dosud tušil, že data, která otevírá, nejsou dokument MS Office.

Více o struktuře XML používané v MS Excel si můžete přečíst v



Související články: