라라벨에서는 Maatwebsite excel라이브러리를 사용할 수 있다.
엑셀을 사용하는 방법은 간단하다.
라라벨에서 Export 생성 명령어는
php artisan make:export ExcelExport
라고 입력하면 생성된다.
return Excel::download(new ExcelExport($data), '엑셀저장명'.xlsx');
이렇게 엑셀 다운로드를 호출하면 다운로드 된다.
나는 임의적으로 "ExcelExport"라는 명칭의 Export 파일을 생성했다.
파라미터 $data의 형식은 현재 collection이다. array도 가능.
물론 download말고 store도 있다. 3.1버전에는 create가 삭제됐다.
생성한 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()을 사용하면 콤마로 인해 해당 숫자를 문자열로 인식해 버린다.
그럼 사진처럼 엑셀의 숫자기능을 활용하기 힘들어진다. 만약 데이터가 수천 건인데 언제 숫자로 변환하고 있나......