web-dev-qa-db-ja.com

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

イテレータを使用しています。/Testsディレクトリにあるイテレータのコード例を見ましたか?もしそうなら、WorksheetIteratorへの参照を見たことがあるかもしれません

または、PHPExcelオブジェクトのgetAllSheets()メソッドがワークシートの配列を返すため、foreachループを使用できます

11
Mark Baker

できると思います。残りがなくなるまでアクティブシートをインクリメントし、それぞれに対して必要なことを行います。

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

    }

    ...

?>
16

以下は、シートを反復処理し、シートのタイトルを配列キーとしてそれぞれのセル値の配列を返すために使用する便利な関数です。

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());
    }
}
10
billynoah