web-dev-qa-db-ja.com

PHPExcel列ループ

Excelワークシートの列に基づくループを実行するにはどうすればよいですか? WorksheetIterator、RowIterator、CellIteratorを見つけて使用しましたが、列については何もしませんでした。

32
Hazar

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のPerlスタイルの機能を利用して文字をインクリメントできます。

$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" !=比較。最高の列値を増分して、エンドポイントを過ぎた最初の列IDを提供します。

使用することもできます

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

ループ内でgetCell()を使用してセルにアクセスする前にセルの存在をテストし、そうでない場合はイテレーターgetIterateOnlyExistingCells()の動作をエミュレートします

イテレータは実際にはかなり遅いため、これらの単純なループはイテレータを使用するよりも高速であることがわかります。

[〜#〜] update [〜#〜](2015-05-06)

PHPExcelバージョン1.8.1では、新しい列イテレーターが導入されました。行イテレータと列イテレータを使用すると、反復する行または列の範囲を指定でき、ループ処理時にprev()およびnext()を使用できます

83
Mark Baker

この短いスニペットは、列の行をループスルーします。最後の空でない列(およびその行)のインデックスを取得し、そのインデックスにループするため、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
        }
    }
}
7
unnamed

範囲として列をループ

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

}
5
anydasa

これは、最後のメッセージの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
Ronald Rubí

これを試して!作業!

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

印刷したいものを$ valueに設定します。

1

この再帰的な方法は、列の数に関係なく、「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配列の列をループし、それを文字列に変換し、「setCellValue」などのPHPExcelメソッドで使用できます...しかし、上記のソリューションは確かに高速ですそれらを使用できる場合!

0