Linuchs: CSV an Excel ausliefern

Hallo,

auf Anforderung im Browser sende ich eine CSV-Datei, die direkt mit einem Kalkulationsprogramm geöffnet oder abgespeichert werden kann.

Excel 2003 unter Windows kann die Umlaute nicht richtig darstellen. Ich vermute, der Header wird von Excel ignoriert. Da es mi UTF-8 nicht funktioniert, habe ich iso-8859-1 probiert mit demselben Fehler:

    $fp = fopen('php://output', 'wb');  
    // Passenden Datentyp erzeugen.  
    header("Content-Type: application/octet-stream");  
//  header('Content-Type: application/msexcel; Charset=utf-8');  
    header('Content-Type: application/msexcel; Charset=iso-8859-1');  
    header("Content-Disposition: attachment; filename=\"$csv_filename\"");  
    foreach($csv_werte as $key => $value)  
    {  
      foreach($value as $val)  
      {  
        $val = utf8_decode($val); // Einzelwerte utf-8 zu iso-8859-1  
      }  
      fputcsv($fp, $value, "\t"); // Zeile ausgeben, Feldtrenner ist TAB  
    }  
    fclose( $fp );  

Woran liegt es?

Linuchs

  1. Hi,

    auf Anforderung im Browser sende ich eine CSV-Datei, die direkt mit einem Kalkulationsprogramm geöffnet oder abgespeichert werden kann.

    der "richtige" Content-Type für Excel-Dokumente ist meiner Recherche nach application/vnd.ms-excel, gilt aber für echte Excel-Daten. Der von dir verwendete Typ application/msexcel ist AFAIK ein Überbleibsel aus uralten Zeiten. Für CSV-Daten sollte aber nach mehrheitlich vorherrschender Meinung text/csv verwendet werden.
    Und das ist für dich auch eine gute Idee, denn nur für die Typen text/* ist die Angabe einer Codierung hintendran vorgesehen.

    // Passenden Datentyp erzeugen.
        header("Content-Type: application/octet-stream");
    //  header('Content-Type: application/msexcel; Charset=utf-8');
        header('Content-Type: application/msexcel; Charset=iso-8859-1');
        header("Content-Disposition: attachment; filename="$csv_filename"");

    Hat es einen Grund, dass du den Content-Type-Header erst auf application/octet-stream setzt, und ihn dann nochmal überschrieben willst? Ich bin mir im Moment nicht sicher, ob dann der zuerst gesetzte gewinnt oder der zuletzt gesetzte. Aber das könnte man ja leicht feststellen, indem man mal nachschaut, welcher beim Client ankommt.

    Ciao,
     Martin

    --
    Niemand ist überflüssig: Er kann immer noch als schlechtes Beispiel dienen.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hello,

    Excel 2003 unter Windows kann die Umlaute nicht richtig darstellen. Ich vermute, der Header wird von Excel ignoriert. Da es mi UTF-8 nicht funktioniert, habe ich iso-8859-1 probiert mit demselben Fehler:

    Du scheinst Recht zu haben. So funktioniert es:

      
      
    <?php   ### db_get_csv.php ### utf-8 ### ÄÖÜäöü  
      
    	include ('../../includes/functions.php');  
    	include ('../../includes/config.php');  
      
    	$con = get_db_con();  
    	$sql =  "SELECT * FROM `login`";  
    	$result = mysqli_query($con, $sql) or die($sql . '<br>' . mysql_error());  
      
    	$_list = array();  
    	while ($_row = mysqli_fetch_assoc($result))  
    	{  
    		$_list[] = $_row;  
    	}  
    	  
    	$fp = fopen('php://output', 'wb');  
      
    	header('Content-Type: application/msexcel; Charset=utf-8');  
    	#header('Content-Type: text/csv; Charset=iso8859-1');  
      
    	foreach($_list as $key => $_value)  
    	{  
    		$_value = array_map('utf8_decode', $_value);  
    	    fputcsv($fp, $_value, "\t");  
    	}	  
      
    ?>  
      
    
    

    Meine Datenbank ist auf utf-8 eingestellt und die Seite, aus der ich das aufrufe auch.

    Excel kann kein utf-8.

    OpenOffice.org-Calc önnet den Importmanager, wie erwartet, und zeigt an, dass ich UTF-8 behauptet habe, aber dass in der betroffenen Zeile ISO8859-1 drin steckt.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com
    1. Hallo Tom,

      Du scheinst Recht zu haben. So funktioniert es:

      Danke dir. Mal sehen, ob es so beim Kunden mit Excel funktioniert, mein Rechner ist Microsoft-befreit, mit Libre Office Calc klappt's (auch vorher schon).

      Linuchs

  3. hi,

    auf Anforderung im Browser sende ich eine CSV-Datei, die direkt mit einem Kalkulationsprogramm geöffnet oder abgespeichert werden kann.

    Warum nicht gleich eine Excel-Datei?

    Horst