【问题标题】:PHPExcel Column LoopPHPExcel 列循环
【发布时间】:2011-04-07 08:07:36
【问题描述】:

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

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

    没有 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
    }
    

    请注意,在比较列字母以测试循环中的最后一列时,我们不能简单地使用 "AZ",所以我们使用 != 比较,增加了最高列的值,以提供超过终点的第一列 ID。

    你也可以使用

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

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

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

    更新(2015-05-06)

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

    【讨论】:

    • 我试图获取列的数值。我不知道 PHP 的字符增量功能。感谢您的解决方案和这个巧妙的提示!
    • $lastColumn = $worksheet->getHighestColumn();正在返回 B。B 是最后填充的列,请帮忙。
    • 好吧,如果B 是最后填充的列,那么您希望getHighestColumn() 返回什么?这就是它应该做的事情
    • 如果一个特定的单元格有逗号分隔的值,我该如何提取它?
    • @swanandkeskar - 如果您想提出问题,请将其作为问题提出,而不是作为对无关问题的评论
    【解决方案2】:

    这个简短的 sn-p 提供了对多行列的循环。 它获取最后一个非空列(及其行)的索引并循环到该索引,因此请注意 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
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      将列循环为范围

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

      【讨论】:

      【解决方案4】:

      试试这个!工作!

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

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

      【讨论】:

      • 好吧,如果你想使用所有 colls,请设置在限制 16.384 中。这是 Excel 的限制。变量 $j 是 (A ... AAAAAA) 并且 $i 是 (1 ... 1.048.576),您只能将 $j 用于 coll 字母和固定编号:-&gt;setCellValue($j.'1', $value); 和 $value 您可以制作另一个循环或放入数据库和/或数据文件中的数据以填充值。
      【解决方案5】:

      这是对最后一条消息的 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;
      }
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • PHPExcel 已经有一个名为 PHPExcel_Cell::stringFromColumnIndex() 的辅助方法
        • 是的,限制为 3 个字母。 github.com/PHPOffice/PHPExcel/blob/1.8/Classes/PHPExcel/… 790 行
        • 我认为三个字母的限制与实际限制有关,例如 Excel 工作表中的最大列数 (16,384)。三个字母 A-Z 可以覆盖该范围,然后是一些。你能确定一个需要四个字母的列名的用例吗?
        【解决方案7】:

        在 PhpSpreadsheet(取代 PHPExcel)中,您可以这样做:

                foreach( $sheet->getColumnIterator() as $col )
                {
                    $sheet->getColumnDimension( $col->getColumnIndex() )->setAutosize( true );
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          相关资源
          最近更新 更多