PHPSpreadsheet 折叠分组行
PHPSpreadsheet collapsing for grouped rows
我试图在 Excel 文件(使用 PHPSpreadsheet)中创建 3 个大纲级别,它是这样填充的:
$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)。
也许不在结果中创建行更容易 excel。
也许 Filter 就是您正在寻找的解决方案。请注意,每个工作表可能只有一个过滤器。 PHPSpreeadsheet 不支持 pivot tables 和自动 table 格式。
好吧,我的错,没有意识到我在数据填充后有 setAutoFilter
,这覆盖了 foreach
中 setVisible(false)->setCollapsed(true)
使用的结果,再次设置所有行可见.为了避免这种行为,我只是放置了过滤
$spreadsheet->getActiveSheet()->setAutoFilter(sprintf("A4:%s%d",Coordinate::stringFromColumnIndex($colCount-6),$rowNo-1));
在 foreach
之前。
我试图在 Excel 文件(使用 PHPSpreadsheet)中创建 3 个大纲级别,它是这样填充的:
$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)。
也许不在结果中创建行更容易 excel。 也许 Filter 就是您正在寻找的解决方案。请注意,每个工作表可能只有一个过滤器。 PHPSpreeadsheet 不支持 pivot tables 和自动 table 格式。
好吧,我的错,没有意识到我在数据填充后有 setAutoFilter
,这覆盖了 foreach
中 setVisible(false)->setCollapsed(true)
使用的结果,再次设置所有行可见.为了避免这种行为,我只是放置了过滤
$spreadsheet->getActiveSheet()->setAutoFilter(sprintf("A4:%s%d",Coordinate::stringFromColumnIndex($colCount-6),$rowNo-1));
在 foreach
之前。