Laravel-excel: [์งˆ๋ฌธ] ๋‚ด๋ณด๋‚ด๊ธฐ ์ „์— ๊ธฐ์กด ํŒŒ์ผ์„ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

์— ๋งŒ๋“  2019๋…„ 02์›” 22์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Maatwebsite/Laravel-Excel

์ „์ œ ์กฐ๊ฑด

๋ฒ„์ „

  • PHP ๋ฒ„์ „ : 7.2
  • ๋ผ ๋ผ๋ฒจ ๋ฒ„์ „ : 5.7
  • ํŒจํ‚ค์ง€ ๋ฒ„์ „ : 3.1

๊ธฐ์ˆ 

ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ์ด ๋ฒ„์ „์—์„œ๋Š”์ด ๊ธฐ๋Šฅ์ด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚ด๋ถ€์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  function resisterEvents() ์žฌ์ƒํ•˜๋ฉด ํ˜ผ์ž์„œ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹œํŠธ๋ฅผ ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์„ ํŽธ์ง‘ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ ๋‚ด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

    /**
     * <strong i="16">@return</strong> array
     */
    public function registerEvents(): array
    {
        return [
            BeforeWriting::class  => function(BeforeWriting $event) {
                $event->writer->reopen(storage_path('app/public/files/mytemplate.xlsx'),Excel::XLSX);
                $event->writer->getSheetByIndex(0);
                return $event->getWriter()->getSheetByIndex(0);
            }
        ];
    }

๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ?

๋งŽ์€ ๊ฐ์‚ฌ

์ถ”๊ฐ€ ์ •๋ณด

function resisterEvents() ๋‚ด๋ถ€์—์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์— ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

AfterSheet::class => function(AfterSheet $event) {
       $event->sheet->setCellValue('G2', 'Hello world');
}

๋˜ํ•œ function query() ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

->reopen() ์€ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๋‹ค์‹œ ์—ด๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ํŒŒ์ผ (ํ…œํ”Œ๋ฆฟ) ํŽธ์ง‘์€ ๋กœ๋“œ๋งต (๋ฒ„์ „ 3.3)์— ์žˆ์ง€๋งŒ ํŠน์ • ๋ฆด๋ฆฌ์Šค ๋‚ ์งœ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์šฐ์„ ์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒ์šฉ ์ง€์› ์„น์…˜ ( https://laravel-excel.com/commercial-support)์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค .

๋ชจ๋“  5 ๋Œ“๊ธ€

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๊ฒƒ์€ ๋ฒ„์ „ 3.1.0์—์„œ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฒ„์ „ 3.1.10์—์„œ๋Š” reopen ํ•จ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์—…๋ฐ์ดํŠธ ๋ฐ ๊ธฐ์กด ํŒŒ์ผ ํŽธ์ง‘ ๊ฐœ์„ ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

->reopen() ์€ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๋‹ค์‹œ ์—ด๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ํŒŒ์ผ (ํ…œํ”Œ๋ฆฟ) ํŽธ์ง‘์€ ๋กœ๋“œ๋งต (๋ฒ„์ „ 3.3)์— ์žˆ์ง€๋งŒ ํŠน์ • ๋ฆด๋ฆฌ์Šค ๋‚ ์งœ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์šฐ์„ ์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒ์šฉ ์ง€์› ์„น์…˜ ( https://laravel-excel.com/commercial-support)์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค .

์ด ๋น ๋ฅธ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ๋งคํฌ๋กœ ๋ฐ ๋™์  ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด Excel์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  Excel ์ˆ˜์‹์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ์ค‘์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์—‘์…€๋กœ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ๊ฑธ ์ฐพ์œผ๋ฉด ์‹ ๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

์—…๋ฐ์ดํŠธ์˜ ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์˜๊ฒฌ์„ ๋งํ•˜์‹ญ์‹œ์˜ค.

์•ˆ๋…•ํ•˜์„ธ์š”, @MarFelix. ๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ๊ณ  ์ด์ œ ์‚ฌ์šฉ์ค‘์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Mattwebsite ์ฝ”๋“œ๋ฅผ ๊นŠ์ด ํŒŒ๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.

  1. ์ „ํ™” Excel ๋‹น์‹ ์˜ ํ†ต๊ณผ ํด๋ž˜์Šค๋ฅผ Export ํด๋ž˜์Šค (์ด ์˜ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” download ๋ฐฉ๋ฒ•)
  2. Excel ํด๋ž˜์Šค๋Š” ์‚ฌ์šฉํ•  Writer ์‹๋ณ„ํ•˜๊ณ ์ด Writer ์—์„œ export ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  3. Writer ๋Š” Export (๊ทธ๋ฆฌ๊ณ  BeforeExport ์ด๋ฒคํŠธ ํ˜ธ์ถœ)์„ ์—ด๊ณ  ์ƒˆ ์‹œํŠธ๋ฅผ ์ฑ„์šด ๋‹ค์Œ ์ž์ฒด write ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  4. write ๋ฉ”์„œ๋“œ ( Writer ํด๋ž˜์Šค)๋Š” BeforeWriting ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  XLSX ์ด์™ธ์˜ ๋‹ค๋ฅธ ์œ ํ˜•์— ๋Œ€ํ•ด ํŒŒ์ผ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ BeforeWriting ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  BeforeExport ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€๋งŒ ์ƒˆ ์‹œํŠธ์—์„œ๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ์ดํ„ฐ (์ œ ๊ฒฝ์šฐ์—๋Š” FromCollection)๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฉ”์„œ๋“œ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด 2 ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ BeforeWriting ์—์„œ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์›ํ•˜๋Š” ์‹œํŠธ๋ฅผ ๊ฐ€์ ธ ์™€์„œ export ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

public function collection()
{
    if ($this->calledByEvent) { // flag
        return $this->myCollectionToExport;
    }

    return collect([]);
}

public function registerEvents(): array
{
    return [
        BeforeWriting::class => function(BeforeWriting $event) {
            $templateFile = new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx'));
            $event->writer->reopen($templateFile, Excel::XLSX);
            $event->writer->getSheetByIndex(0);

            $this->calledByEvent = true; // set the flag
            $event->writer->getSheetByIndex(0)->export($event->getConcernable()); // call the export on the first sheet

            return $event->getWriter()->getSheetByIndex(0);
        },
    ];
}

Maatwebsite\Excel\Writer download ๋ฐ write ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋งค์šฐ ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ •๋ณด์™€ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด๋ณด๋‹ค ๋ณต์žกํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
3 / 5 - 1 ๋“ฑ๊ธ‰