2017-06-21 6 views
1

Ich verwende die Spaltenüberschrift als Array-Index (Zeile 1), und ich möchte keine Probleme haben, wenn sie ihre XLSX-Datei mit falschen Spaltenüberschriften hochladen (oder manchmal fehlen).Wie überprüft man, ob die Spaltenüberschriften in PHPExcel korrekt sind?

Ich fand diese Antwort wirklich hilfreich. Ich kann meine Array-Indizes als Spaltenüberschriften machen:

for ($row = 2; $row <= $highestRow; $row++){ 
    // Read a row of data into an array 
    $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, 
              NULL, 
              TRUE, 
              FALSE); 
    $rowData[0] = array_combine($headings[0], $rowData[0]); 
} 

Der obige Code ist aus https://stackoverflow.com/a/32526911/8191721

Hier ist, was ich passieren soll:

  1. prüfen Sie zunächst die Spaltenüberschriften, wenn Sie stimmen mit der Spalte Header überein, die ich (in Array, also kann ich in_array in einer Schleife verwenden) vor schreibe es th die Datenbank.
  2. Wenn die Header korrekt sind, werde ich jetzt die Array-Indizes zu Spaltenüberschriften (also anstelle von [0], sollte jetzt [firstname] zurückgeben) oder sonst eine Fehlermeldung zu werfen.
  3. Schreiben Sie in die Datenbank, wo die Spaltennamen in meiner Datenbank genau mit den Spaltenkopfnamen übereinstimmen (oder falls nicht, mindestens mit der Abfrage übereinstimmt) in ihrer XLSX-Datei. (Ich nannte sie "Column Mapping").

lange Kurzgeschichte, hier ist mein Code:

try { 
    $inputFileName = $_FILES['file']['tmp_name']; 
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName); 
    $objReader  = PHPExcel_IOFactory::createReader($inputFileType); 
    $objPHPExcel = $objReader->load($inputFileName); 

    //-- Get worksheet dimensions 
    $sheet   = $objPHPExcel->getSheet(0); 
    $highestRow = $sheet->getHighestRow(); 
    $highestColumn = $sheet->getHighestColumn(); 
    $headings  = $sheet->rangeToArray('A1:'.$highestColumn.'1', NULL, TRUE, FALSE); 

    //-- $row = 2 <- skip row 1 since this is our headers 
    for($row = 2; $row <= $highestRow; $row++) { 
     //-- Read a row of data into an array 
     $xlsxRow = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE); 

     //-- Combine to replace indexes with header names 
     $xlsxRow[0] = array_combine($headings[0], $xlsxRow[0]); 

     //-- Got stucked in here.. 
     /* 
      If column header fails, should exit the loop 
     */ 

     //-- SQL query follows here.. 
} 

diese So kann mir jemand helfen, herauszufinden?

+0

Haben Sie den ersten Teil davon ausgeführt, um die Header mit dem Array zu vergleichen? Warum möchten Sie die Header-Indizes mit den Namen ändern? Schreiben Sie stattdessen eine Funktion und rufen Sie diesen Wert in einer Variablen ab, die Sie in der Datei loop.i.e verwenden können. '$ firstName = $ xlsxRow [0] [0]' –

+0

Weil ich die Header der Excel-Datei mit den Headern in meiner Datenbank abgleichen will. Wenn also der Benutzer die Positionen der Spalten ändert, werden die Daten immer und immer noch korrekt sein. Beispiel, Vorname | Familienname, Nachname. Aber ich möchte die Position von Vorname und Nachname ändern. Wenn er sie in meine Schnittstelle lädt, sind die Daten immer noch überschaubar und korrekt in ihre jeweiligen Spalten eingefügt. Hast du verstanden, worum es geht? –

+0

Also muss ich nur wissen, wie man zuerst die Spaltenüberschriften prüft. Wenn eine oder mehrere Spalten falsch sind, muss ich die Abfrage abbrechen, um eine fehlende Übereinstimmung der Informationen zu vermeiden. –

Antwort

0

Um den Header-Wert zu vergleichen, können Sie array_diff() Funktion verwenden.

Wenn Sie dem Benutzer mehr Flexibilität geben möchten, können Sie das folgende Beispiel verwenden. In diesem Fall

$excelSheetHeaders = array(); 
for ($i = 1; $i <= 1; $i++) { 

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

    $excelSheetHeaders = $rowData[0]; 

    $excelSheetHeaders = array_map('strtolower', $excelSheetHeaders); 

    $errorCount = 0; 

    foreach ($headerArray as $index => $value){ 

     if(!in_array(strtolower($value), $excelSheetHeaders)){ 
       $errorCount++; 
     } 

    } 

    if($errorCount > 0){ 
     //Throw Error and exit; 
    } 

} 

for ($i = 2; $i <= $highestRow; $i++){ 

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

    $spreadsheetData = array(); 

    foreach($headerArray as $index => $value){ 

     $spreadsheetData[$value] = $rowData[0][array_search(strtolower($value),$excelSheetHeaders)]; 

    } 

    var_dump($spreadsheetData); 
} 

Dieser Fehler verwenden ist genau das, was Sie wollen. Jetzt können Sie auf $spreadsheetData['firstName'] zugreifen.

Verwandte Themen