2017-08-05 60 views
1

我想将XLS文件转换为CSV,除1列外,一切正常。PHPExcel从XLS转换为CSV破坏数据

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

输出为:

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

这里是一个执行转换功能:

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"); 
} 

我在做什么错了,我怎样才能得到所需的输出?先谢谢你。

回答

2

因为你设置

$objReader->setReadDataOnly(true); 

你特灵PHPExcel不会从xls文件

这包括数字格式掩码是唯一区别于读取任何的格式化信息MS Excel文件中日期/时间值的浮点数。

如果您也加载格式化信息,PHPExcel可以识别单元格值应该是日期,并相应地设置格式,否则它只能将其显示为浮点数。

所以,不要告诉PHPExcel只加载数据,让它加载格式信息以及

+0

修复它,非常感谢!我添加了这一行,认为它会阻止程序读取空行。 – Adrianb

2

输出不是'错误',它只是以不同的格式存储数字。

它在做什么是乘以60分钟,然后加上秒数,然后除以1440(24小时* 60分钟)。所以它只是一天的一小部分,而不是秒数,这通常是格式。

若要将十进制转换回所需的时间,乘以1440,然后执行整数除以60得到分钟数,并使用mod 60得到秒数。

+0

感谢您的时间,马克·贝克的答案的伎俩我。但我会记住你的解决方案也是一个逻辑问题。 – Adrianb