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