2017-08-05 1 views
1

Je veux convertir un fichier XLS en CSV, tout va bien, sauf pour 1 colonne.La conversion PHPExcel de XLS en CSV détruit des données

Duration (min., sec.) 
2:24 
4:20 
4:20 
4:20 
3:54 

est délivrée comme:

Duration(min., sec.) 
0.1 
0.180555556 
0.180555556 
0.180555556 
0.1625 

est la fonction ici qui fait la conversion:

function convertXLStoCSV($infile, $outfile) // the function that converts the file 
{ 
    $fileType = PHPExcel_IOFactory::identify($infile); 
    $objReader = PHPExcel_IOFactory::createReader($fileType); 
    $objReader->setReadDataOnly(true); 
    $objPHPExcel = $objReader->load($infile); 

    $writer = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV'); 
    $writer->setDelimiter(","); 
    //$writer->setEnclosure(""); 
    //$writer->save("test123.csv"); 
    foreach ($objPHPExcel->getWorksheetIterator() as $workSheetIndex => $worksheet) { 
     $objPHPExcel->setActiveSheetIndex($workSheetIndex); 
     $writer->setSheetIndex($workSheetIndex); 
     $writer->save('converted/' . $outfile ."_" . $worksheet->getTitle() . ".csv"); 
} 

Qu'est-ce que je fais mal et comment puis-je obtenir la sortie désirée? Merci d'avance.

Répondre

2

Parce que vous configurez

$objReader->setReadDataOnly(true); 

vous teling PHPExcel pas lire l'une des informations de mise en forme du fichier xls

Cela inclut le masque de format numérique qui est la seule chose qui différencie un nombre à virgule flottante à partir d'une valeur date/heure dans les fichiers MS Excel. Si vous chargez également les informations de formatage, PHPExcel peut reconnaître qu'une valeur de cellule est supposée être une date et la formater en conséquence, sinon elle ne peut l'afficher qu'en tant que nombre à virgule flottante.

Donc, ne pas dire PHPExcel de charger des données seulement, laissez charger les informations de format et

+0

Cela l'a réparé, merci beaucoup! J'ai ajouté cette ligne en pensant que cela empêcherait le programme de lire des lignes vides. – Adrianb

2

La sortie n'est pas 'erronée' c'est simplement stocker le numéro dans un format différent. Ce qu'il fait se multiplie en minutes par 60 et en ajoutant le nombre de secondes puis en divisant par 1440 (24 heures * 60 minutes). Donc, c'est une fraction de journée, plutôt que le nombre de secondes, qui est souvent le format. Pour convertir la décimale en temps désiré, multipliez par 1440 puis, faites une division entière par 60 pour obtenir le nombre de minutes et mod 60 pour obtenir le nombre de secondes.

+0

Merci pour votre temps, la réponse de Mark Baker a fait l'affaire pour moi. Mais je me souviendrai de votre solution aussi juste comme un problème logique. – Adrianb