PHP & JavaScript 엑셀 파일 다운로드 및 업로드 구현 (PhpSpreadsheet 사용)
- Link
- https://junuda.com/php-javascript-%ec%97%91%ec%85%80-%eb%8b%a4%ec%9a%b4%eb%a1%9c%eb%93%9c-%eb%b0%8f-%ec%97%85%eb%a1%9c%eb%93%9c-%ea%b5%ac%ed%98%84-phpspreadsheet-%ec%82%ac%ec%9a%a9/1
- https://github.com/PHPOffice/PhpSpreadsheet/tree/master/samples2
PHP 환경에서 엑셀 파일을 다뤄야 할 때, 보통 PHPExcel을 많이 사용하는데 이는 이미 서비스가 2019년에 종료되었으며 공식 문서도 PhpSpreadsheet를 권고한다고 명시되어있다. (현재 PhpSpreadsheet는 PHP 8 이상부터 지원되므로 참고)
PhpSpreadsheet를 사용한 간단한 목록의 엑셀 파일 다운로드 및 업로드(후 데이터 수정) 기능을 구현하는 코드에 대하여 설명하겠다.
1. PhpSpreadsheet 설치
웹 서버에 PhpSpreadsheet를 사용하는 데 필요한 PHP 확장 모듈들이 설치되어 있는지 php-m으로 확인하고 설치한다. 확장 모듈은 xml, gd, mbstring, zip이 필요하다. 설치가 완료되었다면 php-m으로 확장 모듈들의 설치 여부를 한 번 더 확인한다.
PhpSpreadsheet를 설치하는 데 필요한 PHP 의존성 관리 도구 Composer를 설치한다. 설치가 완료되었다면 composer-V로 Composer의 설치 여부를 확인한다.
PHP 확장 모듈 및 Composer 설치가 완료되었다면 PhpSpreadsheet를 사용할 디렉터리에 PhpSpreadsheet를 설치한다.
2. jQuery 스크립트 태그 추가
파일 최상단 또는 Head 파일에 다음과 같이 작성하여 jQuery를 사용하기 위해 추가한다.
3. 목록 및 엑셀 다운로드, 업로드 폼 작성
설명을 위해 목록은 페이징 없이 간단하게 작성했다. 목록들을 체크 박스로 선택한 후 엑셀 다운로드 버튼을 클릭하면 해당 목록들이 포함된 엑셀 파일 다운로드가 가능하도록 구현한다.
엑셀 업로드 버튼을 클릭하면 업로드 폼을 띄우고 다운로드 받았던 엑셀 파일의 기타 정보를 입력한 후 엑셀 파일을 업로드하여 폼의 등록 버튼을 클릭하면 입력한 데이터로 기타 정보가 수정되도록 구현한다.
4. 동작 구현 파일 작성
체크 박스로 목록들을 선택한 후 엑셀 다운로드를 클릭하면 선택한 목록들의 키값들을 임의의 폼을 생성해 전송하고 선택한 목록이 없으면 예외 처리한다.
엑셀 업로드 버튼을 클릭하면 업로드 폼을 띄우고 엑셀 파일을 업로드 한 후 폼의 등록 버튼을 클릭하여 엑셀 데이터를 전송한다.
체크 박스, 엑셀 업로드 버튼과 폼이 동작하는지 확인한다.
5. 엑셀 다운로드 처리 파일 작성
설치한 PhpSpreadsheet를 사용하기 위해 PhpSpreadsheet를 불러오는 코드를 최상단에 추가한다. 첫 행에는 컬럼명이 출력되도록 설정하고 나머지 열의 크기, 색상, 정렬을 보기 편하게 설정한다. 마지막으로 엑셀 파일 이름에 날짜를 붙여 저장되도록 구현한다.
엑셀이 잘 다운로드 되는지 확인한다.
6. 엑셀 업로드 처리 파일 작성
다운로드 처리 파일과 같이 PhpSpreadsheet를 불러오는 코드를 최상단에 추가한다. DB의 기타 정보 데이터를 수정하기 위한 함수를 작성하고 발생할 수 있는 에러를 예외 처리한다.
파일을 임시 저장 폴더에 저장하고 PhpSpreadsheet Reader로 저장된 엑셀 파일을 읽는다. 첫 번째 행에는 컬럼명이 출력되어 있으므로 A열 2행부터 데이터를 불러와서 A열(키 값), G열(기타 정보) 데이터를 데이터 수정 함수로 전송한다. 수정 함수가 정상적으로 작동하면 알림 메시지를 띄우고 목록 페이지로 돌아간다.
autoload.php 부터 읽어오고 이후 namespace 선언하면 class를 바로 사용할 수 있다.
$spreadsheet->getSheet(0) 하면 맨 처음 시트를 가져온다. n번째 시트를 읽도록 지정 가능.
$spreadsheet->getActiveSheet() 하면 저장하기 전 활성화 된 시트 읽기
엑셀의 기타 정보를 입력하고 업로드했을 때 데이터 수정이 잘 되는지 확인한다.