Problem mit Umlaute bei Export von MySQL-Daten in Excel-Datei

Pinky

Erfahrenes Mitglied
Hallo zusammen,

ich habe mir eine Exportfunktion geschrieben, die mir MySQL-Daten rauslesen soll und per header() als Exceldatei zum speichern anbieten soll. Das funktioniert auch ohne Probleme. Doch leider machen die verflixten Umlaute wieder mal Schwierigkeiten. Diese werden nämlich ganz komisch angezeigt:

ä wir zu ?§
ü wir zu ?º
ö wir zu ??

Die MySQL-Tabelle sowie jedes Feld in der Tabelle hat die Kollation utf8_general_ci.

Bei der MySQL-Verbindung habe ich hinzugefügt:
PHP:
mysql_query("SET NAMES 'utf8'", $verbindung);
mysql_query("SET CHARACTER SET 'utf8'", $verbindung);

Zudem habe ich im Exportfile folgenden Befehl ganz oben eingefügt:
PHP:
header("Content-type: text/html; charset=utf-8");

Doch eben, das alles nützt nichts. Kann mir jemand helfen, was ich noch ändern muss? Wenn ihr noch mehr Code braucht, einfach schreiben, liefere ich gerne.

Lieber Gruss & herzlichen Dank im Voraus.
Euer Pinky
 
Bis du dir so sicher das MS Excel UTF-8 kann? Ich hatte bisher noch keine Möglichkeit gefunden eine CSV Datei in utf8 in Excel korrekt darzustellen.

Vielleicht solltest du mal mit iso 8859 als Zeichensatz des Dokumentes versuchen.
 
Danke für die Antwort.

Habe den Header in der Datei mal auf folgende Zeile geändert:
PHP:
header("Content-type: text/html; charset=ISO-8859-1");

Danach exportierte ich nochmals, doch die Umlaute sind immer noch unschön.

Darauf änderte ich die Kollation in der MySQL-DB auf latin1_general_ci und exportierte nochmals das File, doch auch dies blieb ohne Erfolg.

Ich verstehe diesen ganzen Zeichencodierungsjungel überhaupt nicht, darum bin ich auch dermassen ratlos. Warum gibt es so viele Codierungen? Ist das lediglich computerentwicklungsbedingt?

Bin gerne für weitere Ratschläge offen :).

Danke vielmals & lieber Gruss
Euer Pinky
 
Die Header ausgabe zuändern genau wie die Datenbank bringt nichts, da die Daten warscheinlich schon als UTF8 darin enthalten sind. Die collation hinterher zu ändern. Ändert nichts an den Daten und damit machst du es nur noch schlimmer .)

Entweder du sagst der Datenbankverbinung das es die Daten bei der Ausgabe nach iso hin codieren soll. Oder du verwendest utf8_decode() auf die entsprechenden Felder.
 
Danke für die schnelle Antwort. Habe ich sofort versucht und tatsächlich ist etwas geschehen. Die Umalute werden nun folgendermassen dargestellt (muss das etwas grösser machen, damit die Zeichen erkannt werden können):

ä wird zu ‰
ö wird zu ˆ
ü wird zu ¸


Ich habe auch gerade versucht, dieses Zeichen per
PHP:
str_replace()
in ä, ö, ü's umzuwandeln mit negativem Resultat. Nichts geschah...!

Was ich noch nicht versucht habe ist, der Datenbankverbindung zu sagen, sie soll mir die Daten ISO-Codiert rausgeben. Wie mach ich das? Muss ich da im
PHP:
mysql_query("SELECT * ... ")
irngedwo die Codierung angeben?

Danke für weitere Vorschläge & lieber Gruss
Euer Pinky
 
Ich habe zwischenzeitlich noch etwas rumprobiert. So hab ich z.B. folgende Codes getestet:

PHP:
$value = mb_convert_encoding($value, "ISO-8859-1", mb_detect_encoding($value, "UTF-8, ISO-8859-1", true));

und

PHP:
$value = iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $value);

Leider blieben auch diese beide erfolglos.

Danke für jede weitere Anmerkung.

Lieber Gruss
Euer Pinky
 
Hallo Pinky,
exportierst Du die MYSQL-Daten in ein CSV-File? Excel hat bei bei einem meiner Exports die BOM benötigt. Vielleicht hilft es?
PHP:
fwrite($temp, b"\xEF\xBB\xBF"); //write BOM
In meinem Code wurde die BOM in eine Datei geschrieben, Du musst es eben "echoen".

Viele Grüße
 
Hallo,

danke für die Antwort. Ich versteh nicht ganz, was du damit meinst, dass ich es eben "echoen" muss (also ich weiss, was du damit meinst, aber ich weiss nicht, wie ich es machen muss :).

Ich weiss eben nicht, ob ich dem System vorgaukle, ein .XLS zu erstellen, in Wahrheit aber ein .CSV erstellt wird.

Mein Code zum erstellen des Scripts ist folgender. Wo muss ich nun den BOM einbauen? Die Funktion fwrite() kann ich ja schlecht verwenden...!

PHP:
<?
	header("Content-type: application/vnd-ms-excel"); 
	header("Content-Disposition: attachment; filename=".$_GET[cat].".xls");
	header("Pragma: no-cache");
	header("Expires: 0");

	$res = mysql_query("SELECT * FROM `datenbank`");

	$db_felder = array( "name" , "vorname");
	$num = count($db_felder);

	for ($i=0; $i<$num; $i++)
		{ $header .= ucfirst($db_felder[$i]) . "\t"; }

	echo $header."\n";

	while($row = mysql_fetch_array($res))
	{

		$line = '';

			foreach($db_felder as $value)
			{
				if ((!isset($value)) OR ($value == ""))
				{
					$value = "\t";
				}
				
				else
				{ 
					$value = $row[$value];					
					$value = str_replace('"' , '""' , $value);
					$value = '"' . $value . '"' . "\t"; 
				}
				
				$line .= $value; 
			}

		$data .= trim($line)."\n"; 
	}

	$data = str_replace("\r","",$data);
	
	if ($data == "")
	{
		$data = "\n(0) Keine Datenätze gefunden!\n";
	}

	print "$headern$data";
?>

Herzlichen Dank & lieber Gruss
Euer Pinky
 
Zuletzt bearbeitet:
Die BOM liegt in den ersten drei Byte einer Datei, bei Dir muss es also vor dem Tabellenkopf ausgegeben werden:
PHP:
echo b"\xEF\xBB\xBF";
echo $header."\n";
Bei der Schreibweise bin ich mir nicht sicher, es scheint Versionsabhängig zu sein. Ich empfehle Dir außerdem mal den Befehl fputcsv anzuschauen, mit welchem Du Daten ins CSV-Format wandeln kannst. Übrigens sollte die Dateiendung, nicht *.xls sondern *.csv sein, denn XLS sind Binärdaten.
 
Hi,

der Content-Encoding header und die BOM haben überhaupt keinen Einfluss auf Excel-Dateien, da diese ein Binärformat sind, und Header und BOM nur für Textformate gelten.

Außerdem erscheint mir die Ausgabe, die du erzeugst eher CSV oder TSV oder etwas ähnliches zu sein, in dem Fall wäre der Content-Type header definitiv nicht richtig.
 

Neue Beiträge

Zurück