使用PHPExcel,我尝试使用以下代码从Excel文件中获取数据并将其保存在MySql数据库中:

$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
$i=0;

$arr =array("","","","","","","");

for ($row = 1; $row <= $highestRow; $row++)
{
 //  Read a row of data into an array
 $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
 foreach($rowData[0] as $k=>$v)
 {
    if(PHPExcel_Shared_Date::isDateTime($v))
    {
        $arr[$i] = date('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($InvDate));
    }
    else
        $arr[$i] = $v;
    $i++;
}


此代码给出以下错误:


  可捕获的致命错误:传递给PHPExcel_Shared_Date :: isDateTime()的参数1必须是PHPExcel_Cell的实例,两次给出,在......中调用


当我按如下方式阅读列时:

foreach($rowData[0] as $k=>$v)
{
    $arr[$i] = $v;
    $i++;
}


即使我在Excel中将“单元格格式设置”设置为日期,日期列也将作为普通文本读取。总之,我的excel文件的每个记录中都有3个日期列,这些列可能具有日期,也可能是空白。

Excel的日期列的日期格式为:d-m-Y。我希望将其以以下格式获取:“ Y-m-d”(如果可能),否则我将不得不爆炸并手动将其转换。该日期将最终存储到mysql的Date type列中。

我也在stackoverflow上阅读了几篇文章,但无法获得理想的解决方案。

最佳答案

$v只是一个数字值,MS Excel使用的序列化时间戳记值,与任何其他浮点值都没有区别;无法访问单元格的格式掩码,就无法判断$v是否代表日期,这就是为什么isDateTime()方法需要读取单元格本身以确定其是否包含日期或日期的原因。不。

确保将数组作为关联数组返回(通过将方法的其他最后一个参数设置为true),该数组将为您提供每个单元格的地址:

$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE, TRUE);


这将返回按行地址索引的数组,以及按列地址嵌套的数组,因此您的foreach将需要反映行号:

foreach($rowData[$row] as $k=>$v)


$ k将成为列地址。

然后,您可以使用$ row和$ k获取单元格,并将其传递给isDateTime()调用:

if(PHPExcel_Shared_Date::isDateTime($sheet->getCell($k . $row)))




并注意

$arr[$i] = date('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($InvDate));


应该

$arr[$i] = date('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($v));


在你的代码中

09-17 21:00
查看更多