【问题标题】:PHPExcel fast duplicate rowPHPExcel快速重复行
【发布时间】:2015-03-30 08:39:54
【问题描述】:

每个单元格都有不同样式的行。我需要复制它(复制文本、样式、大小)。

我正在使用以下功能来做到这一点:

  function copyRowFull(&$ws_from, &$ws_to, $row_from, $row_to) {
    $ws_to->getRowDimension($row_to)->setRowHeight($ws_from->getRowDimension($row_from)->getRowHeight());
    $lastColumn = $ws_from->getHighestColumn();
    $rangeFrom = 'A'.$row_from.':'.$lastColumn.$row_from;
    // copy text
    $ws_to->fromArray($ws_from->rangeToArray($rangeFrom), null, 'A'.$row_to);
    // copy style
    ++$lastColumn;
    for ($c = 'A'; $c != $lastColumn; ++$c) {
      $ws_to->duplicateStyle($ws_from->getStyle($c.$row_from), $c.$row_to);
    }
  }

但是由于循环,它非常慢,但我需要它快,因为会复制很多行。

我也试过这个用于样式复制:

$rangeTo = 'A'.$row_to.':'.$lastColumn.$row_to;
$ws_to->getStyle($rangeTo)->applyFromArray($ws_from->getStyle($rangeFrom));

但它不起作用 - 抛出错误“传递的样式数组无效”。

有没有更快的方法?

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

    在爬取 PHPExcel 源代码后,我想出了一种更快的复制行的方法。它只能在一个工作簿内复制,但这是我需要的。贴出来吧,说不定有人也有或将有类似的问题。

    function copyRowFull(&$ws_from, &$ws_to, $row_from, $row_to) {
      $ws_to->getRowDimension($row_to)->setRowHeight($ws_from->getRowDimension($row_from)->getRowHeight());
      $lastColumn = $ws_from->getHighestColumn();
      ++$lastColumn;
      for ($c = 'A'; $c != $lastColumn; ++$c) {
        $cell_from = $ws_from->getCell($c.$row_from);
        $cell_to = $ws_to->getCell($c.$row_to);
        $cell_to->setXfIndex($cell_from->getXfIndex()); // black magic here
        $cell_to->setValue($cell_from->getValue());
      }
    }
    

    【讨论】:

    • 我想问一下这个放在哪里?它在 Worksheet.php 中还是在控制器中?论据是什么? '因为我在通过参数引用传递时出错。您的反馈将不胜感激。
    • @d_unknown 将此函数放在代码中的任何位置(而不是库中)。 $ws_from$ws_to 是 Worksheet 对象。 $row_from $row_to是行索引(从1开始)。
    • 在 $cell_from = $ws_from->getCell($c.$row_from); 之后添加这个复制合并的单元格: if($cell_from->isMergeRangeValueCell()) { $col = PHPExcel_Cell::coordinateFromString(PHPExcel_Cell::splitRange($cell_from->getMergeRange())[0][1])[0]; $ws_to->mergeCells($c.$row_to.':'.$col.$row_to); //$cell->getMergeRange() }
    【解决方案2】:

    对于那些使用 PHP 5.3 左右的人,Somnium 的回答与 Ravean 的评论相结合并适用于 PHP 5.3:

        /**
     * Copies entire row with formatting and merging
     * @param $ws_from
     * @param $ws_to
     * @param $row_from
     * @param $row_to
     * @throws PHPExcel_Exception
     */
    public function copyRowFull(&$ws_from, &$ws_to, $row_from, $row_to)
    {
        $ws_to->getRowDimension($row_to)->setRowHeight($ws_from->getRowDimension($row_from)->getRowHeight());
        $lastColumn = $ws_from->getHighestColumn();
        ++$lastColumn;
        for ($c = 'A'; $c != $lastColumn; ++$c) {
            $cell_from = $ws_from->getCell($c . $row_from);
            if ($cell_from->isMergeRangeValueCell()) {
                $pCoordinateString = PHPExcel_Cell::splitRange($cell_from->getMergeRange());
                $coordinateFromString = PHPExcel_Cell::coordinateFromString($pCoordinateString[0][1]);
                $col = $coordinateFromString[0];
                $ws_to->mergeCells($c . $row_to . ':' . $col . $row_to);
                //$cell->getMergeRange()
            }
            $cell_to = $ws_to->getCell($c . $row_to);
            $cell_to->setXfIndex($cell_from->getXfIndex()); // black magic here
            $cell_to->setValue($cell_from->getValue());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 2015-02-05
      • 2016-06-16
      • 2013-05-30
      相关资源
      最近更新 更多