PHPExcel 库获取日期
PHPExcel library get date
使用 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++;
}
此代码给出以下错误:
Catchable fatal error: Argument 1 passed to PHPExcel_Shared_Date::isDateTime() must be an instance of PHPExcel_Cell, double given, called in ............
当我阅读专栏如下:
foreach($rowData[0] as $k=>$v)
{
$arr[$i] = $v;
$i++;
}
即使我在 excel 中将单元格格式设置为日期,日期列仍被读取为普通文本。总之,我的 excel 文件的每个记录中都有 3 个日期列,这些列可能有日期或为空白。
excel 的日期列的日期格式为:d-m-Y。我希望它以格式获取:'Y-m-d' 如果可能的话,我将不得不分解它并手动转换它。日期最终将存储到 mysql 日期类型列中。
我也在Whosebug上看了好几篇文章,都没有找到完美的解决方案。
$v
只是一个数值,MS Excel使用的序列化时间戳值,与其他任何浮点值没有区别;如果无法访问单元格的格式掩码,则无法判断 $v
是否代表日期,这就是为什么 isDateTime()
方法需要读取单元格本身以确定它是否是否包含日期。
确保您的数组被 return 编辑为关联数组(通过将方法的附加最后一个参数设置为 true
),这会为您提供每个单元格的地址:
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE, TRUE);
这将 return 一个按行地址索引的数组,作为按列地址的嵌套数组,因此您的 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));
在您的代码中
使用 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++;
}
此代码给出以下错误:
Catchable fatal error: Argument 1 passed to PHPExcel_Shared_Date::isDateTime() must be an instance of PHPExcel_Cell, double given, called in ............
当我阅读专栏如下:
foreach($rowData[0] as $k=>$v)
{
$arr[$i] = $v;
$i++;
}
即使我在 excel 中将单元格格式设置为日期,日期列仍被读取为普通文本。总之,我的 excel 文件的每个记录中都有 3 个日期列,这些列可能有日期或为空白。
excel 的日期列的日期格式为:d-m-Y。我希望它以格式获取:'Y-m-d' 如果可能的话,我将不得不分解它并手动转换它。日期最终将存储到 mysql 日期类型列中。
我也在Whosebug上看了好几篇文章,都没有找到完美的解决方案。
$v
只是一个数值,MS Excel使用的序列化时间戳值,与其他任何浮点值没有区别;如果无法访问单元格的格式掩码,则无法判断 $v
是否代表日期,这就是为什么 isDateTime()
方法需要读取单元格本身以确定它是否是否包含日期。
确保您的数组被 return 编辑为关联数组(通过将方法的附加最后一个参数设置为 true
),这会为您提供每个单元格的地址:
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE, TRUE);
这将 return 一个按行地址索引的数组,作为按列地址的嵌套数组,因此您的 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));
在您的代码中