2016-12-22 5 views
0

Mit PHPExcel, ich versuche, Daten aus Excel-Datei zu holen und es in MySQL-Datenbank mit dem folgenden Code speichern:PHPExcel Bibliothek get Datum

$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++; 
} 

Dieser Code gibt folgende Fehlermeldung:

Catchable fatal error: Argument 1 passed to PHPExcel_Shared_Date::isDateTime() must be an instance of PHPExcel_Cell, double given, called in ............

Wenn ich Spalten wie folgt lese:

Die Datumsspalten werden als normaler Text gelesen, selbst wenn ich Zellformatierung einstelle bis heute in Excel. Insgesamt habe ich 3 Datumsspalten in jedem Datensatz meiner Excel-Datei, die entweder ein Datum haben oder leer sein wird.

Die Datumsspalte von Excel hat Datumsangaben im Format: d-m-Y. Ich möchte, dass es im Format "Y-m-d" abgerufen wird, wenn es möglich ist, andernfalls muss ich es explodieren und es manuell konvertieren. Das Datum wird schließlich in der mysql Datumsspalte gespeichert.

Ich habe mehrere Artikel bei stackoverflow gelesen, konnte aber keine perfekte Lösung finden.

+0

Können Sie var_dump ($ rowData); nachdem du es bekommen hast? – user4035

Antwort

1

$v ist nur ein numerischer Wert, der von MS Excel verwendete serialisierte Zeitstempelwert, der sich von keinem anderen Gleitkommawert unterscheidet. Es ist nicht möglich zu bestimmen, ob $v ein Datum darstellt oder nicht, ohne auf die Formatmaske für die Zelle zugreifen zu können. Daher muss die Methode isDateTime() die Zelle selbst lesen, um festzustellen, ob sie ein Datum enthält oder nicht.

Stellen Sie sicher, dass Ihr Array als assoziatives Array zurückgegeben wird (durch die zusätzliche letzte Argument für die Methode als true Einstellung), die die Adresse jeder Zelle gibt:

$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE, TRUE); 

Dies wird ein Array zurück indiziert durch ihre Zeilenadresse, als verschachtelten Array von Spaltenadresse, so dass Ihre foreach müssen die Zeilennummer reflektieren:

foreach($rowData[$row] as $k=>$v) 

und k $ wird dann die Spaltenadresse sein.

Sie dann $ row verwenden können und k $, um die Zelle zu erhalten, und übergeben Sie, dass an den isDateTime() Aufruf:

if(PHPExcel_Shared_Date::isDateTime($sheet->getCell($k . $row))) 

Und beachten Sie, dass

$arr[$i] = date('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($InvDate)); 

sollte

$arr[$i] = date('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($v)); 

in Ihrem Code

+0

Ehrfürchtig. Das hat wie ein Zauber funktioniert. Vielen Dank. – ITSagar