PHPSpreadsheet为分组行折叠

cbwuti44  于 2023-11-16  发布在  PHP
关注(0)|答案(3)|浏览(103)

我尝试在Excel文件中创建3个大纲级别(使用PHPSpreadsheet),以这种方式填充:

$worksheet=$spreadsheet->getActiveSheet();
$colCount=$stmt->columnCount();
$rowNo=$worksheet->getHighestRow() + 1;
$object =  (object) $arrFinal;
foreach ($object as $row)
        {
            $colNo = 0;
            foreach ($row as $element)
            {
                if ($colNo < 6)
                {
                    //nothing to do here now
                }
                else
                {
                    $worksheet->getRowDimension($rowNo)->setOutlineLevel(0)->setVisible(false)->setCollapsed(true);
                    if (($colNo == 28) && ($row['AcceptDate'] != ''))
                    {
                        $value = date('d.m.Y', strtotime(substr($row['AcceptDate'],0,10)));
                    }
                    else
                        $value=$element;

                    if (is_null($value)) $value=''; $worksheet->setCellValueByColumnAndRow($colNo-5,$rowNo,$value);
                    if ($row['Level'] == 2)
                    {
                        $worksheet->getRowDimension($rowNo)->setOutlineLevel(1)->setVisible(false)->setCollapsed(true);
                        $worksheet->getStyle('A'.$rowNo)->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED2);
                    }
                    if ($row['Level'] == 2 || $row['Level'] == 1)
                    {
                        $worksheet->getStyle('A'.$rowNo)->getAlignment()->applyFromArray( [ 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER] );
                    }
                    if ($row['Level'] == 3)
                    {
                        $worksheet->getRowDimension($rowNo)->setOutlineLevel(2)->setVisible(false)->setCollapsed(true);
                        $worksheet->mergeCells('A'.$rowNo.':O'.$rowNo);
                        $worksheet->mergeCells('Q'.$rowNo.':Z'.$rowNo);
                    }
                }
                $colNo++;
            }
            $rowNo++;
        }

    $spreadsheet->getActiveSheet()->setAutoFilter(sprintf("A4:%s%d",Coordinate::stringFromColumnIndex($colCount-6),$rowNo-1));

字符串
一切都正常工作,除了一件事-这些行组没有隐藏和折叠,当我在填充数据后检查文件时。然而,如果我只是这样做:

$worksheet->getRowDimension(1)->setOutlineLevel(0)->setVisible(false)->setCollapsed(true);


$spreadsheet=IOFactory::createReader('Xlsx')->load('templates/FB.xlsx');


它按照预期的方式工作。我在这里做错了什么?试图搜索类似的问题,但没有找到对此类情况有帮助的解释。可能错过了一些东西。
P.S.在原始测试用例(setAutoFilter)中添加了一些代码。

gk7wooem

gk7wooem1#

好吧,我的错,没有意识到我在数据填充后有了setAutoFilter,这将覆盖foreachsetVisible(false)->setCollapsed(true)使用的结果,再次将所有行设置为可见。

$spreadsheet->getActiveSheet()->setAutoFilter(sprintf("A4:%s%d",Coordinate::stringFromColumnIndex($colCount-6),$rowNo-1));

字符串
foreach之前。

zphenhs4

zphenhs42#

也许在结果Excel中不创建行更容易。也许Filter是您正在寻找的解决方案。注意,每个工作表只有一个过滤器。PHPSpreeadsheet不支持透视表和自动表格格式。

disho6za

disho6za3#

删除setOutlineLevel或Grouped行的保护

$spreadsheet->getActiveSheet()->getProtection()->setFormatRows(false);
$spreadsheet->getActiveSheet()->getProtection()->setFormatColumns(false);

字符串

相关问题