Laravel-excel: [μ œμ•ˆ] 직접 μ €μž₯ν•˜μ§€ μ•Šκ³  ν•­λͺ© κ°€μ Έ 였기

에 λ§Œλ“  2019λ…„ 01μ›” 24일  Β·  9μ½”λ©˜νŠΈ  Β·  좜처: Maatwebsite/Laravel-Excel

μ „μ œ 쑰건

버전

  • PHP 버전 : 7.1.9
  • 라 라벨 버전 : 5.7.19
  • νŒ¨ν‚€μ§€ 버전 : 3.0+

기술

λͺ¨λΈμ„ 직접 μ €μž₯ν•˜μ§€ μ•Šκ³  κ°€μ Έμ˜¬ 수 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€. κ°€μ Έ μ˜€κΈ°μ—μ„œ λͺ¨λΈ μ΄μ™Έμ˜ ν•­λͺ©μ„ λ°˜ν™˜ ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ 2.1.30μ—μ„œ 3.0.0 μ΄μƒμœΌλ‘œ μ—…κ·Έλ ˆμ΄λ“œ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λͺ¨λΈ μ„ΈνŠΈλ₯Ό μ €μž₯ν•˜μ§€ μ•Šκ³  κ°€μ Έμ˜¬ 수 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€. λ‚˜λŠ” 이것을 ν…ŒμŠ€νŠΈμ— μ‚¬μš©ν•©λ‹ˆλ‹€. λ˜ν•œ 행에 μ„œλ‘œ λ‹€λ₯Έ 클래슀의 두 개의 κ΄€λ ¨ λͺ¨λΈμ„ λ§Œλ“œλŠ” 정보가 포함 된 ν…ŒμŠ€νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬λŠ” ν–‰λ‹Ή ν•˜λ‚˜μ˜ λͺ¨λΈ 만 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œλŠ” CSV νŒŒμΌμ„ μž¬κ΅¬μ„± ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

IMO, 3.0.0+λŠ” ν•˜λ‚˜μ˜ CSV 파일이 ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ— ν•΄λ‹Ήν•˜κ³  ν•˜λ‚˜μ˜ 행이 ν•˜λ‚˜μ˜ λͺ¨λΈμ— ν•΄λ‹Ήν•˜λ©° λͺ¨λ“  λͺ¨λΈμ„ μ¦‰μ‹œ μ €μž₯ν•΄μ•Όν•˜λŠ” 이상적인 상황에 λ„ˆλ¬΄ μ§‘μ€‘ν•©λ‹ˆλ‹€. 이것은 2.X의 κ²½μš°κ°€ μ•„λ‹ˆμ—ˆκ³  μ™œ λ³€κ²½λ˜μ—ˆλŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

버렀진 phpoffice/phpexcel νŒ¨ν‚€μ§€κ°€ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— 2.1.30에 λ¨Έλ¬Όκ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€.

예

μΆ”κ°€ 방법은 μΆ”κ°€ν•΄μ•Όν•©λ‹ˆλ‹€ Excel 같은 μ„œλͺ…이 μ™Έκ΄€, import λŒ€μ‹  그듀을 μ ˆμ•½μ˜ λ°˜ν™˜ λͺ¨λΈ. 예:

$users = Excel::load(new UsersImport, 'users.xlsx');

λ˜ν•œ item λ©”μ„œλ“œλ₯Ό κ°€μ Έ 였기 ν΄λž˜μŠ€μ— μΆ”κ°€ν•΄μ•Όν•©λ‹ˆλ‹€.이 λ©”μ„œλ“œλŠ” λͺ¨λΈ 만 λŒ€μ‹  λͺ¨λ“  μœ ν˜•μ„ λ°˜ν™˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@WouterFlorijn νŒŒμΌμ—μ„œ 배열을 κ°€μ Έ 였기 μœ„ν•΄μ΄ 방법을 μ‹œλ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

$array = Excel::toArray([], 'file.xlsx');

λͺ¨λ“  9 λŒ“κΈ€

ToModel 은 κ°€μ Έ 였기λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•œ 가지 방법 μΌλΏμž…λ‹ˆλ‹€. 이것은 ν–‰ μ‚½μž… λ‹Ή 1 개의 λͺ¨λΈμ„ 더 μ‰½κ²Œ λ§Œλ“œλŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€.

ToCollection λ₯Ό μ‚¬μš©ν•˜λŠ” 것보닀 버전 2.1κ³Ό μœ μ‚¬ν•œ λ°©μ‹μœΌλ‘œ λ‹€λ₯Έ ꡬ쑰λ₯Ό μ²˜λ¦¬ν•˜λ €λ©΄ : https://laravel-excel.maatwebsite.nl/3.1/imports/collection.html In μˆ˜μ§‘ 방법은 2.1μ—μ„œ 얻은 것과 μœ μ‚¬ν•œ ν–‰ λͺ¨μŒμ„ κ°€μ Έμ˜΅λ‹ˆλ‹€.

μ»¨νŠΈλ‘€λŸ¬μ— μ›μ‹œ 행을 λ°˜ν™˜ν•˜λŠ” ::toCollection λ©”μ„œλ“œλ³΄λ‹€ κ°€μ Έ 였기 κ°œμ²΄κ°€ μ•„λ‹Œ μ»¨νŠΈλ‘€λŸ¬μ—μ„œλ§Œ λͺ¨λΈμ„ κ°€μ Έ 였렀면 (μ‹€μ œλ‘œ ꢌμž₯λ˜λŠ” 방법이 μ•„λ‹˜) .
(https://laravel-excel.maatwebsite.nl/3.1/imports/basics.html#importing-to-array-or-collection)

$users = Excel::toCollection(new UsersImport, 'users.xlsx');

@patrickbrouwers λ‹΅μž₯을 ToCollection λ₯Ό κ΅¬ν˜„ν•˜λŠ” κ°€μ Έ μ˜€κΈ°μ—μ„œ Excel::import λ₯Ό μ‚¬μš©ν•˜λ©΄ μ €μž₯ν•˜μ§€ μ•Šκ³  λͺ¨λΈ μ»¬λ ‰μ…˜μ΄ λ°˜ν™˜λ©λ‹ˆκΉŒ? κ·Έλ ‡λ‹€λ©΄ https://laravel-excel.maatwebsite.nl/3.1/imports/collection.html ν•˜λ‹¨μ˜ μ˜ˆκ°€ λ‹€μŒκ³Ό 같이 λ¬Έμ„œμ— λͺ…ν™•ν•˜κ²Œ λͺ…μ‹œλ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

public function import() 
{
    Excel::import(new UsersImport, 'users.xlsx');
}

λ°˜ν™˜ 값은 어디에도 μ €μž₯λ˜μ§€ μ•ŠμœΌλ―€λ‘œ κ°€μ Έμ˜¨ λͺ¨λΈ μ»¬λ ‰μ…˜μ΄ 직접 μ €μž₯λ˜κ±°λ‚˜ 적어도 λ©”μ„œλ“œμ— λΆ€μž‘μš©μ΄ μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ λ°˜ν™˜ 값을 λ³€μˆ˜μ— ν• λ‹Ήν•˜μ§€ μ•Šκ³  import λ₯Ό ν˜ΈμΆœν•˜λŠ” 것은 μ“Έλͺ¨κ°€ μ—†μŠ΅λ‹ˆκΉŒ?

@WouterFlorijn μ•„λ‹ˆμš”, ::import() λŠ” ν–‰μ΄λ‚˜ λͺ¨λΈμ„ λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Excel::toCollection() λ§Œν•©λ‹ˆλ‹€.

ToCollection 관심사λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 Excel::toCollection() μ‚¬μš©ν•˜λŠ” κ²ƒκ³ΌλŠ” λ‹€λ¦…λ‹ˆλ‹€.
ToCollection κ΅¬ν˜„ν•˜λ©΄ 전체 κ°€μ Έ μ˜€κΈ°κ°€ Import 개체 내에 μΊ‘μŠν™”λ©λ‹ˆλ‹€. ToCollection μ—μ„œ 무언가λ₯Ό λ°˜ν™˜ν•˜λ©΄ 컨트둀러둜 λ°˜ν™˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@patrickbrouwers λŒμ•„ κ°€κΈ° μœ„ν•΄ μ—¬μ „νžˆ μš°λ¦¬κ°€ μ„œλ‘œλ₯Ό μ˜€ν•΄ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ‚΄κ°€ μ°Ύκ³ μžˆλŠ” 것은 λͺ¨λΈ μ»¬λ ‰μ…˜μ„ μ €μž₯ν•˜μ§€ μ•Šκ³  λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. 컨트둀러의 행을 μ²˜λ¦¬ν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€. Import ν΄λž˜μŠ€μ—μ„œ μ²˜λ¦¬ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. μ§€κΈˆκΉŒμ§€ λ‚˜λŠ” 이것을 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

아이디어:

TransactionsImport.php :

<?php

namespace App\Imports;

use App\Banks\Transaction;
use Carbon\Carbon;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class TransactionsImport implements ToModel, WithHeadingRow
{
    public function model(array $row)
    {
        $transaction = new Transaction;
        $transaction->amount = $row['amount'];
        $transaction->currency = $row['currency'];

        return $transaction;
    }
}

TransactionsController.php :

...
$transactions = Excel::someFunction(new TransactionsImport, 'path/to/file.csv');
// $transactions is a Collection of Transaction models that are not saved to the database yet.
...

λ˜ν•œ toCollection ν•¨μˆ˜μ—μ„œ 두 가지 문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

  1. 단일 ν•­λͺ©μ΄μžˆλŠ” μ»¬λ ‰μ…˜μ„ λ°˜ν™˜ν•˜λ©°, μ΄λŠ” 각 행에 λŒ€ν•œ μ»¬λ ‰μ…˜μ„ ν¬ν•¨ν•˜λŠ” 또 λ‹€λ₯Έ μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€.
  2. κ°€μ Έ 였기 인수λ₯Ό μ‚¬μš©ν•˜λ©° 행을 μ»¬λ ‰μ…˜μœΌλ‘œ λ°˜ν™˜ν•˜λ €λŠ” κ²½μš°μ—λŠ” μ“Έλͺ¨κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ μ°Ύκ³ μžˆλŠ” 것은 λͺ¨λΈ μ»¬λ ‰μ…˜μ„ μ €μž₯ν•˜μ§€ μ•Šκ³  λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. 컨트둀러의 행을 μ²˜λ¦¬ν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€. Import ν΄λž˜μŠ€μ—μ„œ μ²˜λ¦¬ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. μ§€κΈˆκΉŒμ§€ λ‚˜λŠ” 이것을 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ λ¬Έμ„œκ°€ 도움이 될 κ²ƒμž…λ‹ˆλ‹€.
슀슀둜 지속성 처리
μ•„ν‚€ν…μ²˜ κ°œλ…

@WouterFlorijn νŒŒμΌμ—μ„œ 배열을 κ°€μ Έ 였기 μœ„ν•΄μ΄ 방법을 μ‹œλ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

$array = Excel::toArray([], 'file.xlsx');

@WouterFlorijn νŒŒμΌμ—μ„œ 배열을 κ°€μ Έ 였기 μœ„ν•΄μ΄ 방법을 μ‹œλ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

$array = Excel::toArray([], 'file.xlsx');

그것이 λ°”λ‘œ μ œκ°€ 찾던 κ²ƒμž…λ‹ˆλ‹€.

이 μš”μ²­μ— +1. model () 및 collection () λ©”μ„œλ“œκ°€ 아무것도 μ €μž₯ν•˜μ§€ μ•Šμ•„μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. Excel / CSV 파일의 데이터λ₯Ό λͺ¨λΈ / λ°°μ—΄μ˜ μ»¬λ ‰μ…˜ (λ˜λŠ” λ°°μ—΄)으둜 λ°˜ν™˜ν•΄μ•Όν•©λ‹ˆλ‹€. 지속성은 λ³„λ„λ‘œ μ²˜λ¦¬ν•˜κ±°λ‚˜ 적어도 μ„ νƒν•΄μ•Όν•©λ‹ˆλ‹€.

λ‚΄ μ‚¬μš© 사둀 : CSV의 λ ˆμ½”λ“œμ—μ„œ μ΅œμ†Œ 및 μ΅œλŒ€ λ‚ μ§œλ₯Ό κ°€μ Έμ˜€κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 이것이 기쑴에 κ°€μ Έμ˜¨ CSV와 κ²ΉμΉ˜λŠ” 경우 μ‚¬μš©μžκ°€ 겹침이 μ˜¬λ°”λ₯Έμ§€ ν™•μΈν•˜κΈ° 전에 아무것도 κ°€μ Έ μ˜€μ§€ μ•Šμ•„μ•Όν•©λ‹ˆλ‹€.

νŽΈμ§‘ : μ•„, λ‹«νžŒ λ¬Έμ œμ— μ‘λ‹΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 @WouterFlorijn을 μ–΄λ–»κ²Œ 처리 ν–ˆμŠ΅λ‹ˆκΉŒ?

κ°€μ Έ 였기 클래슀 내뢀에 μƒνƒœλ₯Ό μœ μ§€ν•˜μ—¬ 이미 μ‰½κ²Œμ΄ μž‘μ—…μ„ μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. toModels λ©”μ„œλ“œλ₯Ό 트레이 트 μ•ˆμ— λž˜ν•‘ν•˜κ³  λͺ¨λ“  λ‚΄λ³΄λ‚΄κΈ°μ—μ„œ λ‹€μ‹œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

new UsersImport implements ToModel, WithHeadingRow
{
    use Importable;

    protected array $models;

    public function model(array $row)
    {
         $this->models[] = new User($row);
    }

    public toModels(string $filename): array
    {
       $this->import($filename);

        return $this->models;
    }
}
$nonPersistedUsers = (new UsersImport)->toModels('users.xlsx');
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰