PHPEXCEL获取格式化日期,在excel文件中可见

Ash*_*kla 5 php phpexcel

我正在尝试使用PhpExcel lib为该getValue()函数的所有其他字段导入excel文件但是当遇到ms-excel2013中设置的格式日期的字段时,exel文件中的日期字段格式为dmY,16-11-2014 但是当我尝试导入时它的值是getValue()返回的11-16-14结果,strtotime进而进一步returns false导致date('Y-m-d',strtotime($date))返回1970-01-01.

我搜索了整个web和stackoverflow但没有解决方案解决了我的问题.在excel文件中,我将日期视为16-11-2014并希望按原样导入.

这是代码

protected function importExcel($filePath) {
    $excelData = array();
    if ($filePath) {
        $objPHPExcel = PHPExcel_IOFactory::load($filePath);
        $objPHPExcel->setReadDataOnly(true);
        foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
            $worksheetTitle = $worksheet->getTitle();
            $highestRow = $worksheet->getHighestRow(); // e.g. 10
            $highestColumn = $worksheet->getHighestColumn(); // e.g 'F'
            $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
            $nrColumns = ord($highestColumn) - 64;
            $data = array();
            for ($row = 1; $row <= $highestRow; ++$row) {
                $values = array();
                for ($col = 0; $col < $highestColumnIndex; ++$col) {
                    $cell = $worksheet->getCellByColumnAndRow($col, $row);
                    if (PHPExcel_Shared_Date::isDateTime($cell))
                        throw new Exception("is date time"); // just a check
                    $val = $cell->getValue();
                    if (isset($val) && $val)
                        $data[$row][$col] = $val;
                }
            }
            $excelData[$worksheetTitle] = $data;
        }
        return $excelData;
    }
    return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ker 8

getValue()对包含日期的字段的调用应该返回一个值41959.00如果该字段确实包含MS Excel日期值....即,基于自1900年1月1日(或1日)以来的天数的MS Excel序列化日期时间戳1904年1月如果文件是使用Mac版的MS Excel创建的)

要获取格式化的日期字符串,您需要调用 getFormattedValue() ; 然后,PHPExcel使用该单元格的数字格式掩码根据该掩码格式化日期.

要识别单元格是否包含MS序列化日期时间戳,您可以先使用调用PHPExcel_Shared_Date::isDateTime().

foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
    echo 'Worksheet - ' , $worksheet->getTitle() , EOL;

    foreach ($worksheet->getRowIterator() as $row) {
        echo '    Row number - ' , $row->getRowIndex() , EOL;

        $cellIterator = $row->getCellIterator();
        $cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
        foreach ($cellIterator as $cell) {
            if (!is_null($cell)) {
                echo '        Cell - ' , $cell->getCoordinate() , ' - ';
                if (PHPExcel_Shared_Date::isDateTime($cell)) {
                    echo $cell->getFormattedValue() , EOL;
                } else {
                    echo $cell->getValue() , EOL;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以要求PHPExcel将日期作为Unix时间戳返回,或者作为PHP DateTime对象返回,而不是返回格式化的数据值; 然后你可以使用PHP的内置日期函数或DateTime方法格式化它.

if (PHPExcel_Shared_Date::isDateTime($cell)) {
    $unixTimeStamp = PHPExcel_Shared_Date::ExcelToPHP($cell->getValue());
    echo date('d-M-Y H:i:s', $unixTimeStamp), PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

要么

if (PHPExcel_Shared_Date::isDateTime($cell)) {
    $dateTimeObject = PHPExcel_Shared_Date::ExcelToPHPObject($cell->getValue());
    echo $dateTimeObject->format('d-M-Y H:i:s'), PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)


Ash*_*kla 1

我已经找到了解决方案:

文件PHPExcel/Style/NumberFormat.php中的方法_formatAsDate

NumberFormat.php 中的 _formatAsDate 方法

如果日期类似于16/11/2014,则传递给时strtotime将导致false日期的格式应该m/d/Ystrtotime。因此,如果您将格式更改为m/d/Yif it'sd/m/Y那么解决方案将始终是正确的。

早些时候:

  1. 2014年11月16日==1970-01-01(行:1)
  2. 2014年11月16日==1970-01-01(行:2)
  3. 2014 年 12 月 23 日==1970-01-01(行:3)。

现在:

  1. 2014年11月16日==2014-11-16(行:1)
  2. 2014年11月16日==2014-11-16(行:2)
  3. 2014年12月23日==2014-12-23(行:3)

代码仍然相同,导入文件也很简单:

protected function importExcel($filePath) {
    $excelData = array();
    if ($filePath) {
        $objPHPExcel = PHPExcel_IOFactory::load($filePath);
        foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
            $worksheetTitle = $worksheet->getTitle();
            $highestRow = $worksheet->getHighestRow(); // e.g. 10
            $highestColumn = $worksheet->getHighestColumn(); // e.g 'F'
            $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
            $nrColumns = ord($highestColumn) - 64;
            $data = array();
            for ($row = 1; $row <= $highestRow; ++$row) {
                $values = array();
                for ($col = 0; $col < $highestColumnIndex; ++$col) {
                    $cell = $worksheet->getCellByColumnAndRow($col, $row);
                    $val = $cell->getValue();
                    if (isset($val) && $val)
                        $data[$row][$col] = $val;
                }
            }
            $excelData[$worksheetTitle] = $data;
        }
        return $excelData;
    }
    return FALSE;
}
Run Code Online (Sandbox Code Playgroud)