Aus mySQL-Datenbank in OpenOffice Calc-Datei exportieren

flohaase

Mitglied
Hey Leute

Ich versuche gerade eine Liste mit Kundendaten, die ich aus meiner mySQL-Datenbank auslese in eine OpenOffice Calc-Datei zu exportieren. Für eine Excel-Datei benutze ich derzeit folgenden Code:

PHP:
	//mySQL-Abfrage

		$header .= Kundennummer . "\t";
		$header .= Name . "\t";
		$header .= Postleitzahl . "\t";
		$header .= Stadt . "\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); 

	$currentDate = date('d.m.Y');
	$fileName = ’NAME '.$currentDate.'';

	// Anzahl der Einträge zählen
	
	$fileHead = utf8_decode(’Titel');
	$fileColsingCount = utf8_decode('Anzahl der Einträge: '.$count_sho.'');
	$fileColsingDate = 'Stand: ' . $currentDate . '';
	$decodeData = utf8_decode($data);
	
	header("Content-type: application/octet-stream“); // speziell für Excel
	header("Content-Disposition: attachment; filename=".$fileName.".xls“); // speziell für Excel
	header("Pragma: no-cache");  
	header("Expires: 0");
	print "$fileHead\n\n$header\n\n$decodeData\n$fileColsingCount\n$fileColsingDate";

Ich dachte, dass ich mir die beiden Zeilen speziell für Excel ändern muss. Ich bin davon ausgegangen, dass OOo Calc ebenso mit Tabs \t arbeitet.

Folgendes habe ich schon versucht:

PHP:
header('Content-type: application/vnd.sun.xml.calc‘);
oder
PHP:
header('Content-type: application/vnd.oasis.opendocument.spreadsheet‘);

Außerdem habe ich die Dateiendung in .ods, in o.odf und in .scx geändert.

Das Ergebnis war, dass sich anstelle von OOo Calc sich der normale Writer geöffnet hat und darin die Daten zwar zu sehen war, aber nicht formatiert.

Weiß einer weiter?

Vielen Dank, Gruß Flo
 
Grundsätzlich würde ich dir ja vorschlagen, es als CSV zu implementieren. CSV hat den Vorteil, das man es in einer beliebigen Anwendung (sei es Calc, Writer, Excel oder Word) öffnen kann und es immer korrekt funktioniert.

Die dazu notwendige Funktion kannst du hier finden: http://php.net/manual/en/function.fputcsv.php

Um es wirklich als OOo-Dokument zu implementieren brauchst du mehr, als nur eine Datei, in der die Inhalte drin stehen. OOo-Dokumente bestehen aus einem ZIP-Komprimierten Archiv, in welchem vor allem auch Meta-Informationen über das Spreadsheet stehen. Dafür kannst du die Klasse verwenden, die du im meinem ersten Post finden kannst. Denn die Klasse erstellt ein tatsächliches OOo-Dokument mit allen Meta-Informationen, die dafür notwendig sind. Dafür darfst du Klasse aber nicht auseinander nehmen sondern musst sie als komplette Bibliothek einbauen.
 
Ok, dann werde ich mir das CSV Ding mal anschauen.

Eine nichtformatierte Liste in eine Excel-Datei zuschreiben ist ja recht einfach, daher dachte ich, dass es vllt eben so leicht ist, sie in eine OOo-Datei zu speichern.

Danke :)
 
Hallo!

Um es wirklich als OOo-Dokument zu implementieren brauchst du mehr, als nur eine Datei, in der die Inhalte drin stehen.
Naja, es würde ja noch *.fods (OpenDocument Spreadsheet (Flat XML)) geben, also eine einzelne XML-Datei.
Aber wirklich einfacher macht es die Arbeit auch nicht. ;)
Zelle A1 bis A3 mit jeweils dem Wert 2, Zelle A4 mit der Summe aus Zelle A1 bis A3 --> macht mal eben locker 235 Zeilen XML-Code. :p
Ich würde daher auch eher eine CSV-Datei vorziehen.
Nicht nur weil eine CSV-Datei mit viel weniger "Code" auskommt, sondern auch weil sie ganz einfach aufgebaut ist.

Gruss Dr Dau
 
Beispiel für eine CSV:

PHP:
//Datei öffnen (Rechte festlegen)
$file = fopen('file.csv', 'w');

//Anlegen eines Arrays. Eine Zeile besteht aus allen Variablen des Arrays.
$array = array('name', 'telefonnummer', 'adresse', 'email');
fputcsv($file, $array);

//while-schleife für die Werte... wir gehen davon aus, dass bereits eine Mysql-Abfrage vorhanden ist
while($row = mysql_fetch_object($sqlQry))
{
   unset($array);
   $array = array($row->name, $row->tel, $row->adresse, $row->email);
   fputcsv($file, $array);
}

fclose($file);

Das wär eigentlich schon alles...
Wichtig wäre vielleicht, bei der Funktion fputcsv einen weiteren Parameter anzugeben
PHP:
fputcsv($file, $array, ';');
Damit kann man festlegen, dass das Trennungszeichen ein Semikolon (Strichpunkt) ist.

Du könntest theoretisch auch alles selber in eine CSV-File schreiben, ist aber wesentlich aufwendiger... dafür gibts ja extra die schönen Funktionen. :)
 

Neue Beiträge

Zurück