<?php
// $f_no[40] is de uiteindelijk geexporteerde waarde die uit de database komt welke door een tekstveld in de webshop is ingevoerd
$f_no[40] = $this->sanitize($order_detail['value']);
?>
Dit gaat op zich goed en is de output aardig schoon
Echter....de klant wil graag ivm printen van deze tekst de <br />(zoals de function ook doet) eruit hebben maar wel de zichtbare enters in het betreffende .csv veld.
ik vond dit met google:
<?
function br2nl($string)
{
return preg_replace('/\<br(\s*)?\/?\>/i', "\n", $string);
}
?>
dit is het omgekeerde van de php functie nl2br(). het vervangt dus alle <br> en <br /> voor een \n (enter).
[size=xsmall]Toevoeging op 09/02/2013 11:58:20:[/size]
maar wacht ff..
die foto is toch gewoon html?
kijk eens in de bron van je pagina. daar staat waarschijnlijk geen <br> meer maar iets van <br>
dit komt door php htmlentities().
je zult de tekst dan eerst weer door html_entity_decode() moeten halen of je moet htmlentities() uit je code halen.
ja, maar nu laat je een excel sheet zien. de data heb je geïmporteerd uit het csv bestand.
Hiermee heb je twee dingen tegen je:
1. csv betekent comma seperated value ofwel door komma's gescheiden waarden. één regel bij dit bestandstype is dat iedere regel een record voorstelt en dat de waarden van de records in die regel door komma's gescheiden worden. Ga jij nu enters in een veld toevoegen dan zal dit betekenen dat je aan een nieuwe regel begint dus aan een nieuw record.
2. in Excel zijn er eigenlijk - voor zo ver ik weet - geen mogelijkheden om in een cel enters toe te passen. wel bestaat er iets als 'terugloop' waarbij de tekst doorloopt op een nieuwe regel binnen de cel als deze te breed is. Maar excel regelt dit zelf.
Dus je zou bij het aanmaken van een csv bestand zowel de <br>'s als de enters weg moeten laten en bij het maken van html dus zorgen dat je <br>'s krijgt zonder htmlentities
In beide gevallen krijg je deze output...Ik heb dit .csv bestand even opgelagen als .odf (open office bewerkbaar bestand) om de gevoelige info uit diverse kolommen te halen.
Maar als .csv zie je hetzelfde als in de screenshot.
Maar ben het met je eens frank, die enters gaan simpelweg niet werken.
En moet de opdrachtgever maar op een andere manier de data gaan verwerken.
Ben er na 9 uur ook wel aardig zat van om eerlijk te zijn.
@Koen,
Dat snap ik maar niet relevant.
De opdrachtgever wil gewoon een .csv bestand en beter gezegd, zo min mogelijk werk eraan te hebben.
Deze heeft niets aan een notepad bestand, hoe goed het er voor ons ook uit kan zien.
Ik wil jullie wel allemaal bedanken voor het meedenken, ondanks dat ik misschien niet helemaal duidelijk was/ben zo af en toe...
Nog wat speurwerk gedaan voor je Endy: een enter in een excel cel kan wel. je zult dan moeten zorgen dat de enters vervangen worden voor een karakter met ascii-code 10. ofwel hexadecimaal: '0A'
[size=xsmall]Toevoeging op 09/02/2013 13:06:00:[/size]
Endy, in excel kun je in een cel tekst typen en dan druk je op [Alt]+[Enter] en je krijgt dan een nieuwe regel binnen de cel. ik heb dit toen opgeslagen als csv en gekeken naar de ascii codes van dit bestand. tussen de woorden stond een linefeed, CHR(10). maar als je dit echter terug importeert in Excel dan ziet hij dit als een nieuw record zoals je al eerder aangaf. Misschien weet iemand hier nog een oplossing voor?
[size=xsmall]Toevoeging op 09/02/2013 13:07:40:[/size]
Update. Het moet toch kunnen er gaat nog iets mis.. nog ff zoeken hoor
[size=xsmall]Toevoeging op 09/02/2013 13:21:01:[/size]
Dit werkt:
voorwaarde is dat je met ; werkt als veld-scheiding en de velden waar een enter in kan voorkomen moeten tussen "" staan.
Verder moet dit script voldoende schrijfrechten hebben om het bestand te mogen wegschrijven. onder windows is dat geloof ik geen probleem
<?php
// csv record maken:
$record='1;"Hallo'.chr(10).'Dag";09-02-2013'."\n";
// output als tekstbestand
header("Content-Type:text/plain");
// laat de csv inhoud zien
echo $csv;
// maak een csv bestand met de naam test.csv
// er moeten wel voldoende rechten zijn om een bestand te mogen aanmaken
$handle = fopen('test.csv', 'w');
if($handle) {
fwrite($handle, $csv);
fclose($handle);
} else {
echo 'Het is niet mogelijk om een bestand weg te schrijven!';
}
?>
[size=xsmall]Toevoeging op 09/02/2013 13:27:31:[/size]
Er bestaat/bestaan trouwens ook php classen die naar het xls formaat kunnen exporteren. Ik weet dat ze er zijn maar heb er geen ervaring mee. met google vond ik deze site:
Op dit moment wordt deze function gebruikt om de file te creeeren...:
<?php
private function create_file($file_type){
$file_content = "";
// bestand pad naar een bestand met x lijnen hebben
foreach($this->file as $line){
$count_field = 0;
$last_field = count($line);
foreach($line as $key=>$field){
$count_field ++;
if($this->format=='csv'){ // Het dwingt de conversie naar het leesbaar maken met Excel
$field = substr(chr(255).chr(254).mb_convert_encoding($field, "UTF-16LE", "UTF-8"),2);
}
if($count_field==$last_field){
$file_content.=$field."\r\n";
}else{
$file_content.=$field.$this->separator;
}
}
$f = fopen(dirname(__FILE__).'/downloads/'.$file_type.'.'.$this->format,'w+');
fwrite($f,$file_content);
fclose($f);
if(!$f){
$this->_html = '<div class="alert error">'.$this->l('Fout bij het ??maken van bestand. Controleer of de directory "/ modules / customexporter / downloads /" is in CHMOD 777').'</div>';
}
}
}
?>
Het probleem zit in het importeren van de csv in Excel, daar wordt niet goed omgegaan met de linefeeds ook al staan ze tussen "".
Een optie is om meteen Excel bestand te schrijven, Met PHPExcel kan dat.
Een andere optie is het exporteren met de <br> erin en dan in Excel een macro schrijven die ze omzet in linefeeds.