Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

Differences Between: [Versions 310 and 311] [Versions 310 and 400] [Versions 310 and 401] [Versions 310 and 402] [Versions 310 and 403]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Worksheet;
   4  
   5  use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
   6  use PhpOffice\PhpSpreadsheet\Exception;
   7  use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
   8  
   9  class ColumnIterator implements \Iterator
  10  {
  11      /**
  12       * Worksheet to iterate.
  13       *
  14       * @var Worksheet
  15       */
  16      private $worksheet;
  17  
  18      /**
  19       * Current iterator position.
  20       *
  21       * @var int
  22       */
  23      private $currentColumnIndex = 1;
  24  
  25      /**
  26       * Start position.
  27       *
  28       * @var int
  29       */
  30      private $startColumnIndex = 1;
  31  
  32      /**
  33       * End position.
  34       *
  35       * @var int
  36       */
  37      private $endColumnIndex = 1;
  38  
  39      /**
  40       * Create a new column iterator.
  41       *
  42       * @param Worksheet $worksheet The worksheet to iterate over
  43       * @param string $startColumn The column address at which to start iterating
  44       * @param string $endColumn Optionally, the column address at which to stop iterating
  45       */
  46      public function __construct(Worksheet $worksheet, $startColumn = 'A', $endColumn = null)
  47      {
  48          // Set subject
  49          $this->worksheet = $worksheet;
  50          $this->resetEnd($endColumn);
  51          $this->resetStart($startColumn);
  52      }
  53  
  54      /**
  55       * Destructor.
  56       */
  57      public function __destruct()
  58      {
  59          unset($this->worksheet);
  60      }
  61  
  62      /**
  63       * (Re)Set the start column and the current column pointer.
  64       *
  65       * @param string $startColumn The column address at which to start iterating
  66       *
  67       * @throws Exception
  68       *
  69       * @return ColumnIterator
  70       */
  71      public function resetStart($startColumn = 'A')
  72      {
  73          $startColumnIndex = Coordinate::columnIndexFromString($startColumn);
  74          if ($startColumnIndex > Coordinate::columnIndexFromString($this->worksheet->getHighestColumn())) {
  75              throw new Exception("Start column ({$startColumn}) is beyond highest column ({$this->worksheet->getHighestColumn()})");
  76          }
  77  
  78          $this->startColumnIndex = $startColumnIndex;
  79          if ($this->endColumnIndex < $this->startColumnIndex) {
  80              $this->endColumnIndex = $this->startColumnIndex;
  81          }
  82          $this->seek($startColumn);
  83  
  84          return $this;
  85      }
  86  
  87      /**
  88       * (Re)Set the end column.
  89       *
  90       * @param string $endColumn The column address at which to stop iterating
  91       *
  92       * @return ColumnIterator
  93       */
  94      public function resetEnd($endColumn = null)
  95      {
  96          $endColumn = $endColumn ? $endColumn : $this->worksheet->getHighestColumn();
  97          $this->endColumnIndex = Coordinate::columnIndexFromString($endColumn);
  98  
  99          return $this;
 100      }
 101  
 102      /**
 103       * Set the column pointer to the selected column.
 104       *
 105       * @param string $column The column address to set the current pointer at
 106       *
 107       * @throws PhpSpreadsheetException
 108       *
 109       * @return ColumnIterator
 110       */
 111      public function seek($column = 'A')
 112      {
 113          $column = Coordinate::columnIndexFromString($column);
 114          if (($column < $this->startColumnIndex) || ($column > $this->endColumnIndex)) {
 115              throw new PhpSpreadsheetException("Column $column is out of range ({$this->startColumnIndex} - {$this->endColumnIndex})");
 116          }
 117          $this->currentColumnIndex = $column;
 118  
 119          return $this;
 120      }
 121  
 122      /**
 123       * Rewind the iterator to the starting column.
 124       */
 125      public function rewind()
 126      {
 127          $this->currentColumnIndex = $this->startColumnIndex;
 128      }
 129  
 130      /**
 131       * Return the current column in this worksheet.
 132       *
 133       * @return Column
 134       */
 135      public function current()
 136      {
 137          return new Column($this->worksheet, Coordinate::stringFromColumnIndex($this->currentColumnIndex));
 138      }
 139  
 140      /**
 141       * Return the current iterator key.
 142       *
 143       * @return string
 144       */
 145      public function key()
 146      {
 147          return Coordinate::stringFromColumnIndex($this->currentColumnIndex);
 148      }
 149  
 150      /**
 151       * Set the iterator to its next value.
 152       */
 153      public function next()
 154      {
 155          ++$this->currentColumnIndex;
 156      }
 157  
 158      /**
 159       * Set the iterator to its previous value.
 160       */
 161      public function prev()
 162      {
 163          --$this->currentColumnIndex;
 164      }
 165  
 166      /**
 167       * Indicate if more columns exist in the worksheet range of columns that we're iterating.
 168       *
 169       * @return bool
 170       */
 171      public function valid()
 172      {
 173          return $this->currentColumnIndex <= $this->endColumnIndex && $this->currentColumnIndex >= $this->startColumnIndex;
 174      }
 175  }