💻 쇼핑몰 자동화 & 웹 개발 가이드

[PHP 입문] 엑셀 파일 처리: 읽기, 쓰기, 업로드까지

rhandy 2025. 4. 21. 07:10
728x90

사용자 업로드 파일 처리, 데이터 다운로드 자동화, 실무에서는 결국 "엑셀"입니다. PHP로 엑셀을 다루는 방법, 지금 완벽하게 배워보세요.

안녕하세요! 저는 처음 PHP로 웹 백오피스를 만들면서 가장 많이 들은 요청이 "엑셀로 다운되게 해주세요", "엑셀 업로드 되나요?"였어요. 엑셀은 여전히 실무의 언어예요. 데이터 전달, 관리, 보고서까지 다 엑셀로 처리하죠. 이 글에서는 PHP로 엑셀을 읽고, 쓰고, 업로드 파일을 처리하는 가장 실용적인 방법들을 알려드릴게요. 특히 PhpSpreadsheet라는 강력한 라이브러리를 중심으로 진행하며, 실습 코드까지 바로 따라 하실 수 있게 구성했습니다. 엑셀 작업, 이제 두렵지 않게 만들어드릴게요!

1. PhpSpreadsheet 소개와 설치 방법

PhpSpreadsheet는 PHP에서 엑셀(xlsx, xls), CSV 등 스프레드시트를 쉽게 읽고 쓰게 해주는 오픈소스 라이브러리입니다. 기존 PHPExcel의 후속 프로젝트로 안정성도 높고, 실무에서 가장 많이 사용돼요.

설치는 Composer 명령어 한 줄이면 끝!

composer require phpoffice/phpspreadsheet

설치 후에는 오토로딩으로 바로 클래스 사용이 가능하며, 엑셀 읽기/쓰기/스타일 지정까지 모두 지원합니다. 대용량 처리나 템플릿 기능도 포함돼 있어요.

2. 엑셀 파일 읽기: 업로드 후 데이터 파싱

사용자가 업로드한 엑셀 파일을 읽어서 데이터베이스에 저장하거나, 화면에 미리보기로 보여주는 작업은 정말 흔하죠. 아래는 업로드된 .xlsx 파일을 읽어 배열로 파싱하는 기본 예제입니다.

기능 설명
IOFactory 사용 파일 유형에 맞춰 Reader 자동 적용
Worksheet 접근 getActiveSheet()로 시트 접근
rowIterator 한 줄씩 반복하며 값 추출
use PhpOffice\PhpSpreadsheet\IOFactory;

$spreadsheet = IOFactory::load($_FILES['excel']['tmp_name']);
$sheet = $spreadsheet->getActiveSheet();

$data = [];
foreach ($sheet->getRowIterator() as $row) {
  $cells = [];
  foreach ($row->getCellIterator() as $cell) {
    $cells[] = $cell->getValue();
  }
  $data[] = $cells;
}

print_r($data); // 배열로 출력

이 코드는 실제로 관리자 페이지의 엑셀 업로드 기능에 그대로 적용 가능해요. 첫 번째 줄은 헤더로 쓰고, 2번째 줄부터는 데이터로 사용하면 실무에 딱입니다.

3. 엑셀 다운로드 파일 생성하기

이제 반대로 서버 데이터를 엑셀로 만들어 사용자가 다운로드하게 해봅시다. 보고서, 검색결과 엑셀 추출 등에서 자주 쓰이죠.

  • Spreadsheet 객체 생성
  • getActiveSheet()에 값 쓰기
  • Writer로 HTTP 응답에 출력
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

$sheet->setCellValue('A1', '이름');
$sheet->setCellValue('B1', '이메일');
$sheet->setCellValue('A2', '홍길동');
$sheet->setCellValue('B2', 'hong@example.com');

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="users.xlsx"');
header('Cache-Control: max-age=0');

$writer = new Xlsx($spreadsheet);
$writer->save('php://output');

이제 버튼 하나로 엑셀 다운로드 완성! 이후 스타일, 테두리, 병합 등 고급 설정도 추가 가능합니다.

 

4. 셀 서식, 너비, 스타일 적용

엑셀은 단순한 데이터만으로는 부족하죠. 헤더를 굵게, 배경을 칠하고, 열 너비도 자동 맞춤해야 진짜 실무 엑셀이 됩니다. PhpSpreadsheet에서는 getStyle() 메서드와 배열 기반 스타일 지정으로 쉽게 적용할 수 있어요.

$sheet->getStyle('A1:B1')->getFont()->setBold(true);
$sheet->getStyle('A1:B1')->getFill()->setFillType('solid')
      ->getStartColor()->setRGB('F3E5F5');

$sheet->getColumnDimension('A')->setAutoSize(true);
$sheet->getColumnDimension('B')->setWidth(30);
  • Bold, 배경색: 헤더 강조
  • 열 너비 조정: 자동 혹은 고정 너비 지정
  • 테두리: getBorders()로 적용 가능

레이아웃이 예쁜 엑셀은 보고서로 바로 제출해도 손색없습니다. 실무에선 이런 시각적 포인트가 신뢰를 높여요!

5. 엑셀 업로드 시 자주 생기는 오류와 대처법

사용자가 엑셀을 업로드할 때 종종 오류가 발생합니다. 형식이 틀리거나, 잘못된 확장자, 빈 셀, 인코딩 오류 등등. 다음은 자주 발생하는 오류와 해결 방법을 정리한 표입니다.

문제 상황 해결 방법
CSV 업로드 시 한글 깨짐 iconv("euc-kr", "utf-8", $line)으로 변환
확장자만 xlsx이고 실제는 아닌 경우 try-catch로 Reader 오류 잡기
빈 행 포함되어 배열 길이 다름 if (empty(trim($cell->getValue()))) continue;
파일 용량 초과 업로드 실패 php.ini에서 upload_max_filesize 조정

업로드 기능은 유저 경험에 큰 영향을 미치는 부분이에요. 오류 메시지를 친절하게 제공하면 실수도 줄고, 만족도는 올라갑니다.

6. 실무 엑셀 처리 포인트 요약

  • PhpSpreadsheet로 xlsx, csv 모두 대응 가능
  • 엑셀 업로드 시 확장자뿐 아니라 MIME 체크
  • 스타일과 서식을 추가하면 퀄리티 상승
  • 대량 데이터 처리 시 StreamWriter 고려
  • 예외 처리: try-catch, if empty로 안정성 확보

엑셀 처리는 단순 기능이 아닌, 전체 서비스의 신뢰도를 높이는 중요한 기능입니다. 백오피스, 관리자, 통계 페이지에 꼭 필요한 역량이에요!

Q PhpSpreadsheet은 PHPExcel보다 뭐가 더 좋나요?

PHPExcel은 더 이상 유지되지 않는 구버전입니다. PhpSpreadsheet은 더 가볍고 빠르며, 최신 PHP 버전과 Composer 환경에 최적화되어 있어요. 유지보수와 커뮤니티도 훨씬 활발합니다.

A PhpSpreadsheet은 PHPExcel의 완전한 업그레이드 버전이에요!
Q 사용자 업로드 엑셀에서 빈 줄이 섞여있어요. 어떻게 처리하나요?

trim($cell->getValue()) 또는 if (!array_filter($rowData)) continue; 같은 조건으로 빈 줄을 필터링할 수 있어요. 완전히 빈 행은 건너뛰는 게 좋아요.

A array_filtertrim으로 빈 줄을 건너뛰세요!
Q 다운로드되는 엑셀에 자동으로 열 너비 맞추는 법은?

$sheet->getColumnDimension('A')->setAutoSize(true);처럼 각 열마다 setAutoSize(true)를 적용하면 내용에 맞게 자동 너비가 조정됩니다.

A 열마다 setAutoSize(true) 적용하면 자동 너비 됩니다!
Q xls 형식도 지원하나요? 꼭 xlsx여야 하나요?

PhpSpreadsheet은 xlsx뿐 아니라 xls, ods, csv 등 다양한 포맷을 지원합니다. 단, xlsx가 속도와 호환성 면에서 가장 추천되는 표준이에요.

A xls도 가능하지만, xlsx가 실무에서는 더 안전하고 효율적입니다!
Q 엑셀 다운로드가 브라우저에서 열리지 않고 깨져요.

헤더 설정이 잘못됐을 가능성이 높습니다. Content-Type, Content-Disposition, Cache-Control을 정확히 설정했는지 확인하고, php://output 외에 출력이 있으면 안 됩니다.

A 출력 전에 반드시 echo나 공백 없이 헤더부터 정확히 보내세요!

 

처음엔 엑셀 파일을 웹에서 처리하는 게 어렵게만 느껴졌어요. 특히 업로드된 파일을 읽고 저장하거나, 다운로드 버튼을 눌렀을 때 바로 예쁘게 포맷된 엑셀이 내려오게 만드는 건 꽤 까다로워 보였죠. 그런데 PhpSpreadsheet을 만나고 나서 정말 많은 게 쉬워졌어요. 간단한 설치만으로 엑셀 읽고 쓰고, 서식 지정까지 모두 해결되니까요. 실무에서 엑셀은 단순 기능이 아니라 커뮤니케이션 도구예요. 이 글을 통해 PHP에서도 엑셀을 자유자재로 다룰 수 있는 자신감을 가지셨으면 좋겠어요. 천천히 따라 하고, 꼭 한 번 직접 다운·업로드 테스트해보세요!

728x90