使用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));
在你的代码中