2017-06-21 26 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)在 之前將它寫入第e數據庫。
  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

你有沒有辦法做它的第一部分來匹配標題與數組?你爲什麼要改變標題索引與名稱?相反,編寫一個函數並將該值存入一個您可以在loop.i.e中使用的變量中。 '$ firstName = $ xlsxRow [0] [0]' –

+0

因爲我想將Excel文件的標題與數據庫中的標題匹配。因此,如果用戶更改列的位置,數據將始終保持正確。例如,名字|姓。但我想改變名字和姓氏的位置。當他/她上傳到我的界面時,數據仍然可以管理,並正確插入各自的列中。你明白我的觀點了嗎? –

+0

所以我只需要知道如何首先檢查列標題。如果一列或多列不正確,則必須取消查詢以避免信息不匹配。 –

回答

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']

相關問題