如何检查PHPExcel中的列标题是否正确?

时间:2017-06-21 03:28:51

标签: php phpexcel

我正在使用列标题作为数组索引(第1行),当他们开始使用错误的列标题(或有时会丢失)上传其XLSX文件时,我不希望出现问题。

我发现这个答案非常有用。我可以将我的数组索引作为列标题:

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文件中的列标题名称(如果不匹配,至少与查询匹配)完全匹配。 (我称之为“列映射”)。
  4. 长话短说,这是我的代码:

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

    有人可以帮助我解决这个问题吗?

1 个答案:

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