我尝试在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)中添加了一些代码。
3条答案
按热度按时间gk7wooem1#
好吧,我的错,没有意识到我在数据填充后有了
setAutoFilter
,这将覆盖foreach
中setVisible(false)->setCollapsed(true)
使用的结果,再次将所有行设置为可见。字符串
在
foreach
之前。zphenhs42#
也许在结果Excel中不创建行更容易。也许Filter是您正在寻找的解决方案。注意,每个工作表只有一个过滤器。PHPSpreeadsheet不支持透视表和自动表格格式。
disho6za3#
删除setOutlineLevel或Grouped行的保护
字符串