我使用PHPExcel将xlsx文件导入数据库,以下代码非常适合传递$ val作为单元格值并避免插入colum标头:
$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。
我尝试了回复here 但不是运气。
这是我目前的代码:
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:传递给PHPExcel_Shared_Date :: isDateTime()的参数1必须是PHPExcel_Cell的实例,字符串给出”
有什么建议吗?
答案 0 :(得分:2)
如果单元格的日期格式掩码为10/03/17
,则表示调用getFormattedValue()
的格式将返回;这不是一个在数据库中插入的好格式。最好使用不同的格式掩码,甚至将值作为DateTime对象(或unix时间戳)检索,而不是格式化字符串。
然而,更关键的是
if (PHPExcel_Shared_Date::isDateTime($val)) {
您传递MS Excel时间戳值(一个简单的浮点数)以查看它是否为日期/时间。 PHPExcel无法识别浮点数是否为日期;它需要能够读取单元格的数字格式掩码。您需要将单元格本身传递给isDateTime()
,而不仅仅是值。
if (PHPExcel_Shared_Date::isDateTime($cell)) {
如PHPExcel API Documentation所示;和完全一样的错误信息
&#34;未捕获的TypeError:传递给PHPExcel_Shared_Date :: isDateTime()的参数1必须是PHPExcel_Cell的一个实例,给出字符串&#34;
告诉你: