| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | <?phpnamespace PhpOffice\PhpSpreadsheet\Worksheet;use PhpOffice\PhpSpreadsheet\Cell\Coordinate;use PhpOffice\PhpSpreadsheet\Exception;use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;class ColumnIterator implements \Iterator{    /**     * Worksheet to iterate.     *     * @var Worksheet     */    private $worksheet;    /**     * Current iterator position.     *     * @var int     */    private $currentColumnIndex = 1;    /**     * Start position.     *     * @var int     */    private $startColumnIndex = 1;    /**     * End position.     *     * @var int     */    private $endColumnIndex = 1;    /**     * Create a new column iterator.     *     * @param Worksheet $worksheet The worksheet to iterate over     * @param string $startColumn The column address at which to start iterating     * @param string $endColumn Optionally, the column address at which to stop iterating     */    public function __construct(Worksheet $worksheet, $startColumn = 'A', $endColumn = null)    {        // Set subject        $this->worksheet = $worksheet;        $this->resetEnd($endColumn);        $this->resetStart($startColumn);    }    /**     * Destructor.     */    public function __destruct()    {        unset($this->worksheet);    }    /**     * (Re)Set the start column and the current column pointer.     *     * @param string $startColumn The column address at which to start iterating     *     * @throws Exception     *     * @return ColumnIterator     */    public function resetStart($startColumn = 'A')    {        $startColumnIndex = Coordinate::columnIndexFromString($startColumn);        if ($startColumnIndex > Coordinate::columnIndexFromString($this->worksheet->getHighestColumn())) {            throw new Exception("Start column ({$startColumn}) is beyond highest column ({$this->worksheet->getHighestColumn()})");        }        $this->startColumnIndex = $startColumnIndex;        if ($this->endColumnIndex < $this->startColumnIndex) {            $this->endColumnIndex = $this->startColumnIndex;        }        $this->seek($startColumn);        return $this;    }    /**     * (Re)Set the end column.     *     * @param string $endColumn The column address at which to stop iterating     *     * @return ColumnIterator     */    public function resetEnd($endColumn = null)    {        $endColumn = $endColumn ? $endColumn : $this->worksheet->getHighestColumn();        $this->endColumnIndex = Coordinate::columnIndexFromString($endColumn);        return $this;    }    /**     * Set the column pointer to the selected column.     *     * @param string $column The column address to set the current pointer at     *     * @throws PhpSpreadsheetException     *     * @return ColumnIterator     */    public function seek($column = 'A')    {        $column = Coordinate::columnIndexFromString($column);        if (($column < $this->startColumnIndex) || ($column > $this->endColumnIndex)) {            throw new PhpSpreadsheetException("Column $column is out of range ({$this->startColumnIndex} - {$this->endColumnIndex})");        }        $this->currentColumnIndex = $column;        return $this;    }    /**     * Rewind the iterator to the starting column.     */    public function rewind()    {        $this->currentColumnIndex = $this->startColumnIndex;    }    /**     * Return the current column in this worksheet.     *     * @return Column     */    public function current()    {        return new Column($this->worksheet, Coordinate::stringFromColumnIndex($this->currentColumnIndex));    }    /**     * Return the current iterator key.     *     * @return string     */    public function key()    {        return Coordinate::stringFromColumnIndex($this->currentColumnIndex);    }    /**     * Set the iterator to its next value.     */    public function next()    {        ++$this->currentColumnIndex;    }    /**     * Set the iterator to its previous value.     */    public function prev()    {        --$this->currentColumnIndex;    }    /**     * Indicate if more columns exist in the worksheet range of columns that we're iterating.     *     * @return bool     */    public function valid()    {        return $this->currentColumnIndex <= $this->endColumnIndex && $this->currentColumnIndex >= $this->startColumnIndex;    }}
 |