[php] export do csv

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
tatu
Nowy
Nowy
Posty: 89
Rejestracja: śr lut 09, 2005 1:58 pm

[php] export do csv

Post autor: tatu »

witam,
mam problem z eksportowaniem do pliku csv, tj. tresc pliku nie dzieli mi sie na wiersze w kolumnach (wszystko wyswietla sie w jednej komorce tabeli) i źle koduje polskie znaki (baza jest w utf)
plik po sciagnieciu na dysk otwieram w M$ Excelu 2003

Kod: Zaznacz cały

<?php

header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=arkusz.csv");
header("Pragma: no-cache");
header("Expires: 0");

include('config.php');
include('db_polaczenie.php');
$PHP_SELF=$_SERVER['PHP_SELF'];

$sep = ",";
$newLine = "\n";
$now_date = date('d-m-Y H:i');

echo('lista z:'.$sep.$now_date.$newLine);
echo ('nr'.$sep.'tytul'.$sep.'data'.$sep.$newLine);

$wynik=mysql_query('SELECT * FROM lista ORDER BY id',$DBPolaczenie);
   if(!$wynik)
           {
           exit('blad bazy danych:'.mysql_error($DBPolaczenie));
    }
   $lista_wpisow='';
   while($rekord=mysql_fetch_array($wynik))
           {
           $id=$rekord['id'];
           $tytul=$rekord['tytul'];
           $data=$rekord['data'];			
           $lista_wpisow.=$id.$sep.$tytul.$sep.$data.$sep.$newLine;           
    }
echo($lista_wpisow);
?>
masterix
Przelotem
Przelotem
Posty: 220
Rejestracja: wt wrz 07, 2004 6:44 pm
Kontakt:

Re: [php] export do csv

Post autor: masterix »

A nie łatwiej byłoby użyć jakieś klasy z phpclassess.org? Albo chociaż podpatrzeć jak tam to jest rozwiązane? :)

pzdr.
the_foe
Przelotem
Przelotem
Posty: 295
Rejestracja: pt sty 31, 2003 12:53 pm
Lokalizacja: Wałbrzych
Kontakt:

Re: [php] export do csv

Post autor: the_foe »

w excellu separatorem jest ;
poza tym tzreba pamietac o:
jesli komorka zawiera = ' " lub ; tzreba zamknac tresc w cudzyslowiu
kazdy cudzyslow ktory jet w tresci trzeba zamienic na dwa cydzylowia " => ""
jesli tresc nie zaczyna sie i nie konczy znakami widzialnymi trzeba zamknac tresc w cudzyslowiu
trzeba usunac znaki nowej linii z tresci.

funckja wyglada mniej wiecej tak:



[php]<?php
function do_CSV($arr){
#tworzy z macierzy string ktory moza byc zapisany jako CSV
if (is_array($arr)){
$cs="";
foreach ($arr as $v){
foreach ($v as $vv){
if ( str_replace(array('"',"=",";","'"),"",$vv)==$vv )
$is=0;
else
$is=1;

$vv=str_replace('"','""',$vv);
$vv=str_replace(array("\r\n","\n","\r",'\r\n','\n','\r')," ",$vv);
if (trim($vv)!=$vv){
$vv='"'.$vv.'"';
}elseif ($is==1){
$vv='"'.$vv.'"';
}
$cs.=$vv.";";
}
$cs=substr($cs,0,strlen($cs)-1);
$cs=$cs."\r\n";
}
return $cs;
}
}

?>[/php]

tak wiec najepierw tzreba wrzucic wynik zapytania do tablicy a potem uzyc tej funkcji. Przy wiekszych plikach jednak moze to byc karkolomne - duze tablice zajmuja duzo zasobow, wtedy trzeba uzyc funkcji sekwencyjnie:

[php]<?php
$temp=array();
while ($row = mysql_fetch_assoc($costam)){
$temp[0]=$row;
echo do_CVS($temp);

}
?>[/php]
ODPOWIEDZ