Gegevens uploaden van Excel naar php. Een eenvoudige manier om tabelgegevens van PHP naar Excel over te zetten. Exporteer gegevens van MySQL naar Excel in PHP

(gegevens verkregen uit MySQL-database) om te slagen. Ik gebruik Zend Framework. Ik moet enkele wijzigingen in mijn gegevens aanbrengen voordat ik naar Excel exporteer. Sterker nog, ik moet eigenlijk een maandelijks kasboek maken.

Ik heb veel documenten gelezen, maar merkte dat ik in de war was. Ik weet echt niet hoe ik moet beginnen. Heb ik PEER echt nodig? Moet ik een klassenbibliotheek laden? Is er geen gemakkelijke manier om dit te doen?

alvast bedankt

Ik raad u aan om de PHPExcel-bibliotheek te gebruiken. Het is echt krachtig, ondersteunt meerdere formaten, kan visuele opmaak uitvoeren en is gemakkelijk te gebruiken.

Je kunt er meer over lezen op hun webpagina: http://phpexcel.codeplex.com/, (PHPExcel is al verhuisd naar https://github.com/PHPOffice/PHPExcel)

Gebruiksvoorbeeld:

$objPHPExcel = nieuwe PHPExcel(); /** U kunt veel eigenschappen instellen */ $objPHPExcel->getProperties()->setCreator("Mijn bedrijf") ->setLastModifiedBy("John Doe") ->setTitle("Jaarlijksrapport") ->setSubject("Sales ") ->setDescription("Jaarlijks verkooprapport door John Doe") ->setCategory("Finance"); /** Kies een van de bladen */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Stel eenvoudig de waarde van de cel in */ $activeSheet->setCellValue("A1", "plural");

Je kunt natuurlijk nog veel meer doen: Excel-bestanden lezen, visuele stijlen instellen, grafieken, uitdrukkingen maken en nog veel meer.

Ik heb een inventarisvariatierapport met 94 rijen geschreven waarin ik gegevens uit MySQL haal (6 kb + records per tabel), een multidimensionale array maak van de MySQL-gegevens, uit meerdere tabellen haal en vervolgens alles in één rij dump en .xls genereer. Dus:

Geen extensies vereist.

Het enige voorbehoud is dat ik er nog niet achter ben hoe ik .xls kan uitspugen zonder Excel, waarbij ik rapporteer dat de gegevens mogelijk beschadigd zijn - en ik heb niet geprobeerd om te formatteren of iets complexer te doen dan alleen maar de gegevens te "exporteren", Bestand/gegevens in orde natuurlijk, maar het genereert een waarschuwing vanuit Excel.

EDIT: ik moet er rekening mee houden dat "setup" en "dump" naar het volgende verwijzen: daniweb.com

U kunt de phpexcel-bibliotheek gebruiken. Hiermee kunt u vanuit verschillende spreadsheetbestandsformaten schrijven en lezen

voor zend-integratie kunt u de hulp van de volgende link gebruiken.

U kunt CSV gebruiken om een ​​importeerbaar formaat voor Excel te maken. Dit is de gemakkelijkste manier om het te doen.

Het CSV-bestand ziet er als volgt uit:

"mijn eerste celinhoud", "mijn tweede celinhoud", "mijn derde celinhoud" "tweede regel, eerste celinhoud", "enz.", "enz.

Elke rij vertegenwoordigt een Excel-tekenreeks. U plaatst de celinhoud tussen dubbele aanhalingstekens en scheidt deze met komma's. Wees voorzichtig als u een deel van uw gegevens heeft. Het kan uw CSV kapot maken en ongewenste nieuwe rijen creëren.

Met een beetje Google vind je dit: http://www.the-art-of-web.com/php/dataexport/

Data voorbereiding

$data = array(array("voornaam" => "Mary", "achternaam" => "Johnson", "leeftijd" => 25), array("voornaam" => "Amanda", "achternaam" => " Miller", "leeftijd" => 18), array("voornaam" => "James", "achternaam" => "Bruin", "leeftijd" => 31), array("voornaam" => "Patricia", "achternaam" => "Williams", "leeftijd" => 7), array("voornaam" => "Michael", "achternaam" => "Davis", "leeftijd" => 43), array("voornaam" => "Sarah", "achternaam" => "Miller", "leeftijd" => 24), array("voornaam" => "Patrick", "achternaam" => "Miller", "leeftijd" => 27) );

De eerste stap is het uitvoeren van de gegevens in een door tabs gescheiden formaat (CSV kan ook worden gebruikt, maar is iets ingewikkelder). Om dit te doen gebruiken we de volgende code:

We hebben het inhoudstype ingesteld op tekst/plain, zodat het resultaat gemakkelijker in de browser kan worden bekeken. Anders zal de uitvoer verschijnen als één regel tekst, aangezien er geen HTML-opmaak is.

De eerste uitvoerregel bestaat uit de kolomkoppen (in dit geval worden de veldnamen gebruikt). Waarden worden gescheiden door tab \t en regels met regeleinden \n. Het resultaat zou er ongeveer zo uit moeten zien:

Voornaam achternaam leeftijd Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

Er zit een zwakte in deze code die misschien niet meteen duidelijk is. Wat als een van de velden die moeten worden uitgevoerd al een of meer tabtekens bevat, of erger nog, een nieuwe regel? Dit zal het hele proces in gang zetten, omdat we op deze symbolen vertrouwen om kolommen en regeleinden aan te geven.

De oplossing is om de tabtekens te "ontsnappen". In dit geval vervangen we tabbladen door letterlijke \t en regeleinden door letterlijke \n, zodat deze geen invloed hebben op de opmaak:

Voordat elke regel wordt herhaald, worden alle tabtekens vervangen door "\t", zodat onze kolommen niet worden afgebroken. Ook worden eventuele regeleinden binnen de gegevens vervangen door "\n".

.
De methode die in die notitie wordt gepresenteerd is inderdaad heel eenvoudig, maar is misschien niet altijd handig.
Er zijn veel andere manieren om tabelgegevens van PHP naar Excel over te zetten. Ik zal degene beschrijven die mij het meest eenvoudig en functioneel leek. Er moet vooral worden opgemerkt dat ik het niet heb over het genereren van een xls-bestand, maar alleen suggereer dat de gebruiker de ontvangen gegevens opent met behulp van Excel, zodat gebruikers die geen ervaring hebben met programmeren de vervalsing niet zullen opmerken.

Het eerste wat u dus hoeft te doen is op onze pagina een link plaatsen naar een script dat de volgende headers genereert:
header("Pragma: openbaar");
header("Verloopt: 0");
header("Cache-Control: moet opnieuw valideren, post-check=0, pre-check=0");
header("Cache-Control: privé", false);
header("Inhoudstype: applicatie/x-msexcel");
header("Inhoudsdispositie: bijlage; bestandsnaam=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Content-Transfer-Encoding: binair");
header("Inhoudslengte: " . $object->getFileSize());

$object is een bolvormig object in een vacuüm, dat elke lezer naar eigen inzicht kan implementeren. Het doel van getFileName() en getFileSize() getters wordt duidelijk uit hun namen. Het is de moeite waard om hier een niet voor de hand liggende nuance te benadrukken (bedankt dat je me hieraan herinnert) - getFileName() kan uiteraard elke bestandsnaam retourneren, maar als je wilt dat de browser aanbiedt de ontvangen inhoud in Excel te openen, dan moet de bestandsextensie xls zijn.
Ik heb nog niets nieuws gezegd, dit alles is echter vóór mij uitgevonden, zoals hieronder zal worden beschreven.
Zoals terecht opgemerkt in de commentaren op het artikel werkt Excel veel sneller met XML. Maar het belangrijkste voordeel is misschien niet snelheid, maar veel bredere mogelijkheden. Ik ga niet dieper op het onkruid in, maar geef slechts een eenvoudig voorbeeld en een link naar een gedetailleerde beschrijving van alle tags.

Nadat de headers zijn gegenereerd, moeten we dus de daadwerkelijke gegevens aan de gebruiker doorgeven. Meestal verpak ik het genereren van tabellen in een aparte methode:
echo $object->getContent();

En ik genereer de tabel met Smarty:

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

Zoals u in de code kunt zien, wordt de array $data doorgegeven aan de sjabloon, die twee arrays bevat: de titelregel van de tabel en de gegevens zelf.
Het is vermeldenswaard dat het gebruik van een sjabloonengine alleen voor het genereren van XML nogal duur is, en dat XML op veel andere manieren kan worden verkregen. In mijn specifieke geval is het genereren van XML slechts een kleine bonus in een groot project waarbij een sjabloonengine onmisbaar is.

Als voorbeeld heb ik een eenvoudige tabel gegeven; indien gewenst kun je een veel groter aantal attributen manipuleren. Dit is vooral prettig gezien het feit dat er voor de implementatie geen bibliotheken van derden nodig zijn.
De beschreven methode werkt al enkele jaren aan één project en nog geen enkele gebruiker heeft tot nu toe vermoed dat de gegevens die hij opent geen MS Office-document zijn.

U kunt meer lezen over de XML-structuur die in MS Excel wordt gebruikt in

Voor velen tijdens het werken met PHP in combinatie met MySQL Er is behoefte aan het exporteren van gegevens uit de database naar xls-formaat, zodat mensen die deze gegevens nodig hebben deze in Excel kunnen verwerken of het voor gebruikers eenvoudigweg handig is om deze gegevens te bekijken. Onlangs had ik zo'n behoefte en vandaag zal ik je vertellen hoe deze kwestie kan worden geïmplementeerd.

Ik zal meteen zeggen dat deze methode vrij eenvoudig is, maar dat de gegevens normaal worden geüpload.

Om te beginnen zal ik een voorbeeld geven van het uiteindelijke xls-bestand in Excel, de upload zal er ongeveer zo uitzien:

Met andere woorden, er worden geen afbeeldingen of stijlen geüpload, alleen kolomkoppen en de gegevens zelf.

Voordat ik precies bij deze optie kwam om te uploaden, probeerde ik te uploaden in csv-formaat, maar het bleek een beetje onhandig, daarna probeerde ik een tabel te tekenen en deze op te slaan met de xls-extensie, het bleek ook een soort onzin , de methode die ik nu ga beschrijven paste helemaal bij mij, en nu zal ik hem met je delen.

Om te beginnen geef ik je alle code, die ik zoveel mogelijk heb becommentarieerd, je kunt deze selecteren en opslaan met de php-extensie en het proberen, vergeet alleen niet de instellingen op te geven voor verbinding met de database .

Exporteer gegevens van MySQL naar Excel in PHP

En zodat u begrijpt welke gegevens ik upload, zal ik een voorbeeld geven van een eenvoudige tabel in de database ( Ik heb de naamtest):

Testtafel:

ID kaart Voornaam naam
1 Ivanov Iwan
2 Petrov Petrus
2 Petrov2 Petrus2
xlsData = pack("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // Als de getalfunctie RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $value); //Als de tekstfunctie RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= pack (" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $value; if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $ waarde); $this->countCol++; return ) // Tekstfunctie invoegen InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this- >countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; // Ga naar de nieuwe regelfunctie GoNewLine())( $this-> countCol = 0; $this->countRow++; return; //Einde van gegevensfunctie EndData() ( $this->xlsData .= pack("ss", 0x0A, 0x00); opbrengst;

) // Bewaar de bestandsfunctie SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // Verstuur de bestandsfunctie SendFile())( $this->EndData(); header (" Laatst gewijzigd: " . gmdate("D,d M YH:i:s") . " GMT"); header ("Cache-Control: geen opslag, geen cache, moet opnieuw valideren"); header ("Pragma: geen cache"); header ("Inhoudstype: applicatie/x-msexcel"); header ("Inhoudsdispositie: bijlage; bestandsnaam=$dit->bestandsnaam.xls"); ->xlsData ; ) ) ) if(isset($_GET["id"])) ( //filter de gegevens $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))) ; $filename = "File_with_id_".$id; // stel de bestandsnaam in $excel = new ExportToExcel(); / maak een instance van de klasse $sql="SELECT * FROM test.test waarbij id = $id"; //query naar de database $rez= mysql_query($sql); $excel->InsertText("Identificatie"); $excel->InsertText("Achternaam"); ​​$excel->InsertText("Naam"); excel->GoNewLine(); row=mysql_fetch_assoc($rez))( $excel->InsertNumber($row["id"]); $excel->InsertText($row["voornaam"]); $excel->InsertText($row["naam"]); $excel->GoNewLine(); ) $excel->SaveFile($bestandsnaam); ) ?> Het hele idee hier is functie pak() Het installeren van de MySql-server en het beoordelen van de beheer- en administratietools met behulp van de normale functie mysql_query().

Om de functionaliteit van deze code te controleren, rekening houdend met het feit dat u een verbinding met de database hebt geconfigureerd en een vergelijkbare tabel hebt gemaakt, kunt u het volgende verzoek verzenden:

Http://uw_site/bestandsnaam. php?id=2

En u moet twee regels verwijderen met een ID gelijk aan 2.

En nu kan iedereen van wie u gegevens uploadt, deze eenvoudig via de webinterface naar zijn of haar lokale computer exporteren. Deze methode is handig voor zowel zakelijke gebruikers, als u een applicatie voor uw organisatie ontwikkelt, als voor gebruikers van uw website op internet. Ik hoop dat deze methode je heeft geholpen. Succes!

.
De methode die in die notitie wordt gepresenteerd is inderdaad heel eenvoudig, maar is misschien niet altijd handig.
Er zijn veel andere manieren om tabelgegevens van PHP naar Excel over te zetten. Ik zal degene beschrijven die mij het meest eenvoudig en functioneel leek. Er moet vooral worden opgemerkt dat ik het niet heb over het genereren van een xls-bestand, maar alleen suggereer dat de gebruiker de ontvangen gegevens opent met behulp van Excel, zodat gebruikers die geen ervaring hebben met programmeren de vervalsing niet zullen opmerken.

Het eerste wat u dus hoeft te doen is op onze pagina een link plaatsen naar een script dat de volgende headers genereert:
header("Pragma: openbaar");
header("Verloopt: 0");
header("Cache-Control: moet opnieuw valideren, post-check=0, pre-check=0");
header("Cache-Control: privé", false);
header("Inhoudstype: applicatie/x-msexcel");
header("Inhoudsdispositie: bijlage; bestandsnaam=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Content-Transfer-Encoding: binair");
header("Inhoudslengte: " . $object->getFileSize());

$object is een bolvormig object in een vacuüm, dat elke lezer naar eigen inzicht kan implementeren. Het doel van getFileName() en getFileSize() getters wordt duidelijk uit hun namen. Het is de moeite waard om hier een niet voor de hand liggende nuance te benadrukken (met dank aan Savostin die me hieraan heeft herinnerd) - getFileName() kan uiteraard elke bestandsnaam retourneren, maar als je wilt dat de browser aanbiedt om de ontvangen inhoud in Excel te openen, dan moet het bestand extensie moet xl zijn.
Ik heb nog niets nieuws gezegd, dit alles is echter vóór mij uitgevonden, zoals hieronder zal worden beschreven.
Zoals terecht werd opgemerkt in de reacties op het bericht over het genereren van xls in PHP, werkt Excel veel sneller met XML. Maar het belangrijkste voordeel is misschien niet snelheid, maar veel bredere mogelijkheden. Ik ga niet dieper op het onkruid in, maar geef slechts een eenvoudig voorbeeld en een link naar een gedetailleerde beschrijving van alle tags.

Nadat de headers zijn gegenereerd, moeten we dus de daadwerkelijke gegevens aan de gebruiker doorgeven. Meestal verpak ik het genereren van tabellen in een aparte methode:
echo $object->getContent();

En ik genereer de tabel met Smarty:

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

Zoals u in de code kunt zien, wordt de array $data doorgegeven aan de sjabloon, die twee arrays bevat: de titelregel van de tabel en de gegevens zelf.
Het is vermeldenswaard dat het gebruik van een sjabloonengine alleen voor het genereren van XML nogal duur is, en dat XML op veel andere manieren kan worden verkregen. In mijn specifieke geval is het genereren van XML slechts een kleine bonus in een groot project waarbij een sjabloonengine onmisbaar is.

Als voorbeeld heb ik een eenvoudige tabel gegeven; indien gewenst kun je een veel groter aantal attributen manipuleren. Dit is vooral prettig gezien het feit dat er voor de implementatie geen bibliotheken van derden nodig zijn.
De beschreven methode werkt al enkele jaren aan één project en nog geen enkele gebruiker heeft tot nu toe vermoed dat de gegevens die hij opent geen MS Office-document zijn.

U kunt meer lezen over de XML-structuur die in MS Excel wordt gebruikt in