Laravel-excel: ์‹œ์ž‘ ํ–‰(2)์ด ๊ฐ€์žฅ ๋†’์€ ํ–‰(1)์„ ๋ฒ—์–ด๋‚จ

์— ๋งŒ๋“  2018๋…„ 11์›” 12์ผ  ยท  25์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Maatwebsite/Laravel-Excel

๋ฒ„์ „

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

์„ค๋ช…

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค: /Users/administrator/Sites/blog/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php์—์„œ '์‹œ์ž‘ ํ–‰(2)์ด ๊ฐ€์žฅ ๋†’์€ ํ–‰(1)์„ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค'

์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋Š” ์ฒซ ๋ฒˆ์งธ ํ–‰์— ๋จธ๋ฆฌ๊ธ€์ด ์žˆ๊ณ  ๋‹จ์ผ ์‹œํŠธ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ํ–‰์€ ๋น„์–ด ์žˆ์ง€๋งŒ ๊ดœ์ฐฎ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

App\Imports\PoliciesImport.php

<?php

namespace App\Imports;

use App\Policy;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use Auth;


class PoliciesImport implements ToModel, WithValidation, WithHeadingRow, WithMultipleSheets
{

    use Importable;

    /**
    * <strong i="14">@param</strong> array $row
    *
    * <strong i="15">@return</strong> \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        return new Policy([
          'user_id'     => Auth::user()->id,
          'policy_name' => $row['name'],
          'phone'       => $row['phone'],
          'street'      => $row['address'],
          'city'        => $row['city'],
          'state'       => $row['state'],
          'postal_code' => $row['postal_code'],
        ]);
    }

    public function sheets(): array
    {
        return [
            // Select by sheet index
            0 => new PoliciesImport(),
        ];
    }

    public function rules(): array
    {
        return [
            'policy_name' => 'required|string',
             '*.policy_name' => 'required|string',
        ];
    }

}

์ •์ฑ… ์ปจํŠธ๋กค๋Ÿฌ.php

public function import(Request $request)
  {
    if ($request->hasFile('file')) {

      // validate incoming request
      $this->validate($request, [
        'file' => 'required|file|mimes:xls,xlsx,csv|max:10240', //max 10Mb
      ]);

          if ($request->file('file')->isValid()) {

              $file = $request->file('file');
              $path = $file->store('uploads/policy');
              $fileHeaders = current((new HeadingRowImport)->toArray($path)[0]);
              $validHeaders = [
                'name','phone','address','state','city','postal_code'
              ];
              sort($fileHeaders);
              sort($validHeaders);

              // Check the File Headers
              if ($fileHeaders == $validHeaders) {
                  // Import the saved excel file
                  (new PoliciesImport)->import($path);
              }

              Storage::delete($path);
          }
      }

      return back();

  }

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

๋‚˜๋Š” ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

ํ•˜์ง€๋งŒ ์‹œํŠธ 2, 3์„ ์ œ๊ฑฐํ•œ ํ›„ ํ•ด๊ฒฐ!!

์ด ์ƒํ™ฉ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œํŠธ ์ธ๋ฑ์Šค๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    public function sheets(): array
    {
        return [
            // Select by sheet index
            0 => new pricelist_items(),
        ];
    }

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

์ „์ฒด ์Šคํƒ ์ถ”์ ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ์ˆ˜์ž…ํ’ˆ์ด ๊ทธ๊ฒƒ์„ ์ผ์œผํ‚ค๋Š”์ง€ ์ง€๊ธˆ์€ ๋ณด๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

screen shot 2018-11-12 at 8 02 38 am 2

/Users/administrator/Sites/blog/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php

     *
     * <strong i="8">@param</strong> int $startRow The row number at which to start iterating
     *
     * <strong i="9">@throws</strong> PhpSpreadsheetException
     *
     * <strong i="10">@return</strong> RowIterator
     */
    public function resetStart($startRow = 1)
    {
        if ($startRow > $this->subject->getHighestRow()) {
            throw new PhpSpreadsheetException("Start row ({$startRow}) is beyond highest row ({$this->subject->getHighestRow()})");
        }

        $this->startRow = $startRow;
        if ($this->endRow < $this->startRow) {
            $this->endRow = $this->startRow;
        }
        $this->seek($startRow);

        return $this;
    }

    /**
     * (Re)Set the end row.
     *

๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜๋‚˜์š”?

๊ฐ์‚ฌ ํ•ด์š”!

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

์Šคํƒ ์ถ”์ ์— ๋”ฐ๋ฅด๋ฉด ํŒŒ์ผ์—๋Š” 1๊ฐœ์˜ ํ–‰(์ œ๋ชฉ ํ–‰)๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ–‰์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•  ๋•Œ PhpSpreadsheet๋Š” ๋‘ ๋ฒˆ์งธ ํ–‰์ด ์—†๊ณ  ๋‘ ๋ฒˆ์งธ ํ–‰๋ณด๋‹ค ๋” ๋ฉ€๋ฆฌ ํ–‰์ด ์—†๋‹ค๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

@patrickbrouwers ์ œ ๊ฒฝ์šฐ์—๋Š” 1ํ–‰์„ ๋„˜์–ด์„œ๋Š” ํ–‰๊ณผ ๊ฐ’์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ†ต๊ณผํ•˜๋ ค๋ฉด WithChunkReading ๋ฐ WithCustomChunkSize ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ƒˆ Excel ํŒŒ์ผ๋„ ๋งŒ๋“ค๊ณ  ์ด์ „ ํŒŒ์ผ ๊ฐ’์„ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ’์„ ์ƒˆ ํŒŒ์ผ์— ๋ณต์‚ฌํ•œ ํ›„ ์ž‘๋™ํ•œ๋‹ค๋ฉด ํŒŒ์ผ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
CSV์ธ ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์‘. ๊ฝค ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ๊ณง ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋‹ค์‹œ ํ‘œ์‹œ๋˜๋ฉด ์—ฌ๊ธฐ๋กœ ๋Œ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ XLSX ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•Œ๋ ค์ฃผ์„ธ์š”!

@patrickbrowers ๋„ค, ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์„œ๋ฒ„ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์žก์•„์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ชจ๋ธ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

App\Imports\PoliciesImport.php์—์„œ RegistersEventListeners๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ€์žฅ ๋†’์€ ํ–‰์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋ƒˆ์ง€๋งŒ์ด ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ์—ฌ๊ธฐ์—์„œ ์–ด๋””๋กœ ๊ฐ€์•ผํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    public static function beforeImport(BeforeImport $event)
    {
        $worksheet = $event->reader->getActiveSheet();
        $highestRow = $worksheet->getHighestRow(); // e.g. 10

        dd($highestRow);
    }

@abbylovesdon ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ beforeImport์—์„œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ณ  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ try-catchํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ ๋†’์€ ํ–‰์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@patrickbrowers ๋„์™€ ์ฃผ์…”์„œ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ €๋Š” PHP/Laravel/This Package๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋‚ด ์ž…์žฅ์ด๋ผ๋ฉด ์—ฌ๊ธฐ์—์„œ ๋‚ด๊ฐ€ ํ•œ ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฐ€์ ธ์˜ค๊ธฐ ํด๋ž˜์Šค: App\Imports\PoliciesImport.php

<?php

namespace App\Imports;

use App\Policy;
use Auth;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Validators\Failure;
use Maatwebsite\Excel\Validators\ValidationException;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\RegistersEventListeners;
use Maatwebsite\Excel\Events\BeforeImport;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;

class PoliciesImport implements ToModel, WithValidation, WithHeadingRow, WithMultipleSheets, WithEvents
{
    use Importable, RegistersEventListeners;

    public static function beforeImport(BeforeImport $event)
    {
        $worksheet = $event->reader->getActiveSheet();
        $highestRow = $worksheet->getHighestRow(); // e.g. 10

        if ($highestRow < 2) {
            $error = \Illuminate\Validation\ValidationException::withMessages([]);
            $failure = new Failure(1, 'rows', [0 => 'Now enough rows!']);
            $failures = [0 => $failure];
            throw new ValidationException($error, $failures);
        }
    }

    /**
    * <strong i="8">@param</strong> array $row
    *
    * <strong i="9">@return</strong> \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        return new Policy([
          'user_id'     => Auth::user()->id,
          'policy_name' => $row['name'],
          'phone'       => $row['phone'],
          'street'      => $row['address'],
          'city'        => $row['city'],
          'state'       => $row['state'],
          'postal_code' => $row['postal_code'],
        ]);
    }

    public function sheets(): array
    {
        return [
            // Select by sheet index
            0 => new PoliciesImport(),
        ];
    }

    public function rules(): array
    {
        return [
            'name' => 'required|string',
             '*.name' => 'required|string',
        ];
    }

}

์ด์ œ ๋‚ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

                  try {
                        (new PoliciesImport)->import($path);
                  } catch (\Exception $e) {
                        $failures = $e->failures();
                        dd($failures[0]);
                  }

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! :((

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! :((

์œ„์˜ ์ œ์•ˆ ๋ฐ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

๋‚˜๋Š” ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

ํ•˜์ง€๋งŒ ์‹œํŠธ 2, 3์„ ์ œ๊ฑฐํ•œ ํ›„ ํ•ด๊ฒฐ!!

์ด ์ƒํ™ฉ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œํŠธ ์ธ๋ฑ์Šค๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    public function sheets(): array
    {
        return [
            // Select by sheet index
            0 => new pricelist_items(),
        ];
    }

๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ์—‘์…€ ํŒŒ์ผ์— ์—ฌ๋Ÿฌ ์žฅ์˜ ์‹œํŠธ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„์˜ ์ขŒ์ ˆ ํ›„์— ๋‚ด ๊ทผ๋ณธ์ ์ธ ์˜์‹ฌ์ด ์‚ฌ์‹ค๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์˜ ๋ถ„ํ• ๋กœ ์ธํ•ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ–‰์„ '๋ถ„ํ•  ํ•ด์ œ'ํ•œ ํ›„ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
image

์Šคํƒ ์ถ”์ ์— ๋”ฐ๋ฅด๋ฉด ํŒŒ์ผ์—๋Š” 1๊ฐœ์˜ ํ–‰(์ œ๋ชฉ ํ–‰)๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ–‰์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•  ๋•Œ PhpSpreadsheet๋Š” ๋‘ ๋ฒˆ์งธ ํ–‰์ด ์—†๊ณ  ๋‘ ๋ฒˆ์งธ ํ–‰๋ณด๋‹ค ๋” ๋ฉ€๋ฆฌ ํ–‰์ด ์—†๋‹ค๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

Excel์— ๋จธ๋ฆฌ๊ธ€ ํ–‰๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•. ํด๋ผ์ด์–ธํŠธ์— ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ด๋ฏธ ๋‹ซํ˜€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด ์Šค๋ ˆ๋“œ์˜ ์•„๋ฌด ๊ฒƒ๋„ ๋‚ด ๋ฌธ์ œ์— ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์‹œ์— 10k ํ–‰์„ ์—…๋กœ๋“œํ•˜๊ณ  ์žˆ๋Š”๋ฐ Start row (2) is beyond highest row (1) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 5k๋กœ ๋‚˜๋ˆ„๋ฉด ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?
๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ด๋ฏธ ๋‹ซํ˜€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด ์Šค๋ ˆ๋“œ์˜ ์•„๋ฌด ๊ฒƒ๋„ ๋‚ด ๋ฌธ์ œ์— ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์‹œ์— 10k ํ–‰์„ ์—…๋กœ๋“œํ•˜๊ณ  ์žˆ๋Š”๋ฐ Start row (2) is beyond highest row (1) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 5k๋กœ ๋‚˜๋ˆ„๋ฉด ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?
๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋ถ„ํ• ํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋Š” ์›๋ณธ ํŒŒ์ผ์˜ ์˜ค๋ฅ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ๋ฌธ์ œ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ฝ”๋“œ์™€ ์„œ๋ฒ„ ์‚ฌ์–‘์„ ๋ณด์ง€ ์•Š๊ณ ๋Š” ๋งํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์˜ค๋ฅ˜์ธ ๊ฒƒ ๊ฐ™์•„์š”.

๋ฐฉ๊ธˆ ๋‚˜์—๊ฒŒ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์ด PHP์˜ 'upload_max_filesize' ์ง€์‹œ๋ฌธ๋ณด๋‹ค ํด ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. AWS AMI์—์„œ ์ตœ๋Œ€ 'upload_max_filesize'๊ฐ€ 2MB์ธ ๋ฐ˜๋ฉด 40,000๊ฐœ์˜ ํ–‰์ด ์žˆ๋Š” 5MB์˜ ํŒŒ์ผ ํฌ๊ธฐ์— 500๊ฐœ์˜ ์ฒญํฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž์—๊ฒŒ ์ตœ๋Œ€ ์—…๋กœ๋“œ ํฌ๊ธฐ ํ™•์ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์šด Start row (2) is beyond highest row (1) ๋Œ€์‹  ์ด ์˜ค๋ฅ˜๋ฅผ ์ธ์‡„ํ•˜๋„๋ก ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 'upload_max_filesize' ์ œํ•œ์„ ๋Š˜๋ฆฌ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ํŒŒ์ผ ์—…๋กœ๋“œ๊ฐ€ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

phpspreadsheet๊ฐ€ ๊ทธ ์˜ค๋ฅ˜๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ๋Š” ๋” ๋งŽ์€ ์ด์œ ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ•ญ์ƒ ๊ฑฐ๊ธฐ์—์„œ PR์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@GlennM ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค์—ˆ๊ณ  ์ง€๊ธˆ์€ ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ์•Œ๋งž์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ท€ํ•˜์˜ ์ œ์•ˆ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@patrickbrouwers ์ œ ๊ฒฝ์šฐ์—๋Š” 1ํ–‰์„ ๋„˜์–ด์„œ๋Š” ํ–‰๊ณผ ๊ฐ’์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ†ต๊ณผํ•˜๋ ค๋ฉด WithChunkReading ๋ฐ WithCustomChunkSize ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ƒˆ Excel ํŒŒ์ผ๋„ ๋งŒ๋“ค๊ณ  ์ด์ „ ํŒŒ์ผ ๊ฐ’์„ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

์‚ญ์ œ ์›Œํฌ์‹œํŠธ๊ฐ€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ญ์ œ ์›Œํฌ์‹œํŠธ๊ฐ€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŒŒ์ผ์— ๋นˆ ์›Œํฌ์‹œํŠธ๊ฐ€ ์žˆ๊ณ  "WithHeadingRow"๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

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