Archief - export naar csv

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

breez

Legacy Member
Ik zit al ruim een uur te sukkelen in PHP om data uit MySQL te exporteren naar CSV (om te openen in excel)

Het is de bedoeling dat ik in mijn excel document twee kolommen krijg: Jaar en Titel

Het probleem echter is dat iedere rij met data in 1 kolom wordt gestoken. De excel file ziet er nu zo uit:
Code:
Jaar,Titel
2007,"titel 1"
2008,"titel 2"
Terwijl het er zo zou moeten uitzien:
Code:
Jaar TAB Titel
2007 TAB titel 1
2008 TAB titel 2
(de TAB stelt cel opschuiven naar rechts voor, 2 kolommen dus)

Mijn code ziet er als volgt uit: (komt van de fputcsv documentatie, lichtjes aangepast))
PHP:
function query_to_csv($result, $filename, $attachment = false, $headers = true) {
       
        if($attachment) {
            // send response headers to the browser
            header( 'Content-Type: text/csv' );
            header( 'Content-Disposition: attachment;filename='.$filename);
            $fp = fopen('php://output', 'w');
        } else {
            $fp = fopen($filename, 'w');
        }
       
        if($headers) {
            // output header row (if at least one row exists)
            $row = mysql_fetch_assoc($result);
            if($row) {
                fputcsv($fp, array_keys($row));
                // reset pointer back to beginning
                mysql_data_seek($result, 0);
            }
        }
       
        while($row = mysql_fetch_assoc($result)) {
            fputcsv($fp, $row);
        }
       
        fclose($fp);
}

Ik geef dus gewoon een resultset en filename mee en roep die functie op. Wat ik ook probeer, ik slaag er niet in om 2 kolommen te bekomen...

Jaar is van type int(4) en Titel is van type text

Cyberkef

Legacy Member
De csv ziet er nochthans goed uit. Ik denk dat het eerder aan je excel ligt. Met welke extensie sla je de dile op... csv of xls?

breez

Legacy Member
Cyberkef zei:
De csv ziet er nochthans goed uit. Ik denk dat het eerder aan je excel ligt. Met welke extensie sla je de dile op... csv of xls?

.csv :)

Sent from my GT-I9000 using Tapatalk 2

Cyberkef

Legacy Member
probeer es xls, ik herinner mij vaag dat ik in windows dat probleem ook es voorhad...

Tyfius

Legacy Member
Ge moet die delimiter aanpassen als ge uw CSV open doet in excel. Normaal als ge open from source kiest, of import kan je dat aanpassen.

gille

Legacy Member
CSV zomaar openen in excel gaat niet he, btw. Je moet het importeren via data. Geen idee of je dit nu al doet maar miss ligt het daar aan...

Fr3aK

Legacy Member
Voor zover ik weet gebruikt Office standaard ; als delimiter voor CSV bestanden.
Toen ik vroeger via PHP csv-bestandjes aanmaakte gebruikte ik altijd punt-komma ipv komma.

Een oplossing:
PHP:
fputcsv($fp, array_keys($row), ';');

breez

Legacy Member
Cyberkef zei:
probeer es xls, ik herinner mij vaag dat ik in windows dat probleem ook es voorhad...
Als je dat probeert krijg je een foutmelding van Excel dat het bestand ongeldig / beschadigd is :)

Fr3aK zei:
Voor zover ik weet gebruikt Office standaard ; als delimiter voor CSV bestanden.
Toen ik vroeger via PHP csv-bestandjes aanmaakte gebruikte ik altijd punt-komma ipv komma.

Een oplossing:
PHP:
fputcsv($fp, array_keys($row), ';');

That did the trick :) Dit is de werkende code:
PHP:
function query_to_csv($result, $filename, $attachment = false, $headers = true) {
       
        if($attachment) {
            // send response headers to the browser
            header( 'Content-Type: text/csv' );
            header( 'Content-Disposition: attachment;filename='.$filename);
            $fp = fopen('php://output', 'w');
        } else {
            $fp = fopen($filename, 'w');
        }
       
        if($headers) {
            // output header row (if at least one row exists)
            $row = mysql_fetch_assoc($result);
            if($row) {
                fputcsv($fp, array_keys($row), ';');
                // reset pointer back to beginning
                mysql_data_seek($result, 0);
            }
        }
       
        while($row = mysql_fetch_assoc($result)) {
            fputcsv($fp, $row, ';');
        }
       
        fclose($fp);
}

dJeez

Legacy Member
gille zei:
CSV zomaar openen in excel gaat niet he, btw. Je moet het importeren via data. Geen idee of je dit nu al doet maar miss ligt het daar aan...
CSV openen gaat perfect in Excel, voorzover die CSV in UTF-8 of UTF-16 staat en je de velden opgeeft gescheiden door ;.

Je kan echter als alternatief ook XLS(X) bestanden gaan creëren via vb. PHPExcel, maar dat is uiteraard wel (veel) zwaarder naar resources (memory, server load) toe, en dus niet steeds aan te raden (hangt van de use case af).

Tyfius

Legacy Member
Ik herhaal mijn antwoord nog eens. Of ge een , een ; of een TAB gebruikt maakt niet zoveel uit, ge kunt dat in excel kiezen wanneer je die .csv importeert of na het openen je data formaat aanpast. Microsoft Excel: A Turorial

dJeez

Legacy Member
Tyfius zei:
Ik herhaal mijn antwoord nog eens. Of ge een , een ; of een TAB gebruikt maakt niet zoveel uit, ge kunt dat in excel kiezen wanneer je die .csv importeert of na het openen je data formaat aanpast. Microsoft Excel: A Turorial
Als je die direct wil openen door te dubbelklikken (en dus niet via import werkt) maakt dat wel degelijk uit. Voor de meeste gebruikers zijn de extra stappen voor import een brug te ver (en handleidingen lezen zit er doorgaans ook niet in). Waarom zou je dat een gebruiker ook aandoen als je weet dat het bestand direct geopend kan worden door ; als separator te gebruiken...
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan