从 XLS 转换为 CSV 的 PHPExcel 会破坏数据

PHPExcel converting from XLS to CSV destroys data

我想将 XLS 文件转换为 CSV,除 1 列外一切正常。

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

我做错了什么,我怎样才能得到想要的输出?提前谢谢你。

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

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

要将小数转换回您想要的时间,请乘以 1440,然后用整数除以 60 得到分钟数,mod60 得到秒数。

因为你正在设置

$objReader->setReadDataOnly(true);

你告诉 PHPExcel 不要从 xls 文件中读取任何格式信息

这包括数字格式掩码,它是唯一区分浮点数和 MS Excel 文件中的 date/time 值的东西。

如果你也加载格式信息,那么PHPExcel可以识别单元格值应该是日期,并相应地格式化它,否则它只能显示为一个浮点数。

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