0

使用 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的日期列有日期格式:dmY。如果可能,我希望它以以下格式获取:'Ymd',否则我将不得不将其分解并手动转换。日期最终将存储到 mysql 日期类型列中。

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

4

1 回答 1

1

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

在你的代码中

于 2016-12-23T01:06:46.330 回答