【问题标题】:How to check if column headers are correct in PHPExcel?如何检查 PHPExcel 中的列标题是否正确?
【发布时间】:2017-06-21 03:28:50
【问题描述】:

我将列标题用作数组索引(第 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. 如果标题正确,我现在将数组索引转换为列标题(因此,它现在应该返回 [firstname],而不是 [0]),否则会抛出错误消息。
  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..
}

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

【问题讨论】:

  • 您是否设法完成它的第一部分以将标题与数组匹配?为什么要更改标题索引的名称?而是编写一个函数并在可以在循环中使用的变量中获取该值。即$firstName = $xlsxRow[0][0]
  • 因为我想将 Excel 文件的标题与我的数据库中的标题相匹配。因此,如果用户更改列的位置,数据将始终正确。示例,名字 |姓。但我想切换名字和姓氏的位置。当他/她在我的界面中上传数据时,数据仍然可以管理并正确插入各自的列中。你明白我的意思了吗?
  • 所以我只需要知道如何首先检查列标题。如果一列或多列不正确,那么我必须取消查询以避免信息不匹配。
  • 使用array_diff 检查标头是否通过并且您的数组是否匹配。如果false 显示相应的错误。我仍然不明白需要更改索引名称。我有类似的要求,在 for 循环中我为适当的变量赋值并在循环中使用这些变量。

标签: php phpexcel


【解决方案1】:

要比较标头值,您可以使用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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2017-10-04
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多