【问题标题】:PHPExcel date issue on file iteration文件迭代的PHPExcel日期问题
【发布时间】:2017-04-04 19:25:22
【问题描述】:

我使用 PHPExcel 将 xlsx 文件导入数据库,以下代码非常适合将 $val 作为单元格值传递并避免插入列标题:

        $dataArr = array();

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

            for ($row = 1; $row <= $highestRow; ++ $row) {
                for ($col = 0; $col < $highestColumnIndex; ++ $col) {
                    $cell = $worksheet->getCellByColumnAndRow($col, $row);
                    $val = $cell->getValue();
                    $dataArr[$row][$col] = $val;
                }
            }
        }

        unset($dataArr[1]);

问题是当我尝试插入日期值时,当前 Excel 单元格的日期格式是 10/03/17,但在我的数据库中插入了 0000-00-00。

我试过回复here 但不是运气。

这是我当前的代码:

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

                for ($row = 1; $row <= $highestRow; ++ $row) {
                    for ($col = 0; $col < $highestColumnIndex; ++ $col) {
                        $cell = $worksheet->getCellByColumnAndRow($col, $row);
                        $val = $cell->getValue();
                        if (PHPExcel_Shared_Date::isDateTime($val)) {
                         echo $cell->getFormattedValue() , EOL;
                        } 
                       else {
                            echo $cell->getValue() , EOL;
                        }
                        $dataArr[$row][$col] = $val;
                    }
                }
            }

但这导致我出现致命错误“未捕获的 TypeError:传递给 PHPExcel_Shared_Date::isDateTime() 的参数 1 必须是 PHPExcel_Cell 的实例,给定字符串”

有什么建议吗?

【问题讨论】:

标签: php mysql excel phpexcel


【解决方案1】:

如果单元格的日期格式掩码是10/03/17,那么这是对getFormattedValue() 的调用将返回的格式;这不是插入数据库的好格式。最好显式使用不同的格式掩码,甚至将值作为 DateTime 对象(或 unix 时间戳)检索,而不是格式化字符串。

然而,更关键的是

if (PHPExcel_Shared_Date::isDateTime($val)) {

您在哪里传递 MS Excel 时间戳值(一个简单的浮点数)以查看它是否是日期/时间。 PHPExcel 无法识别浮点数是否为日期;它需要能够读取单元格的数字格式掩码。您需要将单元格本身传递给isDateTime(),而不仅仅是值。

if (PHPExcel_Shared_Date::isDateTime($cell)) {

PHPExcel API Documentation所示;和错误信息一模一样

“未捕获的类型错误:传递给 PHPExcel_Shared_Date::isDateTime() 的参数 1 必须是 PHPExcel_Cell 的实例,给定字符串”

告诉你:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 2014-02-12
    • 2013-09-16
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多