PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Excelexport mit array


Riegelhaus
05.02.2010, 09:53:44
Hi

Ein Excelexport mit einem select geht bestens. Nun habe ich die Daten jedoch in einem array. Ich kann das array ausgeben im Browser mit var_dump(), aber ich bringe es nicht in ein Excel. Versuchte das nachfolgende Script anzupassen, doch es klappt nicht.

Danke für die Hilfe




// auszug aus dem Script

$export = mysql_query($select,$link);
$fields = mysql_num_fields($export);
for ($i = 0; $i < $fields; $i++)
{
$header .= mysql_field_name($export, $i) . "\t";
}
while($row = mysql_fetch_row($export)) {
$line = '';
foreach($row as $value)
{



So sieht der Array aus, diesen sollte ich in ein Excel bringen

array(344)
{ [0]=> array(1)
{ [1]=> array(1)
{ ["name"]=> string(39) " Allgemeine " }
}
[1]=> array(1)
{ [1]=> array(1)
{ ["Wohnungen"]=> string(2) "34" }
}
[2]=> array(1)
{ [1]=> array(1)
{ ["Vertrag"]=> string(2) "34" }
}
[3]=> array(1)
{ [1]=> array(1)
{ ["mieter"]=> string(8) "36" }
}
[4]=> array(1)
{ [1]=> array(1)
{ ["brutto"]=> string(8) "364.00" }
}
[5]=> array(1)
{ [1]=> array(1)
{ ["netto"]=> string(8) "294.50" }
}
[6]=> array(1)
{ [2]=> array(1)
{ ["name"]=> string(24) "Verein" }
}
[7]=> array(1)
{ [2]=> array(1)
{ ["Wohnungen"]=> string(1) "1" }
}
[8]=> array(1)
{ [2]=> array(1)
{ ["Vertrag"]=> string(1) "1" }
}
[9]=> array(1)
{ [2]=> array(1)
{ ["Mieter"]=> string(1) "3" }
}
[10]=> array(1)
{ [2]=> array(1)
{ ["netto"]=> string(7) "120.00" }
}
[11]=> array(1)
{ [2]=> array(1)
{ ["brutto"]=> string(7) "153.00" }
}
}

Riegelhaus
05.02.2010, 11:10:04
Mit foreach kann ich die arrays splitten, doch ich bringe die Daten immer noch nicht ins Excel.

foreach($excelexport as $vert)
{

var_dump($vert);echo"<br>

";
}



array(1) { [1]=> array(1) { ["eig_name"]=> string(39) "Allgemeine" } }
array(1) { [1]=> array(1) { ["Wohnungen"]=> string(2) "34" } }
array(1) { [1]=> array(1) { ["Vertrag"]=> string(2) "34" } }
array(1) { [1]=> array(1) { ["Mieter"]=> string(2) "90" } }
array(1) { [1]=> array(1) { ["wohnung_bruttot"]=> string(8) "3684.00" } }
array(1) { [1]=> array(1) { ["wohnung_nettot"]=> string(8) "2284.50" } }
array(1) { [1]=> array(1) { ["miete_brutto"]=> string(8) "4382.00" } }
array(1) { [1]=> array(1) { ["miete_netto"]=> string(8) "3568.50" } }
array(1) { [2]=> array(1) { ["eig_name"]=> string(24) "AG" } }
array(1) { [2]=> array(1) { ["Wohnungen"]=> string(1) "1" } }
array(1) { [2]=> array(1) { ["Vertrag"]=> string(1) "1" } }
array(1) { [2]=> array(1) { ["Mieter"]=> string(1) "3" } }
array(1) { [2]=> array(1) { ["wohnung_bruttot"]=> string(7) "1350.00" } }
array(1) { [2]=> array(1) { ["wohnung_nettot"]=> string(7) "1250.00" } }
array(1) { [2]=> array(1) { ["miete_brutto"]=> string(7) "1573.00" } }
array(1) { [2]=> array(1) { ["miete_netto"]=> string(7) "1490.00" } }
array(1) { [3]=> array(1) { ["eig_name"]=> string(14) "verein" } }
array(1) { [3]=> array(1) { ["Wohnungen"]=> string(1) "2" } }
array(1) { [3]=> array(1) { ["Vertrag"]=> string(1) "2" } }
array(1) { [3]=> array(1) { ["Mieter"]=> string(1) "4" } }
array(1) { [3]=> array(1) { ["wohnung_bruttot"]=> string(7) "1520.00" } }
array(1) { [3]=> array(1) { ["wohnung_nettot"]=> string(7) "1150.00" } }
array(1) { [3]=> array(1) { ["miete_brutto"]=> string(7) "1920.00" } }
array(1) { [3]=> array(1) { ["miete_netto"]=> string(7) "1572.00" } }

vt1816
05.02.2010, 11:31:15
Sorry aber wo ist denn da der Export nach Excel in Deinem Skript?

Riegelhaus
05.02.2010, 11:55:56
Wie bringe ich den Inhalt in das Excel? Im array $excelexport is der Inhalt dind. Die einzelnen Felder sind mit einer fortlaufendne Zahl zusammengefasst zu einer Zeile 8siehe veroheriger Eintrag


<?php

//var_dump($excelexport); hier kommten die Array

/* foreach($excelexport as $vert)
{

var_dump($vert);echo"<br>"; auch heir kommen die Array
}
*/


// hier ist meiner Meinung nach der Fehler drin.
foreach($excelexport as $row)
{

$line = '';
foreach($row as $value)
{
if ((!isset($value)) OR ($value == "")) {
$value = "\t";
} else {
if($value >'100000' and $value <'9000000000')
{
$value = str_replace('"', '""', date ("d.m.Y",$value));
}
$value = str_replace('"', '""', $value);
$value = '"' . $value . '"' . "\t";

}
$line .= $value;
}
$data .= trim($line)."\n";
}
$data = str_replace("\r","",$data);

if ($data == "") {
$data = "\n(0) Records Found!\n";
}
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=Kontrolle.xls");
header("Pragma: no-cache");
header("Expires: 0");
print "$header\n$data";
?>

Riegelhaus
05.02.2010, 13:24:38
Statt die Daten in ein Array habe ich sie in eine Session geschrieben, doch auch das geht nicht
<?php

$zaehler=0;
$query = "SELECT COUNT(DISTINCT wohnung.wohnung_id) as Wohnungen, eigentuemer.eig_id, eig_name
FROM ...........";
$result = mysql_query($query,$link);
$num = mysql_num_rows($result);

for ($i = 0; $i < $num; $i++)
{
$row = mysql_fetch_array($result);
$zaehler=$zaehler+1;
$_SESSION[export][$zaehler][eig_name] = $row[eig_name];
$_SESSION[export][$zaehler][Wohnungen] = $row[Wohnungen];

$eig_id=$row[eig_id];
$query2 = "SELECT
COUNT(DISTINCT vertrag.vertrag_id) as Vertrag,
COUNT(DISTINCT vertrageinzeln.id_vertrageinzeln) as Mieter
FROM ..............";
$result2 = mysql_query($query2,$link);
$row2 = mysql_fetch_array($result2);
$_SESSION[export][$zaehler][Vertrag] = $row2[Vertrag];
$_SESSION[export][$zaehler][Mieter] = $row2[Mieter];

$query3 = "SELECT
SUM(wohnung_brutto) as wohnung_bruttot,
SUM(wohnung_netto)as wohnung_nettot
FROM ............";
$result3 = mysql_query($query3,$link);
$num3 = mysql_num_rows($result3);
$row3 = mysql_fetch_array($result3);
$_SESSION[export][$zaehler][wohnung_bruttot] = $row3[wohnung_bruttot];
$_SESSION[export][$zaehler][wohnung_nettot] = $row3[wohnung_nettot];

$query4 = "SELECT
SUM(miete_netto) as miete_netto,
SUM(miete_brutto)as miete_brutto
FROM ............";
$result4 = mysql_query($query4,$link);
$row4 = mysql_fetch_array($result4);
$_SESSION[export][$zaehler][miete_brutto] = $row4[miete_brutto];
$_SESSION[export][$zaehler][miete_netto] = $row4[miete_netto];
}


$export = $_SESSION[export];
var_dump($export);
//$fields = mysql_num_fields($export);

/* for ($i = 0; $i < $fields; $i++)
{
$header .= mysql_field_name($export, $i) . "\t";
}
*/

while($row = mysql_fetch_row($export))
{

$line = '';
foreach($row as $value)
{


if ((!isset($value)) OR ($value == "")) {
$value = "\t";
} else {


if($value >'100000' and $value <'9000000000')
{
$value = str_replace('"', '""', date ("d.m.Y",$value));
}


$value = str_replace('"', '""', $value);
$value = '"' . $value . '"' . "\t";

}
$line .= $value;
}
$data .= trim($line)."\n";
}
$data = str_replace("\r","",$data);

if ($data == "") {
$data = "\n(0) Records Found!\n";
}

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=Kontrolle.xls");
header("Pragma: no-cache");
header("Expires: 0");
print "$header\n$data";
?>

urvater
05.02.2010, 16:37:17
Ob man mit PHP eine korrekt formatierte Exel-Datei erzeugen kann ist mit nicht bekannt. Allerdings kann man wunderbar *.tsv(Tab seperiert) bzw. *.csv(komma seperiert) Dateien erstellen. Diese kann man wiederrum sehr gut mit Tabellenkalkulationesprogrammen wie sie in Officeprogrammen meistens enthalten sind öffnen.
Ich hab dein Beispiel mal nachgestellt. Bei mir funktioniert es. Finde den Unterschied und überlege warum dein Beispiel so nicht funktionieren kann.

/*Erst einmal ein Array wie du es meiner Meinung nach beim Auslesen der Daten aus der DB erzeugst*/
$excelexport = array(array("eig_name" => "Allgemeine","Wohnungen" => "34","Vertrag" => "34","Mieter" => "90","wohnung_bruttot" => "3684.00","wohnung_nettot" => "2284.50","miete_brutto" => "4382.00","miete_netto" => "3568.50"), array("eig_name" => "AG","Wohnungen" => "1","Vertrag" => "1","Mieter" => "3","wohnung_bruttot" => "1350.00","wohnung_nettot" => "1250.00","miete_brutto" => "1573.00","miete_netto" => "1490.00"),array("eig_name" => "verein","Wohnungen" => "2","Vertrag" => "2","Mieter" => "4","wohnung_bruttot" => "1520.00","wohnung_nettot" => "1150.00","miete_brutto" => "1920.00","miete_netto" => "1572.00"));

/*hier habe ich am Ende eine Kleinigkeit geändert, da die erzeugte Datei sonst keine Zeilenumbrüche nach dem Download hat.*/
foreach($excelexport as $row)
{

$line = '';
foreach($row as $value)
{
if ((!isset($value)) OR ($value == "")) {
$value = "\t";
} else {
if($value >'100000' and $value <'9000000000')
{
$value = str_replace('"', '""', date ("d.m.Y",$value));
}
$value = str_replace('"', '""', $value);
$value = '"' . $value . '"' . "\t";

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

if ($data == "") {
$data = "\n(0) Records Found!\n";
}
$f=file_put_contents('Kontrolle.tsv', $data);
header('Content-type: application/tsv');
header('Content-Disposition: attachment; filename="Kontrolle.tsv"');
header("Pragma: no-cache");
header("Expires: 0");
readfile('Kontrolle.tsv');
Hättest du dir das Beispiel auf php.net genauer angesehen würde dir auch der Unterschied klar sein und wieso dein Beispiel nicht funktioniert.

Ckaos
05.02.2010, 20:56:31
Hi

Ob man mit PHP eine korrekt formatierte Exel-Datei erzeugen kann ist mit nicht bekannt.
Ich kenn nur http://pear.php.net/package/Spreadsheet_Excel_Writer
aber kann MS Office nicht neuerdings Xml? ;)

Aber @TE phpmyadmin kann auch Excel Dokumente erstellen schau dir das mal an
Ansonsten kann ich Urvater nur beipflichten wähle .tsv oder .csv beide werden von
Excel verarbeitet.

mfg

Ckaos

Riegelhaus
07.02.2010, 12:48:51
Allen Danke, vor allem Urvater

Ich bekomme jetzt die Zahlen ins Excel, auch mit

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=Kontrolle.xls");
header("Pragma: no-cache");
header("Expires: 0");
print "$header\n$data";

Habe jedoch noch ein Problem mit den Dezimalstellen, schreibe dies aber in eine neue Frage

Riegelhaus
06.07.2010, 20:50:21
Guten Abend

Immer wieder diesen Excelexport, immer wieder neue Herausforderungen. Jetzt geht zwar alles, aber Excel 2007 will nicht.

Excel 2007 meint: Sie versuchen eine Datei zu öffnen, liste.xls, deren Format von dem in der Dateierweiterung angegebenen abweicht. Stellen Sie sicher.......

Und wenn diese Meldung mit "Ja" beantwortet wird, geht Excel wie gewünscht auf und die Daten sind drin.

Habe bereits die Endung von xls auf xlsx gewechelt, aber dann ging gar nichts.

Wer weiss wie ich den Header definieren muss, damit Excel 2007 zufrieden ist.






$export = mysql_query($select,$link);
$fields = mysql_num_fields($export);

for ($i = 0; $i < $fields; $i++)
{
$header .= mysql_field_name($export, $i) . "\t";
}
while($row = mysql_fetch_row($export)) {
$row[7] = str_replace('"', '""', date ("d.m.Y",$row[7]));
$row[8] = str_replace('"', '""', date ("d.m.Y",$row[8]));
$line = '';
foreach($row as $value)
{
if ((!isset($value)) OR ($value == "")) {
$value = "\t";
} else {
if($value=='19.01.2038'){
$value = "";
}
$value = str_replace('"', '""', $value);
$value = '"' . $value . '"' . "\t";
}
$line .= $value;
}
$data .= trim($line)."\n";
}
$data = str_replace("\r","",$data);

if ($data == "") {
$data = "\n(0) Records Found!\n";
}


header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=liste.xls");
header("Pragma: no-cache");
header("Expires: 0");
print "$header\n$data";