【问题标题】:Identifying worksheet index while Looping through worksheets, via getWorksheetIterator(), with PHPExcel在使用 PHPExcel 通过 getWorksheetIterator() 循环工作表时识别工作表索引
【发布时间】:2012-07-23 05:15:49
【问题描述】:

我正在使用 PHPExcel 库来读取包含许多工作表的 Excel 文件并对其执行处理。现在我循环浏览每个工作表没有问题。但是,我想提取每个工作表的索引并将其打印出来,但我不知道该怎么做。当然,我可以制作自己的计数器并完成它。但是getWorksheetIterator()方法一定有内置方法吧?

即如何提取当前工作表迭代器?

感谢您的帮助。

这是文档的循环示例,供参考,稍作修改,包含 worksheetiterator 方法:

<?php
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);

$objPHPExcel = $objReader->load("test.xlsx");
$objWorksheet = $objPHPExcel->getActiveSheet();

$CurrentWorkSheetIndex = 0; 

foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
    echo 'WorkSheet' . $CurrentWorkSheetIndex++ . "\n";
    echo '<table>' . "\n";
    foreach ($objWorksheet->getRowIterator() as $row) {
      echo '<tr>' . "\n";

      $cellIterator = $row->getCellIterator();
      $cellIterator->setIterateOnlyExistingCells(false); // This loops all cells,
                                                         // even if it is not set.
                                                         // By default, only cells
                                                         // that are set will be
                                                         // iterated.
      foreach ($cellIterator as $cell) {
        echo '<td>' . $cell->getValue() . '</td>' . "\n";
      }

      echo '</tr>' . "\n";
    }
    echo '</table>' . "\n";
}
?>

【问题讨论】:

    标签: php for-loop phpexcel worksheet


    【解决方案1】:

    我找到了自己问题的答案。

    foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
        echo 'Worksheet number - ', $objPHPExcel->getIndex($worksheet) , PHP_EOL;
    
        // rest of code above
    }
    

    【讨论】:

    • 作为那些复制/粘贴的仅供参考,此答案中定义的工作表的对象引用更改为 $worksheet,因此在适用的情况下将 $objWorksheet 替换为 $worksheet
    【解决方案2】:

    WorksheetIterator 依次循环遍历每个工作表,所以第一个是索引 0,第二个是索引 1,第三个是索引 2,以此类推

    所以要么为迭代器的每个循环增加 $CurrentWorkSheetIndex。

    $CurrentWorkSheetIndex = 0;   
    
    foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
        $index = $CurrentWorkSheetIndex;
        ....
        $CurrentWorkSheetIndex++;
    }
    

    或者使用Iterator的key()方法。

    $wsIterator = $objPHPExcelR->getWorksheetIterator();
    foreach($wsIterator as $worksheet) {
        $index = $wsIterator->key();
        ....
    }
    

    【讨论】:

    • 感谢您的帮助。不幸的是,第二种方法不起作用。有趣的是,$worksheet->key() 给出了一个致命错误:未定义的方法 PHPExcelWorksheet::key()。然而,$wsIterator->key() 给出了一个值(每次迭代都为 0)。奇怪的。为什么前者会产生错误而后者不会?
    • 不是 PHPExcel_Worksheet 有 key() 方法,而是 PHPExcel_WorksheetIterator。我现在刚刚测试了它,它按预期返回 0, 1, 2, ...
    • 谢谢你,马克。恐怕我不明白。 $wsIterator 在 foreach 闭包中不等于 $worksheet 吗?那么,$worksheet->key() 不应该和 $wsIterator->key() 一样吗?
    • 不,WorksheetIterator 是一个提供一系列方法的类,允许您依次循环遍历每个 Worksheet 对象(或倒带、跳过或其他),但它本身不是 Worksheet 对象,只是一组将与 foreach 一起使用并返回工作表对象的方法。可以将其想象为使用带有数组的 foreach() 循环... foreach($array as $element) {}... $element 是 $array 中的一个条目,而不是整个数组
    猜你喜欢
    • 2012-07-21
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    相关资源
    最近更新 更多