2017-06-21 45 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']