Autor Zpráva
Andrej.B
Profil
Zdravim,
potrebujem z aplikacie mat moznost stiahnut data ako CSV. Pokial to urobim cez Adminer, tak mi krasne stiahne a ukaze data klasicky z hackami a dlznami. Pokial to prezeniem cez moj script, tak mi po otvoreni v Exceli ukaze 'VyÄŤistiĹĄ ' miesto Vyčistiť .... Pravdepodobne zle zadefinovany charset.

Na pripojenie pouzijem
$conn = new mysqli($localhost, $user, $password, $databaza);

mysqli_set_charset($conn, 'utf8');
Kuknem co je nastavene:
printf("pouzity charset: %s\n", $conn->character_set_name());
pouzity charset: utf8


Jednoduchy script vytvori subor page-data-export.csv v ktorom mam hacky a dlzne zle...
Tie headery som uz skusal rozne.
header('Content-Type: text/csv; charset=utf-8');
header('Content-Encoding: UTF-8');
header('Content-Type: text/csv; charset=utf-8');
header('Content-Type: application/csv');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=page-data-export.csv');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
$handle = fopen('php://output', 'w');
    ob_clean(); // clean slate

$q = "
SELECT * FROM cinnost_cistenie";



$check_zaznam_cistenie = $conn->query($q);
                              while ($row_zaznam_cistenie_show = $check_zaznam_cistenie->fetch_array())
                                {
     

        fputcsv($handle, $row_zaznam_cistenie_show);   
      }

    ob_flush(); 
    fclose($handle);
    die();        
   

Pokial sa na subor pozriem cez TotalComander pomocou F3, vsetko je pekne, tak isto aj ked sa divam rovnako na subor, ktory generoval Adminer.
Pokial si subor dam v Exceli importovat ako text/data tak mi da 'file origin' 1250 Central European a nie UTF ak dam importovat ten z Admineru. Ako docielit toho aby mi ten subor ukladalo v UTF8?Ake hlavicky pouzit? Kukal som aj do zdrojakov Admineru ako to ma tam urobene, ale nepodarilo sa mi najst nic.

Script vyssie je len taky nastrel, kdesi musi byt nejaka chyba. Subor je ulozeny ako utf-8 v notepad ++, nikde inde nemam ziadny problem z diakritikou iba pri tomto exportovani...

PS: ked dam subor ulozit ako txt, tak sa mi diakritika nedobabre ked ho otvaram.

Dakujem
Kajman
Profil
Když soubor uložíte a otevřete z disku, je tam volba kódování. V LibreOffice to je v pořádku? Ovlivní to přidání BOM pro utf8 na začátek souboru?
Andrej.B
Profil
Kajman:
ked otvaram z disku nemam moznost volby kodovania, Excel to proste otvori.
Libre office nemam a ani nebude k dispoziici.
Kukam na ten BOM... poskusam este :)
Dik.
Kajman
Profil
Ještě je varianta, že při vytváření řeknete databázi, že chcete používat cp1250. Ale bude to fungovat asi jen v českém a slovenském excelu a pokud tam jsou jen znaky, které v tom kódování jsou.
Andrej.B
Profil
takze ten BOM pomohol.
A priamo z www.php.net/manual/en/function.fputcsv.php#118252

fputs($handle, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));



Kompletny kod, ktorym vytahujem z databazy zaznamy a potom ich exportujem do CSV na stiahnutie. Subor je pripraveny na formatovanie ako TABLE v Exceli, kde sa s nim moze dalej pracovat (mohol by som to priamo spracovat tak, ale to bude iny pribeh uz asik), ak by niekto potreboval.

Dakujem za postrcenie Kajman

<?php

    $what = $_GET['what'];
    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Encoding: UTF-8');
    header('Content-Type: application/csv');
    header("Content-Disposition: attachment; filename=".$what.".".Date("Y").".csv");
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

$handle = fopen('php://output', 'w');
ob_clean(); 

      
$q = "
SELECT zc.datum_zaznam_cistenie, cc.nazov_cinnost_cistenie,u.meno_user,s.pc_stroj, u.info,s.typ_stroj
FROM zaznam_cistenie zc
JOIN cinnost_cistenie cc
         ON cc.id_cinnost_cistenie = zc.id_cinnost_cistenie
JOIN user u
         ON u.id_user = zc.id_user
JOIN stroj s
         ON s.id_stroj= zc.id_stroj
WHERE
    YEAR(FROM_UNIXTIME(zc.datum_zaznam_cistenie)) = ".Date("Y")."
ORDER BY 
    zc.datum_zaznam_cistenie DESC";


fputs($handle, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) )); // BOM pre excel v UTF-8, dolezite!


$enclosure = ' ';    // ciste data bez " alebo ' , musi byt medzera
$delimiter = ';';    // pouzity delimiter 
    /*
    znak ; vyuziva novy cell pre kazdu bunku
    znak , pouzije jednu bunku pre vsetko, oddeli to ciarkou (,)
    obcas zalezi na nastaveni Excelu, US ci SK, CZ
    */
    
    
$check_zaznam_cistenie = $conn->query($q);

// headers pre CSV subor
    $fields = array('Pocet', 'datum', 'cas', 'Názov činnosti', 'Názov stroj', 'Typ stroja', 'Užívateľ'); 
    fputcsv($handle, $fields, $delimiter, $enclosure); 


$i= 0; // vynulovanie pocitadla zaznamov
   
    while($row = $check_zaznam_cistenie->fetch_assoc())
    {
$i++; // pridanie +1 do pocitadla zaznamov pri prechode WHILE
        
// naplnenie datami        
    $timestamp = new DateTime(null, new DateTimeZone('Europe/Bratislava')); // Zadanie do SEC casu
    $timestamp->setTimestamp($row['datum_zaznam_cistenie']); // datum z DB v tvare Unixtimestamp
    
 $lineData = 
 array
 (
 $i, 
 $timestamp->format("d.m.Y"), 
 $timestamp->format("H:i:s"), 
 $row['nazov_cinnost_cistenie'], 
 $row['pc_stroj'], 
 $row['typ_stroj'], 
 $row['info']
 );
 
// naplnenie riadku pri prechode WHILE
 fputcsv($handle, $lineData, $delimiter, $enclosure); 
    }         
    


    ob_flush();
    fclose($handle);
    die();    

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0