PHPExcel Column Loop - PullRequest
       10

PHPExcel Column Loop

31 голосов
/ 07 апреля 2011

Как сделать цикл, основанный на столбцах таблицы Excel?Я нашел (и использовал) WorksheetIterator, RowIterator и CellIterator, но ничего о столбцах.

Ответы [ 6 ]

81 голосов
/ 07 апреля 2011

ColumnIterator отсутствует, поэтому вам придется делать это вручную.

Для любого данного рабочего листа:

Чтобы зациклить строки для столбца:

$column = 'A';
$lastRow = $worksheet->getHighestRow();
for ($row = 1; $row <= $lastRow; $row++) {
    $cell = $worksheet->getCell($column.$row);
    //  Do what you want with the cell
}

Чтобы зациклить столбцы в строке, вы можете воспользоваться возможностью PHP в стиле Perls для приращения символов:

$row = 1;
$lastColumn = $worksheet->getHighestColumn();
$lastColumn++;
for ($column = 'A'; $column != $lastColumn; $column++) {
    $cell = $worksheet->getCell($column.$row);
    //  Do what you want with the cell
}

Обратите внимание, что при сравнении букв столбцов для проверки последнего столбца в цикле мы не можем просто использовать <или <=, потому что сравниваем строки, и "B"> "AZ" в стандартном сравнении строк, поэтому мы используем сравнение! =, увеличивая максимальное значение столбца, чтобы получить идентификатор первого столбца после конечной точки.

Вы также можете использовать

$worksheet->cellExists($column.$row);

в цикле для проверки существования ячейки перед доступом к ней с помощью getCell () (или нет) для эмуляции поведения итератора getIterateOnlyExistingCells ()

Итераторы на самом деле довольно медленные, поэтому вы можете обнаружить, что эти простые циклы быстрее, чем при использовании итераторов.

ОБНОВЛЕНИЕ (2015-05-06)

В PHPExcel версии 1.8.1 появился новый итератор столбцов. Итераторы Row и Column также позволяют указывать диапазон строк или столбцов для итерации и позволяют использовать prev () и next () при циклическом просмотре

7 голосов
/ 21 февраля 2016

Этот короткий фрагмент предоставляет циклические ряды столбцов. Он получает индексы последнего непустого столбца (и его строки) и возвращается к этим индексам, поэтому помните о забытых значениях в Excel.

Код перебирает строки столбца A, затем строки столбца B ...

$objReader = new PHPExcel_Reader_Excel2007();
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($file);

foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) 
{
    $worksheetTitle = $worksheet->getTitle();
    $highestColumn = $worksheet->getHighestColumn();
    $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);

    // expects same number of row records for all columns
    $highestRow = $worksheet->getHighestRow();

    for($col = 0; $col < $highestColumnIndex; $col++)
    {
        // if you do not expect same number of row records for all columns
        // get highest row index for each column
        // $highestRow = $worksheet->getHighestRow();

        for ($row = 1; $row <= $highestRow; $row++)
        {
            $cell = $worksheet->getCellByColumnAndRow($col, $row);
            $val = $cell->getValue();
            // do what you want with cell value
        }
    }
}
5 голосов
/ 19 мая 2014

столбцы цикла как диапазон

foreach ( range('A', $Excel->getActiveSheet()->getHighestColumn()) as $column_key) {

}
1 голос
/ 27 апреля 2017

Это исправление для метода getColumnLetter последнего сообщения, оно позволяет вам получать «буквы» столбцов, независимо от того, сколько у вас столбцов

function getColumnLetter( $number ){
    $prefix = '';
    $suffix = '';
    $prefNum = intval( $number/26 );
    if( $number > 25 ){
        $prefix = getColumnLetter( $prefNum - 1 );
    }
    $suffix = chr( fmod( $number, 26 )+65 );
    return $prefix.$suffix;
}
1 голос
/ 20 июля 2014

Попробуй это! Работа!

$limit = 10000;
$value='sua mensagem'
for($i=0,$j='A';$i<$limit;$i++,$j++) {
    $objPHPExcel->setActiveSheetIndex(0)
  ->setCellValue($j.$i, $value);
}

установите в $ value то, что вы хотите напечатать.

0 голосов
/ 22 июня 2016

Этот рекурсивный метод был разработан, чтобы вы могли получать «буквы» столбцов, независимо от количества столбцов, от «A» до «ZZZZZZZZZ ...»:

function getColumnLetter( $number )
{
    $prefix = '';
    $suffix = '';
    $prefNum = intval( $number/26 );
    if( $prefNum > 25 )
    {
        $prefix = getColumnLetter( $prefNum );
    }
    $suffix = chr( fmod( $number, 26 )+65 );
    return $prefix.$suffix;
}

Таким образом, вы можете зациклить столбцы массива PHP по порядковому номеру, преобразовать его в строку букв и использовать его в методах PHPExcel, например, "setCellValue" ... Но приведенные выше решения, безусловно, быстрее, если вы можете их использовать!

...