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

标签 php phpexcel

<分区>

我正在尝试使用 PhpExcel 库导入一个 excel 文件 对于所有其他字段,getValue() 函数都有效,但是当它遇到格式为 ms-excel2013 中设置的日期的字段时 exel 文件中的日期字段格式为 d-m-Y,如 16-11-2014 但是当我尝试导入它的值时 getValue() 返回 11-16-14 当传递给 strtotime 进一步 返回 false 进而导致 date('Y-m-d',strtotime($date)) 返回 1970-01-01

我搜索了整个网络和 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;
}

最佳答案

如果该字段确实包含 MS Excel 日期值,则对包含日期的字段的 getValue() 调用应返回类似 41959.00 的值....是,基于自 1900 年 1 月 1 日(或 1904 年 1 月 1 日,如果文件是使用 MS Excel 的 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;
                }
            }
        }
    }
}

除了返回格式化的数据值,您还可以要求 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;
}

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

关于PHPEXCEL 获取在 excel 文件中可见的格式化日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31603451/

相关文章:

PHPExcel,自动调整行高

PHP- fatal error : Call to a member function dbRows() on a non-object

php - Gearman addTaskBackground 完成回调不会触发

php - 简单的 PHP 表单 SQL 插入

php - 如何使用phpexcel在excel表中插入公式

PHPExcel 条形图使用 PHPExcel

php - 在数据库中有唯一的文本

javascript - 取消选中通过 POST[] 的 Echo 检查的复选框

php - 大圆距离问题

php - 避免在 phpexcel 中出现网格线