export mysql σε xls encoding

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
trelamenos333
Δημοσιεύσεις: 26
Εγγραφή: 24 Σεπ 2011 03:03

export mysql σε xls encoding

Δημοσίευση από trelamenos333 » 03 Σεπ 2013 14:26

Καλησπέρα παιδιά,
Αντιμετοπίζω ένα τεράστιο πρόβλημα με ένα project που τρέχω όταν κάνω export ένα xls αρχείο απο mysql. To θέμα είναι ότι όταν το ερώτημα είναι γενικό (select * ...) όλα είναι ΟΚ όταν όμως γίνεται πιο σύνθετο (inner join) τότε τα ελληνικά γίνονται ερωτηματικά και κινέζικα...
Παραθέτω τον κώδικα μου

Κώδικας: Επιλογή όλων

$link = mysql_connect ($Host, $User, $Password) or die('Could not connect: ' . mysql_error());
mysql_select_db($DBName) or die('Could not select database');

$select = "SELECT visits.id,visits.user_id,visits.company_id,visits.day,visits.month,visits.year,customer.name,visits.root_id,visits.start_time,visits.end_time,visits.comments,visits.evaluation FROM visits  inner join customer on visits.customer_id = customer.id where visits.user_id = '".$_SESSION['user_id']."' and visits.company_id = ".$_SESSION['company_id']."";

mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
$export = mysql_query($select);
$fields = mysql_num_fields($export);

 $csv_output = "ID\tΚωδικός Πωλητή\tΚωδικός Εταιρίας\tΗμέρα\tΜήνας\tΈτος\tΚωδικός Πελάτη\tΚωδικός Δρομολογίου\tΗμερομηνία\tΈναρξη Επίσκεψης\tΛήξη Επίσκεψης\tΣχόλια\tΑξιολόγιση\t";

while($row = mysql_fetch_row($export)) {
    $line = '';
    foreach($row as $value) {
        if ((!isset($value)) OR ($value == "")) {
            $value = "\t";
        } else {
            $value = str_replace('"', '""', $value);
            $value = '"' . $value . '"' . "\t";
        }
        $line .= $value;
    }
    $data .= trim($line)."\n";
}
$data = str_replace("\r","",$data);
$csv_output = iconv('utf-8','greek',$csv_output);
$data = iconv('utf-8','greek',$data);

header("Content-Type: application/vnd.ms-excel;  charset= utf8;");
header("Content-Disposition: attachment; filename=customer.xls");
header("Content-Transfer-Encoding: binary ");
header("Pragma: no-cache");
header("Expires: 0");
print $csv_output."\n".$data;
exit;
Ευχαριστώ!

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

export mysql σε xls encoding

Δημοσίευση από Apostolis_38 » 03 Σεπ 2013 14:31

Κανονικά δεν θα έπρεπε να δουλεύει ούτε με SELECT *.
Δοκίμασε με αυτό

Κώδικας: Επιλογή όλων

charset=cp1253 
στο header.
Αν η MySQL δεν υποστηρίζει το charset δες εδώ: http://daremon.gr/tools/mysql_windows_1 ... acter_set/

edit Υποθέτω πως έχεις ελέγξει το query σου αν είναι σωστό και πως αν "βγάλεις" την δημιουργία του excel τρέχει κανονικά.

trelamenos333
Δημοσιεύσεις: 26
Εγγραφή: 24 Σεπ 2011 03:03

export mysql σε xls encoding

Δημοσίευση από trelamenos333 » 03 Σεπ 2013 14:38

Ναι φίλε μου, αν απλά κάνω echo στον browser όλα είναι ΟΚ με το query!
Δοκίμασα αυτό που μου είπες αλλά τίποτα... στο microsoft office δεν φέρνει τίποτα και σε openoffice απλά ??????????? για τα ελληνικά.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

export mysql σε xls encoding

Δημοσίευση από gvre » 03 Σεπ 2013 14:46

Σβήσε τις μετατροπές με την iconv και δοκίμασε το παρακάτω.

http://www.skoumal.net/en/making-utf-8-csv-excel

ps. Μπορείς να χρησιμοποιήσεις την fputcsv αντί του custom κώδικα που έχεις γράψει.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

export mysql σε xls encoding

Δημοσίευση από Apostolis_38 » 03 Σεπ 2013 14:56

Ναι, sorry.
Δικό μου λάθος.
Αν πειραματιστείς κι άλλο με αυτόν τον τρόπο τότε

Κώδικας: Επιλογή όλων

$csv_output = iconv('utf-8','cp1253',$csv_output); 
$data = iconv('utf-8','cp1253',$data); 

trelamenos333
Δημοσιεύσεις: 26
Εγγραφή: 24 Σεπ 2011 03:03

export mysql σε xls encoding

Δημοσίευση από trelamenos333 » 03 Σεπ 2013 14:56

Δυστυχώς ούτε αυτό λειτούργησε...θα μπορούσες μήπως να μου στείλεις τον κώδικα μου χωρίς την fputs όπως εσύ το φαντάζεσαι μήπως και κάνω εγώ κάποιο λάθος;
Ευχαριστώ πολύ

trelamenos333
Δημοσιεύσεις: 26
Εγγραφή: 24 Σεπ 2011 03:03

export mysql σε xls encoding

Δημοσίευση από trelamenos333 » 03 Σεπ 2013 14:59

Αποστόλη ούτε τώρα..τα ίδια...τα ελληνικά είναι ερωτηματικά...

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

export mysql σε xls encoding

Δημοσίευση από Rapid-eraser » 03 Σεπ 2013 15:04

Δεν βάζεις κανένα PHPExcel να ξεμπερδεύεις :P
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

trelamenos333
Δημοσιεύσεις: 26
Εγγραφή: 24 Σεπ 2011 03:03

export mysql σε xls encoding

Δημοσίευση από trelamenos333 » 03 Σεπ 2013 15:09

Rapid-eraser δεν έχω ιδέα πως να το δουλέψω και φαντάζομαι πως θα μου πάρει πολύ χρόνο μέχρι να το μάθω και δυστυχώς δεν το έχω...

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

export mysql σε xls encoding

Δημοσίευση από Apostolis_38 » 03 Σεπ 2013 15:20

Κάνε για λιγο comment out το $csv_output και στα τρια σημεία που το χρησιμοποιείς και δοκίμασε πάλι να δούμε τι σου φέρνει.
Επίσης, μήπως κάποιος από τους πίνακες που εμπλέκονται στο inner join δεν είναι utf;
Είναι λίγο κουφό αυτό που συμβαίνει.

trelamenos333
Δημοσιεύσεις: 26
Εγγραφή: 24 Σεπ 2011 03:03

export mysql σε xls encoding

Δημοσίευση από trelamenos333 » 03 Σεπ 2013 15:28

Το έκανα Αποστόλη αλλά και πάλι ?????????????? όλοι μου οι πίνακες είναι utf8_general_ci όπως και τα επιμέρους πεδία τους. Μόνο οι αγγλικοί χαρακτήρες εμφανίζονται...

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

export mysql σε xls encoding

Δημοσίευση από fafos » 03 Σεπ 2013 15:49

Prospatise ta exhs:

kato apo tous headers vale auto:

Κώδικας: Επιλογή όλων

echo chr(255) . chr(254);
antikatesthse ta:

Κώδικας: Επιλογή όλων

$csv_output = iconv('utf-8','greek',$csv_output);
$data = iconv('utf-8','greek',$data); 
me auto:

Κώδικας: Επιλογή όλων

$csv_output =  mb_convert_encoding($csv_output , 'UTF-16LE', 'UTF-8');
$data =  mb_convert_encoding($data , 'UTF-16LE', 'UTF-8');
done...
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

trelamenos333
Δημοσιεύσεις: 26
Εγγραφή: 24 Σεπ 2011 03:03

export mysql σε xls encoding

Δημοσίευση από trelamenos333 » 03 Σεπ 2013 15:58

Φίλε Fafo απο παλαιότερο δικό σου Post είχα βρει αυτό το κομμάτι του κώδικα και απλά λίγο το είχα τροποποιήσει..δοκίμασα αυτό που είπες αλλά τίποτα και πάλι..δίνω ξανά τον κώδικα στην τελευταία version με τις αλλαγές σου:

Κώδικας: Επιλογή όλων

$link = mysql_connect ($Host, $User, $Password) or die('Could not connect: ' . mysql_error());
mysql_select_db($DBName) or die('Could not select database');
mysql_query("SET NAMES 'utf-8'");
mysql_query("SET CHARACTER SET 'utf-8'");
//////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
$select = "SELECT visits.id,visits.user_id,visits.company_id,visits.day,visits.month,visits.year,customer.name,visits.root_id,visits.start_time,visits.end_time,visits.comments,visits.evaluation FROM visits  inner join customer on visits.customer_id = customer.id where visits.user_id = '".$_SESSION['user_id']."' and visits.company_id = '".$_SESSION['company_id']."'";
$export = mysql_query($select);
$fields = mysql_num_fields($export);

for &#40;$i = 0; $i < $fields; $i++&#41; &#123;
    $csv_output .= mysql_field_name&#40;$export, $i&#41; . "\t";
&#125;

while&#40;$row = mysql_fetch_row&#40;$export&#41;&#41; &#123;
    $line = '';
    foreach&#40;$row as $value&#41; &#123;
        if &#40;&#40;!isset&#40;$value&#41;&#41; OR &#40;$value == ""&#41;&#41; &#123;
            $value = "\t";
        &#125; else &#123;
            $value = str_replace&#40;'"', '""', $value&#41;;
            $value = '"' . $value . '"' . "\t";
        &#125;
        $line .= $value;
    &#125;
    $data .= trim&#40;$line&#41;."\n";
&#125;
$data = str_replace&#40;"\r","",$data&#41;;
$csv_output =  mb_convert_encoding&#40;$csv_output , 'UTF-16LE', 'UTF-8'&#41;;
$data =  mb_convert_encoding&#40;$data , 'UTF-16LE', 'UTF-8'&#41;; 

header&#40;"Content-Type&#58; application/vnd.ms-excel;  charset= utf8;"&#41;;
header&#40;"Content-Disposition&#58; attachment; filename=customer.xls"&#41;;
header&#40;"Content-Transfer-Encoding&#58; binary "&#41;;
header&#40;"Pragma&#58; no-cache"&#41;;
header&#40;"Expires&#58; 0"&#41;;
echo chr&#40;255&#41; . chr&#40;254&#41;;
print $csv_output."\n".$data;
exit;

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

export mysql σε xls encoding

Δημοσίευση από Apostolis_38 » 03 Σεπ 2013 16:20

Δεν έχει λογική να δουλεύει με SELECT * και να μην δουλεύει με INNER JOIN.
Κάτι παίζει με τη βάση σου.
Είσαι σίγουρος οτι αν κάνεις SELECT * για κάθε ένα πίνακα, εξάγει ΟΛΕΣ τις εγγραφές από ΟΛΟΥΣ τους πίνακες κανονικά;
Εχεις ψάξει τα αρχεία καλά;

trelamenos333
Δημοσιεύσεις: 26
Εγγραφή: 24 Σεπ 2011 03:03

export mysql σε xls encoding

Δημοσίευση από trelamenos333 » 03 Σεπ 2013 16:38

Αποστόλη χωρίς να κάνω καμία τεράστια αλλαγή εκτός απο κάτι παύλες στο utf8 και αφαιρώντας όλα τα σχόλια που είχα κάτω απο το αρχείο κατέληξα στο εξής:
Οι εγγραφές έρχονται κανονικότατα και με inner join μόνο όταν το $csv_output βγαίνει αυτόματα..όταν πάω να το θέσω εγω ώστε να μην έχει τους αγγλικούς τίτλους πεδιων της βάσης χαλάνε όλα! Τι πιστεύεις ότι θέλει;;

Δουλεύει

Κώδικας: Επιλογή όλων

for &#40;$i = 0; $i < $fields; $i++&#41; &#123;
    $csv_output .= mysql_field_name&#40;$export, $i&#41; . "\t";
&#125;
Δεν Δουλεύει

Κώδικας: Επιλογή όλων

for &#40;$i = 0; $i < $fields; $i++&#41; &#123;
    $csv_output = "ID\tΚωδικός Πωλητή\ttΚωδικός Εταιρίας\tΗμέρα\tΜήνας\tΈτος\tΕπωνυμία\tΚωδικός Διαδρομής\tΏρα Έναρξης\tΏρα λήξης\tΣχόλια\tΑξιολόγιση\t";
&#125;

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης