Стили таблиц Laravel Excel не применяются к электронной таблице - PullRequest
0 голосов
/ 02 января 2019

Как создать электронную таблицу со стилями, используя стили таблиц в Laravel Excel ?

У меня уже есть нужное представление:

<table border="1">
    <thead>
        <tr>
            <td>Tema/Sub Tema/Sub-sub Tema:</td>
            <td></td>
        </tr>
        <tr>
            <td>Kelompok/Usia:</td>
            <td>{{ $group->name }} / {{ $group->age_range }} tahun</td>
        </tr>
    </thead>
</table>

<table border="1">
    <thead>
        <tr>
            <td rowspan="4">No</td>
            <td rowspan="4">Nama Anak</td>
            @foreach ($fod_indicators as $fod_indicator)
            <td colspan="4">&nbsp;</td>
            @endforeach
            <td colspan="4">ID</td>
        </tr>
        <tr>
            @foreach ($fod_indicators as $fod_indicator)
            <td colspan="4">
                <b>{{ $fod_indicator->fod->name }}</b> <br />
                {{ $fod_indicator->indicator->name }}
            </td>
            @endforeach
            <td>CP / STTPA</td>
        </tr>
        <tr>
            @foreach ($fod_indicators as $fod_indicator)
            <td colspan="4">{{ $fod_indicator->indicator->assessment_technique }}</td>
            @endforeach
            <td>Teknik Penilaian</td>
        </tr>
        <tr>
            @foreach ($fod_indicators as $fod_indicator)
            <td>BB</td>
            <td>MB</td>
            <td>BSH</td>
            <td>BSB</td>
            @endforeach
            <td>Keterangan</td>
        </tr>
    </thead>
    <tbody>
        @foreach ($scores as $score)
        <tr>
            <td align="center">{{ $loop->iteration }}</td>
            <td>{{ $score->child->full_name }}</td>
            @foreach ((object) json_decode($score->scores) as $indicator_star)
                @for ($star = 1; $star <= 4; $star ++)
                <td width="40" align="center">{!! $indicator_star->stars == $star ? '&#10004;' : '&nbsp;' !!}</td>
                @endfor
            @endforeach
        </tr>
        @endforeach
    </tbody>
</table>

<table>
    <tfoot>
        <tr>
            <td>Catatan Anekdot:</td>
        </tr>
        <tr>
            <td>{{ $report->notes }}</td>
        </tr>
    </tfoot>
</table>

Этокак это выглядит в браузере

enter image description here

Но это то, что я получаю в Excel

enter image description here

Я уже заглянул на веб-сайт, но документации для представления таблицы нет, я хотел бы использовать https://laravel -excel.maatwebsite.nl / 3.1 / exports / extending.html # customize, но там написано

Вы можете подключиться к родительскому пакету с помощью событий.Не нужно использовать удобные методы, такие как «запрос» или «представление», если вам нужен полный контроль над экспортом.

Есть ли способ сделать это непосредственно из стиля таблицы?Спасибо.

1 Ответ

0 голосов
/ 02 апреля 2019

Я думаю, что я должен поделиться своими решениями здесь давно, но мне жаль, если мои объяснения не достаточно хороши, надеюсь, вы поймете, что я пытаюсь объяснить здесь.

Во-первых, вам нужно создать нового провайдера с именем PHPExcelMacroServiceProvider в App\Providers\, в который вы поместите все макросы, необходимые для создания файлов Excel, и вот как это выглядит в моем файле провайдера:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
Use \Maatwebsite\Excel\Sheet;
use \Maatwebsite\Excel\Writer;

class PHPExcelMacroServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        /**
         * Page format macros
         */
        Writer::macro('setCreator', function (Writer $writer, string $creator) {
            $writer->getDelegate()->getProperties()->setCreator($creator);
        });

        Sheet::macro('setOrientation', function (Sheet $sheet, $orientation) {
            $sheet->getDelegate()->getPageSetup()->setOrientation($orientation);
        });

        /**
         * Cell macros
         */
        Writer::macro('setCellValue', function (Writer $writer, string $cell, string $data) {
            $writer->getDelegate()->setCellValue($cell, $data);
        });

        Sheet::macro('styleCells', function (Sheet $sheet, string $cellRange, array $style) {
            $sheet->getDelegate()->getStyle($cellRange)->applyFromArray($style);
        });

        Sheet::macro('horizontalAlign', function (Sheet $sheet, string $cellRange, string $align) {
            $sheet->getDelegate()->getStyle($cellRange)->getAlignment()->setHorizontal($align);
        });

        Sheet::macro('verticalAlign', function (Sheet $sheet, string $cellRange, string $align) {
            $sheet->getDelegate()->getStyle($cellRange)->getAlignment()->setVertical($align);
        });

        Sheet::macro('wrapText', function (Sheet $sheet, string $cellRange) {
            $sheet->getDelegate()->getStyle($cellRange)->getAlignment()->setWrapText(true);
        });

        Sheet::macro('mergeCells', function (Sheet $sheet, string $cellRange) {
            $sheet->getDelegate()->mergeCells($cellRange);
        });

        Sheet::macro('columnWidth', function (Sheet $sheet, string $column, float $width) {
            $sheet->getDelegate()->getColumnDimension($column)->setWidth($width);
        });

        Sheet::macro('rowHeight', function (Sheet $sheet, string $row, float $height) {
            $sheet->getDelegate()->getRowDimension($row)->setRowHeight($height);
        });

        Sheet::macro('setFontFamily', function (Sheet $sheet, string $cellRange, string $font) {
            $sheet->getDelegate()->getStyle($cellRange)->getFont()->setName($font);
        });

        Sheet::macro('setFontSize', function (Sheet $sheet, string $cellRange, float $size) {
            $sheet->getDelegate()->getStyle($cellRange)->getFont()->setSize($size);
        });

        Sheet::macro('textRotation', function (Sheet $sheet, string $cellRange, int $degrees) {
            $sheet->getDelegate()->getStyle($cellRange)->getAlignment()->setTextRotation($degrees);
        });

    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Здесь вы можете найти нужные свойства: здесь , вам просто нужно найти, какую функцию или формат вы хотите, а затем добавить его в файл поставщика, следуя этому правилу https://docs.laravel - excel.com/3.1/imports/extending.html#sheet.

после этого обязательно добавьте PHPExcelMacroServiceProvider к config/app.php

'providers' => [

    /*
     * Laravel Framework Service Providers...
     */
    Illuminate\Auth\AuthServiceProvider::class,
    ... // Bunch of providers

    App\Providers\PHPExcelMacroServiceProvider::class, // Add this provider to the list

],

Итак, чтобы использовать макрос, который вы просто делаете в app/Exports/ExampleReportExport.php, мне просто нужно вызвать макрос. Пример:

$event->sheet->wrapText('A1:AC100');
$event->sheet->setOrientation(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE);
$event->sheet->setFontFamily('A1:AC100', 'Times New Roman');
$event->sheet->horizontalAlign('D1:Q2' , \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
$event->sheet->horizontalAlign('E6:X6' , \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
$event->sheet->verticalAlign('A1:AC100' , \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
$event->sheet->verticalAlign('A8:D100' , \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$event->sheet->horizontalAlign('A6:X7', \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
$event->sheet->horizontalAlign('E8:AC100', \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER); 
$event->sheet->verticalAlign('E7:X7' , \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_BOTTOM);
$event->sheet->verticalAlign('A8:D100' , \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$event->sheet->horizontalAlign('A8:D100', \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT); 
$event->sheet->textRotation('E7:X7', 90);

Я буду рад, если найдется кто-то, кто понимает, что я пытаюсь объяснить, и желает изменить мое объяснение, чтобы мой ответ был более читаемым и более понятным для других. :)

...