2016-12-22 90 views
0

使用PHPExcel,我一個試圖從Excel文件讀取數據,並使用下面的代碼保存在MySQL數據庫:PHPExcel庫獲取日期

$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日期類型列中。

我也在stackoverflow上閱讀了幾篇文章,但無法獲得完美的解決方案。

+0

你可以var_dump($ rowData);得到它後? – user4035

回答

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 $將是列地址。

然後,您可以使用$行和$ 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)); 

在您的代碼中

+0

太棒了。這就像一個魅力。謝謝。 – ITSagar