【问题标题】:PHPExcel toArray is changing date and time columns from XLSX formatPHPExcel toArray 正在从 XLSX 格式更改日期和时间列
【发布时间】:2017-09-10 16:04:58
【问题描述】:

我正在使用此处找到的 excelToArray 函数:https://gist.github.com/calvinchoy/5821235

function excelToArray($filePath, $header = true) {
    require_once("./PHPExcel/Classes/PHPExcel.php"));
    //Create excel reader after determining the file type
    $inputFileName = $filePath;
    /**  Identify the type of $inputFileName  **/
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
    /**  Create a new Reader of the type that has been identified  **/
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
    /** Set read type to read cell data onl **/
    $objReader->setReadDataOnly(true);
    /**  Load $inputFileName to a PHPExcel Object  **/
    $objPHPExcel = $objReader->load($inputFileName);
    //Get worksheet and built array with first row as header
    $objWorksheet = $objPHPExcel->getActiveSheet();
    //excel with first row header, use header as key
    if($header){
        $highestRow = $objWorksheet->getHighestRow();
        $highestColumn = $objWorksheet->getHighestColumn();
        $headingsArray = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',null, true, true, true);
        $headingsArray = $headingsArray[1];
        $r = -1;
        $namedDataArray = array();
        for ($row = 2; $row <= $highestRow; ++$row) {
            $dataRow = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,null, true, true, true);
            if ((isset($dataRow[$row]['A'])) && ($dataRow[$row]['A'] > '')) {
                ++$r;
                foreach($headingsArray as $columnKey => $columnHeading) {
                    $namedDataArray[$r][$columnHeading] = $dataRow[$row][$columnKey];
                }
            }
        }
    }
    else{
        //excel sheet with no header
        $namedDataArray = $objWorksheet->toArray(null,true,true,true);
    }
    return $namedDataArray;
}

我有两个版本的电子表格,一个是 CSV,一个是 Excel。他们在这里:

CSV:https://drive.google.com/open?id=0B2GilRTNrTzKd3V3aEVET1NqSW8

XLSX:https://drive.google.com/open?id=0B2GilRTNrTzKdzJNZnh0cmhpa1E

当我使用此功能上传 CSVvar_dump 时,我得到的结果

array (size=58)
  0 => 
    array (size=4)
      'PD' => string '11/10/2016' (length=10)
      'Pt' => string '9:12' (length=4)
      'fd' => string '11/10/2017' (length=10)
      'ft' => string '9:12' (length=4)
  1 => 
    array (size=4)...

但是当我上传 XLSX 我得到:

array (size=58)
  0 => 
    array (size=5)
      'PD' => float 42684
      'Pt' => float 0.38333333333333
      'fd' => float 43049
      'ft' => float 0.38333333333333
      '' => null
  1 => 
    array (size=5)

请注意,PD 从 11/10/2016 变为 42684,Pt 从 9:12 变为 0.38333...

什么原因导致 XLSX 文件在显示时无法被读取?

我已经有read other stack questions,但是I appear to be passing toArray the correct values。不知道我错过了什么......

【问题讨论】:

    标签: php excel csv phpexcel


    【解决方案1】:

    MS Excel 将日期存储为序列化时间戳,即自 1900 年 1 月 1 日(或 1904 年 1 月 1 日,取决于它使用的是 Windows 日历还是 Mac 日历)以来的天数。 PHPExcel 也是如此,因此所有日期/时间都被加载并以 MS Excel 处理它们的方式存储在电子表格对象中。

    因此,当您加载具有人工格式日期的文件时,它会将其读取为 MS Excel 序列化时间戳。通常,它还会存储数字格式掩码,告诉 PHPExcel 此单元格包含应格式化为日期的时间戳值,但您是在告诉 PHPExcel 的加载器不要使用 $objReader-&gt;setReadDataOnly(true); 执行此附加操作,这意味着仅存储数据,而不是格式信息。 因为 PHPExcel 没有这些额外的格式信息,它无法知道单元格包含应该显示为日期的内容,所以它只能显示序列化的 tiemstamp,这实际上只是一个浮点数。

    换句话说,如果您希望日期被视为日期,或者除非您想自己处理所有日期,请不要使用$objReader-&gt;setReadDataOnly(true);

    【讨论】:

    • 谢谢,这有帮助,但现在我看到电话号码(在我给出的电子表格中只是大整数(例如:2345556789))前面带有[&lt;=9999999]其中。例如:[&lt;=9999999]1393153-7665。任何线索是什么原因造成的?如果您认为最好,很高兴将其创建为一个新问题;我在搜索中找不到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多