Как добавить границы в сгенерированный PHP лист Excel файла - PullRequest
0 голосов
/ 15 октября 2019

Мне удалось экспортировать данные в лист Excel с помощью библиотеки Phpspreadsheet, и это работает, но мне нужно добавить границы для ячеек, поэтому я написал свою функцию, как показано ниже, но без изменений:

function translatorscity_xslx_export_users($header, $data){
    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    $sheet->fromArray($header, NULL, 'A1');
    $sheet->fromArray($data, NULL, 'A2');

    // redirect output to client browser
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="translatorscity-users-'.gmdate('Y-d-m-h-i-sa').'.xlsx"');
    header('Cache-Control: max-age=0');
    header("Content-Transfer-Encoding: binary");

    //-------------This is added for borders-------------------
    $styleArray = array(
        'borders' => array(
            'outline' => array(
                'style' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                'color' => array('argb' => 'FFFF0000'),
            ),
        ),
    );

    $sheet = $sheet ->getStyle('A1:D109')->applyFromArray($styleArray);
    //------------End borders-----------------------------------

    $writer = new Xlsx($spreadsheet);
    $writer->save('php://output');
    # Free Memory
    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);
    exit;
}

Код стиля обернут в строки комментария. Что мне здесь не хватает

1 Ответ

0 голосов
/ 16 октября 2019

После некоторого поиска проблема заключалась в том, что я устанавливал стили после отправки заголовков, чтобы файл загружался до установки стилей, поэтому я должен был установить стили перед заголовками, поэтому код должен быть таким:

function translatorscity_xslx_export_users($header, $data){
    //Get number of rows
    $dataCount = count($data) + 1;

    $spreadsheet = new Spreadsheet();

    //Set sheet meta data
    $spreadsheet->getProperties()
                ->setCreator("Translators City")
                ->setLastModifiedBy("Translators City")
                ->setTitle("Translators City's users data")
                ->setSubject("These are users data exported from translatorscity.com")
                ->setDescription(
                    "Program created by mo7amed.maki@gmail.com"
                )
                ->setKeywords("data")
                ->setCategory("users");

    $sheet = $spreadsheet->getActiveSheet();

    //Set column width to auto
    $sheet->getColumnDimension('A')->setAutoSize(true);
    $sheet->getColumnDimension('B')->setAutoSize(true);
    $sheet->getColumnDimension('C')->setAutoSize(true);
    $sheet->getColumnDimension('D')->setAutoSize(true);

    //Set table outer borders
    $styleArray = [
                    'font' => [
                        'bold' => true,
                    ],
                    'alignment' => [
                        'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
                    ],
                    'borders' => [
                        'top' => [
                            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                        ],
                        'right' => [
                            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                        ],
                        'bottom' => [
                            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                        ],
                        'left' => [
                            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                        ],
                    ],
                ];

    $sheet->getStyle('A1:D'.$dataCount.'')->applyFromArray($styleArray);

    //Set header outer borders
    $styleArray = [
            'font' => [
                'bold' => true,
                'size' => 18,
            ],
            'alignment' => [
                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
            ],
            'borders' => [
                'top' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                ],
                'right' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                ],
                'bottom' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                ],
                'left' => [
                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK,
                ],
            ],
        ];

    $sheet->getStyle('A1:D1')->applyFromArray($styleArray);


    //Fill data
    $sheet->fromArray($header, NULL, 'A1');
    $sheet->fromArray($data, NULL, 'A2');



    // redirect output to client browser
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="translatorscity-users-'.gmdate('Y-d-m-h-i-sa').'.xlsx"');
    header('Cache-Control: max-age=0');
    header("Content-Transfer-Encoding: binary");

    //Write and save
    $writer = new Xlsx($spreadsheet);
    $writer->save('php://output');
    # Free Memory
    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);
    exit;
}
...