PHPExcel_样式_填充无限递归

PHPExcel_样式_填充无限递归,php,recursion,phpexcel,Php,Recursion,Phpexcel,我使用库phpexcel1.7.9来处理Excel文件。首先,我创建一个模板,对其进行样式化和抛光。然后,为了避免样式硬编码,我使用上述库打开该模板,更改一些值并将其保存为新的.xlsx文件 首先,我们从单元格中获取该样式 $this->styles = array() ; $this->styles['category'] = $sheet->getStyle("A4"); $this->styles['subcategory'] = $sheet->getSty

我使用库
phpexcel1.7.9
来处理
Excel
文件。首先,我创建一个模板,对其进行样式化和抛光。然后,为了避免样式硬编码,我使用上述库打开该模板,更改一些值并将其保存为新的
.xlsx
文件

首先,我们从单元格中获取该样式

$this->styles = array() ;
$this->styles['category'] = $sheet->getStyle("A4");
$this->styles['subcategory'] = $sheet->getStyle("A5");
这是递归函数,它显示类别和子类别

private function displayCategories($categories, &$row, $level = 0){
    $sheet = $this->content ;

    foreach($categories as $category){
        if ($category->hasChildren() || $category->hasItems()){ //Check if the row has changed.
            $sheet->getRowDimension($row)->setRowHeight(20);
            $sheet->mergeCells(Cell::NUMBER . $row . ":" . Cell::TOTAL . $row) ;

            $name = ($level == 0) ? strtoupper($category->name) : str_repeat(" ", $level*6) ."- {$category->name}" ;
            $sheet->setCellValue(Cell::NUMBER . $row, $name) ;
            $sheet->duplicateStyle((($level == 0) ?  $this->styles['category'] : $this->styles['subcategory']), Cell::NUMBER . $row);

            $row++ ;
            if ($category->hasChildren()){
                $this->displayCategories($category->children, $row, $level+1);
            }
        }
    }   
}

问题

如果使用
$sheet->duplicateStyle()
,由于无限递归,将无法保存文档


已达到最大函数嵌套级别“200”,正在中止 不知道图书馆的具体情况

改变这个怎么样:

public function getHashCode() { //class PHPExcel_Style_Fill
    if ($this->_isSupervisor) { 
为此:

public function getHashCode() { //class PHPExcel_Style_Fill
    if ($this->_isSupervisor && ( $this != $this->getSharedComponent() ) ) { 
如果
If
语句后的哈希代码逻辑不适用于
\u isSupervisor
,则添加另一个逻辑语句并返回一个固定值,如下所示:

public function getHashCode() { //class PHPExcel_Style_Fill
    if ($this->_isSupervisor) { 
        if ( $this == $this->getSharedComponent() )
            return md5(0);
$sheet->duplicateStyle($sheet->getStyle('A1'), 'A1');

编辑我添加了一个带修复的拉取请求:

当您尝试将单元格的样式复制到同一单元格时,会发生这种情况;看看这个:

$phpe = new PHPExcel();
$sheet = $phpe->createSheet();

$sheet->setCellValue('A1', 'hi there') ;
$sheet->setCellValue('A2', 'hi again') ;

$sheet->duplicateStyle($sheet->getStyle('A1'), 'A2');

$writer = new PHPExcel_Writer_Excel2007($phpe);
$writer->save('./test.xlsx');
它会很好用的但是如果我添加另一行,如下所示:

public function getHashCode() { //class PHPExcel_Style_Fill
    if ($this->_isSupervisor) { 
        if ( $this == $this->getSharedComponent() )
            return md5(0);
$sheet->duplicateStyle($sheet->getStyle('A1'), 'A1');
然后,在调用
save
方法之后,无限递归开始

要修复代码,应修改此部分:

$sheet->duplicateStyle((($level == 0) ?  $this->styles['category'] : $this->styles['subcategory']), Cell::NUMBER . $row);
指的是:

$style = ($level == 0) ?  $this->styles['category'] : $this->styles['subcategory'];
$targetCoords = Cell::NUMBER . $row;
if($style->getActiveCell() != $targetCoords) {
    $sheet->duplicateStyle($style, $targetCoords);
}

如果($category->hasChildren(),您不能将
$sheet->duplicateStyle()
移到
上面吗
?基本上只在foreach上有它,但不在条件中?你的意思是我应该将它移出
if
,或者将它放在
if
下的第一行?移出if。在它上面,你可以试一下github最新开发的分支代码吗?duplicateStyle()有几个修复程序方法,该方法已为下一个release@MarkBaker这个分支叫做
development 1.79
?我会看一看,稍后再通知你。这可能是个好主意,我也尝试过,但出于某种原因,还有另一个递归循环。
+1
不过是为了尝试。如果我们改变了很多代码,这可能会起作用类似于:如果是这样的话,听起来好像
\u isSupervisor
$this==$this->getSharedComponent()是互斥的
。这可能是一个很好的观察点-这种关系是什么,应该允许它引用自身吗?也许是代码中的错误将它带到了那个地方。祝你好运。我能问一下你是否测试了更改,它真的有效吗?是的,我做了-事实上我的帖子包含了我正在测试的确切案例;还要注意pull-requeest包含的更改比PHPExcel_样式_Fill中的更改更多;只是为了澄清,我能够复制您的问题,并通过不将样式从A1复制到A1来解决它;我还开发了一个pull请求,以便在它们合并itAlright后可以执行此类复制。我将测试它。我的悬赏即将结束,您的sol这似乎是合法的,所以你很可能会得到它。当然,当我测试这些东西时,我会接受答案。现在你可以享受你的赏金了:P