PHP Spread Sheet预先过滤的列

问题描述

我已成功将自动过滤器添加到电子表格,但我想做的是在保存之前将过滤器应用于电子表格。例如,我有一个RetailerID列,其中包含三个可能的值(13,42,326)。如何保存已被RetailerID = 42过滤的工作表?

我在XML中发现了不同之处:

<autoFilter ref="A1:O1290" xr:uid="{00000000-0009-0000-0000-000000000000}">
    <filterColumn colId="0">
        <filters>
            <filter val="42"/>
        </filters>
    </filterColumn>
</autoFilter>

但是手动更改此设置不会隐藏行,因为需要隐藏的每一行都需要'hidden="1"'属性。如何在PHP Spread Sheets中完成此操作?

编辑: 当前代码如下:

    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    $sheet->fromArray(array_keys($laundry_pairs[0]),null,'A1');
    // Set title row bold
    $sheet->getStyle('A1:E1')->getFont()->setBold(true);
    //set title row color
    $sheet->getStyle('A1:O1')->getFill()
        ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
        ->getStartColor()->setARGB('71eb0e');

    //add rows of data
    $row_num = 2;
    foreach($laundry_pairs as $row_data){
        $sheet->fromArray($row_data,'A' . (string)$row_num++);
    }
    
    //set the column widths to display all textdomain
    for ($col=chr(65); $col < chr(80); $col++){
        $sheet->getColumnDimension((string)$col)->setAutoSize(true);
    }
    
    //set auto filters
    $spreadsheet->getActiveSheet()->setAutoFilter($spreadsheet->getActiveSheet()->calculateWorksheetDimension());
    // Save
    $writer = new Xlsx($spreadsheet);
    $writer->save('laundry_pairs.xlsx');

请忽略我在细胞上迭代的奇怪方法。我知道您现在可以按行,列索引进行访问。

解决方法

我终于在github页面的示例中找到了我想要的东西。 https://github.com/PHPOffice/PhpSpreadsheet/blob/master/samples/Autofilter/10_Autofilter_selection_display.php

$autoFilter = $spreadsheet->getActiveSheet()->getAutoFilter();
$autoFilter->getColumn('C')
    ->setFilterType(Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER)
    ->createRule()
    ->setRule(
        Rule::AUTOFILTER_COLUMN_RULE_EQUAL,42
    );

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...