2017-06-21 11 views
1

私は配列のインデックス(行1)として列ヘッダーを使用していますが、誤った列ヘッダーを含むXLSXファイルのアップロードを開始するときに問題が発生することはありません。PHPExcelで列ヘッダーが正しいかどうかを確認する方法は?

この回答は本当に便利です。私は、列ヘッダとしての私の配列インデックスを行うことができます。

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]); 
} 

上記のコードhttps://stackoverflow.com/a/32526911/8191721

からここで私が起こるしたいものですされています

  1. チェックは最初の列ヘッダーの場合それらは配列 のヘッダーと一致します(配列内では の前にループ内でin_arrayを使用できます)。データベース。
  2. ヘッダーが正しい場合は、配列インデックスを列ヘッダーに変更します([0]の代わりに、[firstname]を返すようにします)、そうでない場合はエラーメッセージを表示します。
  3. 私のデータベースの列名が、XLSXファイルの列ヘッダー名と正確に一致するか(または一致しない場合、少なくともクエリと一致する)データベースに書き込みます。 (私はそれらを「列マッピング」と呼んだ)。

かいつまんで、ここに私のコードは次のとおりです。

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.. 
} 

だから、誰かが私がこれを考え出す助けることができますか?

+0

ヘッダーと配列を一致させるために最初の部分を実行するようにしましたか?なぜあなたは名前でヘッダーIndexesを変更したいのですか?代わりに、関数を記述し、その値をループ内で使用できる変数に取得します。 '$ firstName = $ xlsxRow [0] [0]' –

+0

私はデータベースのヘッダーとExcelファイルのヘッダーを一致させたいからです。したがって、ユーザーが列の位置を変更した場合、データは常に正しいものになります。例、ファーストネーム|苗字。しかし、私は名と姓の位置を切り替えたいと思います。データを自分のインターフェイスにアップロードすると、データは引き続き管理でき、それぞれの列に正しく挿入されます。私のポイントは何か? –

+0

だから、最初に列ヘッダをチェックする方法を知る必要があります。 1つ以上の列が正しくない場合、情報の不一致を避けるためにクエリをキャンセルする必要があります。 –

答えて

0

ヘッダー値を比較するには、array_diff()機能を使用できます。

ユーザーに柔軟性を与えたい場合は、次の例を使用できます。 この場合は、

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

このエラーはまさにあなたが望むものです。今すぐ$spreadsheetData['firstName']にアクセスできます。

関連する問題