35

如何执行基于 Excel 工作表列的循环?我发现(并使用了)WorksheetIterator、RowIterator 和 CellIterator,但没有关于列。

4

7 回答 7

93

没有 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",所以我们使用!= 比较,增加了最高列的值以给出超过终点的第一列 ID。

你也可以使用

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

在循环中测试单元格是否存在,然后使用 getCell() (或不使用)来模拟迭代器 getIterateOnlyExistingCells() 行为

迭代器实际上相当慢,因此您可能会发现这些简单的循环比使用迭代器要快。

更新(2015-05-06)

PHPExcel 1.8.1 版引入了一个新的列迭代器。Row 和 Column 迭代器还允许您指定要迭代的行或列范围,并允许您在循环时使用 prev() 和 next()

于 2011-04-07T08:38:22.973 回答
8

这个简短的代码片段提供了对多行列的循环。它获取最后一个非空列(及其行)的索引并循环到该索引,因此请注意 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
        }
    }
}
于 2016-02-21T13:26:22.110 回答
3

循环列作为范围

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

}
于 2014-05-19T18:39:47.823 回答
1

试试这个!工作!

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

在 $value 中设置您要打印的内容。

于 2014-07-20T13:51:26.703 回答
1

这是最后一条消息的 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;
}
于 2017-04-27T18:59:27.133 回答
0

这种递归方法的设计允许您获取列的“字母”,无论您拥有多少列,从“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”......但是如果您可以使用上述解决方案,它们肯定会更快!

于 2016-06-22T15:26:01.720 回答
0

在 PhpSpreadsheet (替换 PHPExcel )中,您可以执行以下操作:

        foreach( $sheet->getColumnIterator() as $col )
        {
            $sheet->getColumnDimension( $col->getColumnIndex() )->setAutosize( true );
        }
于 2020-10-02T21:02:24.883 回答