文件迭代中的 PHPExcel 日期问题
PHPExcel date issue on file iteration
我使用 PHPExcel 将 xlsx 文件导入数据库,以下代码非常适合将 $val 作为单元格值传递并避免插入列 headers:
$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。
我试过回复
但不是运气。
这是我当前的代码:
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;
}
}
}
但这导致我出现致命错误"Uncaught TypeError: Argument 1 passed to PHPExcel_Shared_Date::isDateTime() must be an instance of PHPExcel_Cell, string given"
有什么建议吗?
如果单元格的日期格式掩码是 10/03/17
,那么这就是调用 getFormattedValue()
的格式 return;这不是插入数据库的好格式。您最好明确使用不同的格式掩码,或者甚至将值检索为 DateTime 对象(或 unix 时间戳)而不是格式化字符串。
不过,更关键的是
if (PHPExcel_Shared_Date::isDateTime($val)) {
您在其中传递 MS Excel 时间戳值(一个简单的浮点数)以查看它是否为 date/time。 PHPExcel 不能识别一个浮点数是不是日期;它需要能够读取单元格的数字格式掩码。您需要将单元格本身传递给 isDateTime()
,而不仅仅是值。
if (PHPExcel_Shared_Date::isDateTime($cell)) {
如图PHPExcel API Documentation;和错误信息完全一样
"Uncaught TypeError: Argument 1 passed to PHPExcel_Shared_Date::isDateTime() must be an instance of PHPExcel_Cell, string given"
告诉你:
我使用 PHPExcel 将 xlsx 文件导入数据库,以下代码非常适合将 $val 作为单元格值传递并避免插入列 headers:
$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。
我试过回复
这是我当前的代码:
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;
}
}
}
但这导致我出现致命错误"Uncaught TypeError: Argument 1 passed to PHPExcel_Shared_Date::isDateTime() must be an instance of PHPExcel_Cell, string given"
有什么建议吗?
如果单元格的日期格式掩码是 10/03/17
,那么这就是调用 getFormattedValue()
的格式 return;这不是插入数据库的好格式。您最好明确使用不同的格式掩码,或者甚至将值检索为 DateTime 对象(或 unix 时间戳)而不是格式化字符串。
不过,更关键的是
if (PHPExcel_Shared_Date::isDateTime($val)) {
您在其中传递 MS Excel 时间戳值(一个简单的浮点数)以查看它是否为 date/time。 PHPExcel 不能识别一个浮点数是不是日期;它需要能够读取单元格的数字格式掩码。您需要将单元格本身传递给 isDateTime()
,而不仅仅是值。
if (PHPExcel_Shared_Date::isDateTime($cell)) {
如图PHPExcel API Documentation;和错误信息完全一样
"Uncaught TypeError: Argument 1 passed to PHPExcel_Shared_Date::isDateTime() must be an instance of PHPExcel_Cell, string given"
告诉你: