php-script:mysql export naar Excel haalt cellen door elkaar.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een php-script die een export van mysql naar excel moet kunnen maken.
Dit werkt ook prima als ik als query "select * from relaties" gebruik.
Maar zodra ik in de query aangeef welke velden ik wil zien, dan lopen de cellen in Excel na een aantal regels dwars door elkaar.
Ik heb de data al nagekeken en zie daar geen vreemde tekens of dergelijke.

Waarom werkt het scheiden van velden wel als ik alles wil zien, maar niet meer als ik maar een aantal velden wil zien?
Hopelijk weet iemand een oplossing???

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$sql=  "SELECT bedrijfsnaam,titel,afdeling,naam,aanhef,voornaam,postadres,postcode,
        woonplaats,tel_alg,cb,bm,gb,ph,hf,bdl,div_kwza,vrijw_kwza,zorgafnemer,
        div_sja,tel_doork,mobiel,fax,email,kerstkaart,relatie_van,bezoekadres
        FROM relaties";
$export = mysql_query($sql, $conn) or die (mysql_error());
$fields = mysql_num_fields($export);
for($i=0; $i<$fields; $i++){
   $header .= mysql_field_name($export, $i)."\t";
}
$row=mysql_fetch_array($export);
do{
        $line='';
        for($i=0; $i<$fields; $i++){
                if((!isset($row[$i])) OR ($row[$i] =="")){
                        $value = "\t";
                }else{
                        $value = str_replace('"','""', $row[$i]);
                        $value = '"'.$value.'"'."\t";
                }
        $line .=$value;
}
$data .= trim($line)."\n";
}while($row=mysql_fetch_array($export));
$data = str_replace("\r","",$data);
if($data==""){
   $data = "\n(0) Relaties gevonden!\n";
}
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=relaties.xls");
header("Pragma: no-cache");
header("Expires: 0");

print $header."\n".$data;
mysql_close();

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Probeer te achterhalen wat de eerste plek is waar het mis gaat. In dat veld kun je waarschijnlijk wel zien welk teken de problemen veroorzaakt. Mijn vermoeden is dat er een newline in een veld staat en dat Excel dit gewoon als een records scheidings teken ziet, ondanks de quotes.

[ Voor 17% gewijzigd door Janoz op 09-12-2005 13:28 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor je reactie, maar dan zal het toch niks aanmaken welke query ik gebruik?
Dat is het vreemde juist. Als ik alles wil zien gaat het goed, maar als ik maar een aantal velden wil zien dan gaat het fout. En ik heb inderdaad het eerste record gezocht en gekeken, maar er zit geen enkel vreemd teken in buiten een @, maar die komt in elke record voor.

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Nog wat anders, wat je nu uitstuurt heeft niets met het excel bestandsformaat te maken. Dat Excel er nu zelf nog wat van maakt omdat het ook overweg kan met tab- / komma- / randomchar- seperated files biedt je geen enkele garantie voor de toekomst. Voor het zelfde geld stapt je gebruiker volgend jaar over op een ander office-pakket met perfecte support voor het xls formaat, maar zonder de optie om bogus-excelsheets te interpreteren.

Een betere optie lijkt me om in deze implementatie de tabs te vervangen door komma's zodat je een CSV creëert. Deze worden door elk spreadsheetprogramma gelezen, als excel je default spreadsheet is dus door excel. In CSV mogen newlines sowieso in een door quotes omvat veld.

Geheel terzijde nog wat over het correcte mime-type voor een .xls. Dit is namelijk niet "application/octet-stream" maar "application/vnd.ms-excel".

Edit:
Over de fout, trim() stript whitespace characters, dus ook tabs. Als je lege velden aan het begin van een regel hebt wordt dus de kolomvolgorde verziekt door de trim($line) op regel 22.

[ Voor 11% gewijzigd door T-MOB op 09-12-2005 14:51 ]

Regeren is vooruitschuiven