[Laravel] 엑셀 업로드해서 파일 읽기 1부

florentyoon·2021년 4월 13일
0

Laravel

목록 보기
2/12

라라벨에서 엑셀을 읽다?

라라벨을 사용해서 엑셀을 다운로드 하는 것은 많이 해봤지만, 업로드해서 그 파일을 읽어보는건 낯설다.

이번 엑셀 업로드는 Maatwebsite 의 Excel 기준으로 작업해보았다.

참고를 위해 찾아본 인터넷 자료들은 Excel을 업로드해서 그 데이터를 가공하는 것보다 direct로 연결한 DB에 Import하는 기능이 대부분이었다.

나에게 필요한 기능은 엑셀로 불러온 데이터 중에 특정 컬럼의 내용만 가져와서 해당 유저를 찾아내는 기능이다.

이를 위해서는 라라벨의 기능 두 가지가 핵심인데,

1. 엑셀에서 가져온 데이터를 가공하기 쉬운 배열이나 컬렉션으로 저장해야함.

2. 배열이나 컬렉션으로 담긴 자료를 쿼리문에서 처리할 수 있어야함

이를 위한 해결 방법으로

1. Excel::toCollection 또는 toArray 사용

2. 쿼리문에서 whereIn 사용

두 가지 방법이다.

내가 불러오고 싶은 엑셀은 사진과 같다.

그 사진 속 id값을 추출해서 해당 id 사용자의 정보를 가져오는게 목표다.

먼저 Maatwebsite가 작성한 라라벨 엑셀에서 사진과 같이 참고했다.

그리고 열심히 구글링해서 실제 업로드한 엑셀 파일을 게시판으로 띄우는 개발자의 엑셀 업로드 동영상 사이트를 찾았다.

사이트 안에는 코드 전체도 있는데, 그 코드를 참고할 때 주의할 점이

$path = $request->file('select_file')->getRealPath();

이 코드였다. 저 뒤에 메소드인 getRealPath()는 사용자가 form 전송으로 file로 엑셀을 보냈을 때 임시 저장된 엑셀의 위치를 가리킨다.
저걸 통해서 엑셀을 불러오는 개념인데, 어찌된 영문인지 내 라라벨에선 저 경로를 찾긴 찾지만, 내용을 불러오는데는 실패했다.

결국 구글링 끝에 찾아낸 방법은 storage_path를 사용하는 것이었다.
즉, 내가 지정한 위치로 옮겨놓고 불러오면 잘 작동하는 것이었다.

  public function data(Request $request)
    {
      $temp = $request->file('excelFile')->store('temp');
      $path = storage_path('app').'/'.$temp;
      $request['excel'] = Excel::toArray(new CgsUserPointImport, $path)[0];
      // storage_path없이 바로 getRealPath를 사용하면 Collection 또는 array방법으로 불러올 수 없게 된다.
     // 접근할 수 없는 위치? 라서 그런가.
     // 따라서 사용자가 직접 임의의 위치로 옮겨주어야 Collection / array로 가져올 수 있다.

저 코드 중에는 CgsUserPointImport 라는 곳에 접근해서 toArray 되있다.
내부에는 이렇게 간단하게 작성해주면 된다.

    public function array(array $array)
    {
      
        // 엑셀파일 정보가 들어오면 그걸 그대로 다시 반환해주는걸 의미한다.
    	return $array;
    }

    public function headingRow(): int
    {
        return 1;
        // 나는 첫 번째 행에 있는 id 값이 필요했기 때문에 1이라고 썼다. 만약 머릿글이 1행이 아닌 다른 위치라면 return 값을 수정하면 된다.
    }
}

그럼 업로드된 엑셀 파일의 데이터를 출력해보는 과정을 살펴본다.

$request['excel'] = Excel::toArray(new CgsUserPointImport, $path)[0];

위에선 $request['excel'] 이라는 배열로 엑셀 데이터를 받고 있다. 코드 뒤에 0번 인덱스를 붙인 것은 엑셀의 행이 반복되버리는데 이걸 떼면 id를 찾을 수 없다는 에러가 계속 발생했다.

엑셀에서 데이터를 추출할 때 주의점은 엑셀의 머릿글이 반드시 영어로 되있어야 가져올 수 있다. id, name, gg, dd가 만약 한글이면 제대로 가져오지 못한다.

이제 $request['excel'] 의 내용을 디버그해보면 아래 사진 처럼 배열을 볼 수 있다.


이렇게 id값이 들어왔다.

다만 내가 필요한 내용은 id값 뿐이므로 이것을 추출하는 과정이 필요하다.

foreach ($request['excel'] as $val) {
                $excelArr[] = $val['id'];
        }
$request['excelId'] = $excelArr;

foreach를 돌려서 $request['excelId'] 에 추출한 id값만 저장되도록 했다.
즉, 2차배열로 되있는 자료를 1차배열로 바꾸었기 때문에 앞으로 이 id값을 가지고 데이터를 가공하기가 더 수월해진다.

이제 이 id로 쿼리문을 조회하는 것은 2부에서 계속...

profile
florentyoon의 IT 세상

0개의 댓글