Перебор рабочих листов с помощью PHPExcel

Я использую библиотеку PHPExcel для чтения файла Excel и выполнения его обработки. Я хочу просмотреть каждый рабочий лист. Я проверил документацию, и все, что я смог найти, это изменение индекса активного рабочего листа или загрузка только указанных рабочих листов. Как я могу перебрать все листы?

Спасибо за любую помощь.

Вот пример цикла документации, для справки:

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

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

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";
?>

person user717236    schedule 23.07.2012    source источник


Ответы (3)


Вы используете итераторы. Вы смотрели пример кода для итераторов в каталоге /Tests? Если это так, вы могли видеть ссылку на WorksheetIterator.

В качестве альтернативы метод getAllSheets() объекта PHPExcel возвращает массив рабочих листов, что позволяет использовать цикл foreach.

person Mark Baker    schedule 23.07.2012
comment
Большое тебе спасибо! Я нашел итератор в каталоге Test — 28iterator.php. getAllSheets() тоже выглядит хорошо. Спасибо. - person user717236; 23.07.2012

Я думаю, вы можете это сделать. Увеличивайте активный лист до тех пор, пока не останется ни одного, а затем делайте с каждым то, что хотите:

<?php

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

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

    $i = 0;
    while ($objPHPExcel->setActiveSheetIndex($i)){

        $objWorksheet = $objPHPExcel->getActiveSheet();
        //now do whatever you want with the active sheet
        ...
        $i++;

    }

    ...

?>
person jeffery_the_wind    schedule 23.07.2012
comment
Интересный подход. Спасибо за этот ответ. - person Yitzhak; 19.05.2015
comment
вам нужно попробовать... поймать конструкцию, потому что последняя страница выдает исключение - person Andrey Vorobyev; 11.06.2015
comment
if($i ‹$objPHPExcel-›getSheetCount()-1 ) $i++; иначе сломаться; добавьте это в конец цикла, потому что это даст вам ошибку при поиске несуществующего последнего листа - person Ardit Meti; 25.02.2016

Вот полезная функция, которую я использую для перебора листов и возврата массива значений ячеек для каждого с заголовком листа в качестве ключа массива:

function getSheets($fileName) {
    try {
        $fileType = PHPExcel_IOFactory::identify($fileName);
        $objReader = PHPExcel_IOFactory::createReader($fileType);
        $objPHPExcel = $objReader->load($fileName);
        $sheets = [];
        foreach ($objPHPExcel->getAllSheets() as $sheet) {
            $sheets[$sheet->getTitle()] = $sheet->toArray();
        }
        return $sheets;
    } catch (Exception $e) {
         die($e->getMessage());
    }
}
person billynoah    schedule 18.11.2015