[Laravel] Maat Excel 3.1버전 스타일 지정 : 엑셀 서식 숫자 천단위 콤마 찍기, 수동 열너비 지정

florentyoon·2021년 5월 21일
0

Laravel

목록 보기
3/12

라라벨 엑셀은 서식 지정이 자유롭다.

라라벨에서는 Maatwebsite excel라이브러리를 사용할 수 있다.
엑셀을 사용하는 방법은 간단하다.

엑셀 사용하기 : Export 생성하기

라라벨에서 Export 생성 명령어는

php artisan make:export ExcelExport 

라고 입력하면 생성된다.

엑셀 사용하기 : Excel::download

return Excel::download(new ExcelExport($data), '엑셀저장명'.xlsx');

이렇게 엑셀 다운로드를 호출하면 다운로드 된다.
나는 임의적으로 "ExcelExport"라는 명칭의 Export 파일을 생성했다.
파라미터 $data의 형식은 현재 collection이다. array도 가능.
물론 download말고 store도 있다. 3.1버전에는 create가 삭제됐다.

Export 상속 지정

생성한 export에서 sheet style을 지정하려면 WithEvents를 사용한다.

namespace App\Exports;

use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Style\Fill;

class ExcelExport implements FromCollection, WithHeadings, WithMapping, ShouldAutoSize, WithEvents

이런 식으로 WithEvents를 사용한다.

그리고 아래에 상속받은 events를 사용할 메소드를 쓰면 된다.

 public function registerEvents(): array{
        return [
            AfterSheet::class => function (AfterSheet $event) {
                $sheet = $event->getSheet()->getDelegate();
				// 기본적으로 $event->getSheet()->getDelegate()는 해당 시트를 접근하기 위한 메소드로 보면 된다. 난 $sheet라는 변수로 할당해서 사용한다. 
                
                foreach (range('A', 'W') as $columnId) {  //A부터 W열까지 AutoSize를 사용하지 않고 내가 직접 입력한 열 크기로 맞춘다. (한글은 autoSize가 안됨.)
                    $sheet->getColumnDimension($columnId)->setAutoSize(false);
                    $sheet->getColumnDimension($columnId)->setWidth(15);
                }

                $sheet->getStyle('O2:W'.$sheet->getHighestRow())->getNumberFormat()->setFormatCode('#,##0');  
                //getStyle은 반드시 열단위('A')가 아닌 셀 단위('A1' 또는 'A1:B2')로 작성해야 작동한다. 따라서 엑셀의 O2범위부터 W의 맨 마지막 데이터가 위치한 행의 숫자까지 지정해서 범위로 숫자서식을 지정해준다. 
                // setFormatCode의 괄호 안에 들어가는 것은 엑셀의 셀 서식에서 사용자지정을 입력하는 것과 동일하다. 나는 천 단위 콤마를 위해 '#,##0'을 입력했다.                               

            }
        ];
    }

스타일 코드의 마지막 줄은 사진과 같이 엑셀에서 셀 서식을 지정하는 것과 동일하다.

결과는 사진처럼 나온다.

만약 스타일 서식을 안쓰면?

만약 이런 스타일을 지정하지 않고, 임의적으로 php나 js의 number_format()을 사용하면 콤마로 인해 해당 숫자를 문자열로 인식해 버린다.

그럼 사진처럼 엑셀의 숫자기능을 활용하기 힘들어진다. 만약 데이터가 수천 건인데 언제 숫자로 변환하고 있나......

profile
florentyoon의 IT 세상

0개의 댓글