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



## Pinky (17. Juni 2010)

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:

```
mysql_query("SET NAMES 'utf8'", $verbindung);
mysql_query("SET CHARACTER SET 'utf8'", $verbindung);
```

Zudem habe ich im Exportfile folgenden Befehl ganz oben eingefügt:

```
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


----------



## Michael Engel (17. Juni 2010)

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.


----------



## Pinky (17. Juni 2010)

Danke für die Antwort.

Habe den Header in der Datei mal auf folgende Zeile geändert:

```
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


----------



## Michael Engel (17. Juni 2010)

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.


----------



## Pinky (17. Juni 2010)

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 
	
	
	



```
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 
	
	
	



```
mysql_query("SELECT * ... ")
```
 irngedwo die Codierung angeben?

Danke für weitere Vorschläge & lieber Gruss
Euer Pinky


----------



## Pinky (17. Juni 2010)

Ich habe zwischenzeitlich noch etwas rumprobiert. So hab ich z.B. folgende Codes getestet:


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

und


```
$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


----------



## Bullja (17. Juni 2010)

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?

```
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


----------



## Pinky (18. Juni 2010)

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...!


```
<?
	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


----------



## Bullja (18. Juni 2010)

Die BOM liegt in den ersten drei Byte einer Datei, bei Dir muss es also vor dem Tabellenkopf ausgegeben werden:

```
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.


----------



## EvilO (18. Juni 2010)

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.


----------



## Sven Mintel (18. Juni 2010)

Moin,
zusätzlich zu den von EvilO gemachten Anmerkungen betreffs CSV:

Excel lässt sich lt. meiner Erfahrung keinen Zeichensatz aufzwingen, ASCII dürfte da der kleinste gemeinsame Nenner sein.

Ich würde dort also auf UTF8 verzichten, und die Daten generell nach Latin1 oder CP1252 umwandeln, damit sollte Excel klarkommen.


----------

