composer 설치 없이 PhpSpreadsheet 적용기
📜

composer 설치 없이 PhpSpreadsheet 적용기

Tags
php
PhpSpreadsheet
Published
Published November 17, 2024
Tweet
Slug
결론부터 말하자면 composer 로 로컬에서 설치 후, 해당되는 vendor 폴더를 ftp로 해당하는 경로에 업로드 했다. 😂 (이걸 해결하기까지 무려 5시간과 db조회해서 다운받기까지 약 4시간 이라는 엄청난 노오력이..)
 
아무튼 지금부터 차근차근 기록을 시작해보도록 하겠다.
 

 
처음에 PHPExcel 을 적용하려고 했었다. 그런데, 공식 github 에 들어가보니
archive 됐다는 메세지와 함께 2017년 이미 지원이 종료되었고, 최종적으로 2019년 archive 되었다고 한다.
 
공식문서를 보면 알 수 있듯이, PhpSpreadsheet 를 사용하라고 강력하게 권고하고 있다.
notion image
notion image
 

PhpSpreadsheet 다운로드

현재 내가 적용한 php 버전은 8.2대 버전이다.
PhpSpreadsheet 공식 홈페이지 에 아래와 같이 최신버전 사용을 위한 최소버전요건을 충족했고, 계속 지원을 할거라는 반가운 글이 보인다!
 
해당 홈페이지에서 엑셀기능관련 여러가지 활용할 수 있는 것들이 많아 보이는데, 다음에 엑셀 기능 관련 개발 시 해당부분을 다뤄보도록 하겠다.
notion image
 
공식 github 에서 아래와 같이 3.4.0 버전을 압축파일로 다운로드 받았다.
notion image
 

composer를 사용한 듯 아닌듯 한 vendor 폴더 생성

(이제부터 엄청난 시간을 쏟아부어 오롯이 피부로 느낀 경험담이 시작됩니다 ㅠ.ㅠ)
처음에는 압축파일만 다운로드 받고 ftp 에 업로드하여 왜 안되지 하며 엄청난 시간을 보내버렸다.
 
여러가지 검색 끝에 결국에 여러가지 의존성 설치 문제로 composer 로 설치할 것을 추천하고 있으나,
외부 호스팅 서비스를 이용하는 관계로 서버에 설치를 할 수 없는 난관이 있었다!
 
로컬에서 composer로 설치 후, 생성된 vendor 폴더와 압축해제한 폴더를 ftp 에 업로드했다. (몇 시간의 시간 투자가 이렇게 간단히 한줄로 서술되다니…)
vendor 폴더는 PhpSpreadsheet 하위 경로에 두었다.
notion image
 
상단에 vendor > autoload.php 와 PhpSpreadsheet 를 사용할 것을 명시해준다.
notion image
require _MODULE_URL . '/PhpSpreadsheet/vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 

엑셀다운로드 함수 로직 작성

그 이후, 각자 상황에 맞게 다운로드 함수 로직을 작성한다.
(아래는 내가 작성한 기본적인 로직이다.)
public function downloadExcel($downArea, $selectedIds, $board_code) { $boardTitleResult = $this->objDBH->query("select title from board where code = $board_code"); if (!$boardTitleResult) { die("게시판 제목 조회 실패: " . $this->objDBH->error); } $boardTitleRow = $boardTitleResult->fetch_assoc(); $setTitle = $boardTitleRow['title']; if ($downArea == 'selected') { // 선택된 ID들을 쉼표로 구분된 문자열로 변환 $selectedIds = json_decode(stripslashes($selectedIds), true); $ids = implode(',', array_map('intval', $selectedIds)); $result = $this->objDBH->query("select * from board_data where code in ($ids) and board_code = $board_code"); } else if ($downArea == 'all') { $result = $this->objDBH->query("select * from board_data where board_code = $board_code"); } else { die("잘못된 접근입니다."); } if (!$result) { die("데이터 조회 실패: " . $this->objDBH->error); } $column_cnt = $result->field_count; $column_name = array(); while ($field = $result->fetch_field()) { $column_name[] = $field->name; } $spreadsheet = new Spreadsheet(); $excel = $spreadsheet->getActiveSheet(); $excel->setTitle($setTitle); for ($i = 1, $a = 'A'; $i <= $column_cnt; $i++, $a++) { $excel->setCellValue($a . '1', $column_name[$i - 1]); } $data = $result->fetch_all(MYSQLI_ASSOC); foreach ($data as $key => $value) { $num = $key + 1; $key = $key + 2; for ($i = 1, $a = 'A'; $i <= $column_cnt; $i++, $a++) { $excel->setCellValue($a . $key, $value[$column_name[$i - 1]]); } } $downDate = date('Y-m-d'); $writer = new Xlsx($spreadsheet); $file_name = $setTitle . '_' . $downDate . '.xlsx'; $writer->save($file_name); header("Content-Type: application/vnd.ms-excel"); header('Content-Disposition: attachment; filename="' . basename($file_name) . '"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file_name)); flush(); readfile($file_name); unlink($file_name); // 엑셀다운 받아지면 파일 삭제 exit; }
 
적절한 화면에 다운로드 버튼을 넣은 후, 다운로드 받으면 아래와 같이 잘 받아지고 파일도 잘 열린다!
notion image

댓글

guest