PHP에서 Excel 파일을 만들 수 있는 PHPExcel
가끔 홈페이지나 쇼핑몰을 개발하다 보면 DB에 저장된 데이트를 EXCEL(이하 엑셀)파일로 다운로드 해야할 경우가 생긴다. 이전까지는 html table 태그를 이용해서 엑셀 파일을 생성하는 방법을 사용했지만 Excel 2007에서는 이럴 경우 파일 형식이 받지 않는다며 경고창을 띠운다. 잘 모르는 사람들은 파일 깨졌다고 오해를 하기도 하는데.. 그래서 이번에 작업을 하면서 정상적인 엑셀 파일을 만들 수 있는 방법이 없을까 검색하다 PHPExcel이라는 멋진 것을 찾아
작업을 완료했다. 어제까지만 해도 귀찮아서 table 태그를 사용했는데.. 오늘은 왠지 이걸 한번 해보고 싶었다는.. ^^;
한가지 주의할 것은 아래 요구사항을 만족해야만 PHPExcel를 사용할 수 있다.
* PHP version 5.2.0 or higher
* PHP extension php_zip enabled *)
* PHP extension php_xml enabled
* PHP extension php_gd2 enabled (if not compiled in)
우선 PHPExcel 사이틀 방문해서 Class 파일을 다운로드 한다. 홈페이지 오른쪽 상단부분에 DOWNLOAD 버튼이 존재한다. 설치법은 다운로드 받은 파일의 압축을 푼 후 Classes 폴더를 계정의 적당한 위치에 업로드 하는 것이다. Classes 폴더를 업로드 하는 것으로 PHPExcel의 사용을 위한 준비는 끝났다. 이제 엑셀파일을 만드는 페이지를 만들면 된다. 아래는 간단한 PHP코드로 이것을 적당히 수정해서 사용하면 될 것이다. 코드는 많이 허접하다는.. ^^;
<?php
// DB 접속 부분은 생략
$sql = " SELECT * FROM license_table order by order asc ";
$result = mysql_query($sql);
$cnt = @mysql_num_rows($result);
if (!$cnt) {
alert("출력할 내역이 없습니다.");
}
/** PHPExcel */
require_once("../Classes/PHPExcel.php");
/* PHPExcel.php 파일의 경로를 정확하게 지정해준다. */
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set properties
// Excel 문서 속성을 지정해주는 부분이다. 적당히 수정하면 된다.
$objPHPExcel->getProperties()->setCreator("작성자")
->setLastModifiedBy("최종수정자")
->setTitle("자격증시험응시리스트")
->setSubject("자격증시험응시리스트")
->setDescription("자격증시험응시리스트")
->setKeywords("자격증 시험")
->setCategory("License");
// Add some data
// Excel 파일의 각 셀의 타이틀을 정해준다.
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue("A1", "차수")
->setCellValue("B1", "응시자")
->setCellValue("C1", "수험번호")
->setCellValue("D1", "상호")
->setCellValue("E1", "전화번호")
->setCellValue("F1", "휴대폰번호")
->setCellValue("G1", "사업장주소")
->setCellValue("H1", "시험장소")
->setCellValue("I1", "응시료")
->setCellValue("J1", "상태")
->setCellValue("K1", "자격증번호")
->setCellValue("L1", "발급일");
// for 문을 이용해 DB에서 가져온 데이터를 순차적으로 입력한다.
// 변수 i의 값은 2부터 시작하도록 해야한다.
for ($i=2; $row=mysql_fetch_array($result); $i++)
{
// Add some data
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue("A$i", "$row[order]")
->setCellValue("B$i", "$row[name]")
->setCellValue("C$i", "$row[slate_no]")
->setCellValue("D$i", "$row[biz_name]")
->setCellValue("E$i", "$row[tel]")
->setCellValue("F$i", "$row[hp]")
->setCellValue("G$i", "$row[address]")
->setCellValue("H$i", "$row[site]")
->setCellValue("I$i", "$row[invoice]")
->setCellValue("J$i", "$row[status]")
->setCellValue("K$i", "$row[license]")
->setCellValue("L$i", "$row[license_date]");
}
// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle("응시리스트");
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// 파일의 저장형식이 utf-8일 경우 한글파일 이름은 깨지므로 euc-kr로 변환해준다.
$filename = iconv("UTF-8", "EUC-KR", "자격증시험응시리스트");
// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $filename . '.xls"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
?>
이외에도 PHPExcel의 다양한 기능은 압축 파일에 포함된 예제 php 파일을 통해서 확인할 수 있다.
이런건 좀 씨발 해보고 올렸으면 좋겠다 되기는 씨발개뿔 액셀에서 열리지도 않는다 병신아
설마 해보지도 않고 올렸겠습니까?
제대로 코드를 작성해보시고 욕이라도 하시죠..
머… 이런 무개념이 다 있지? 너 같은 놈들이 무책임하게 개발해서 주위 사람들한테 피해주는거야. 고마운줄은 모르고 진짜
머 이런 거지깽깽이 같은게..
되고 안되고를 떠나서 이정도까지 해주셨으면 나머진 이걸 응용해서 자기가 필요한걸 만드는게 당연한게 아닌가?
갖다 쓸수있게 이정도 만들어주셨으면 그것만으로도 충분히 감사하거늘..
이걸 갖다쓸줄도 모르면서 욕지거리부터 하는 꼬라지 하고는..ㅉㅉ
암튼 쥔장님~ 이번에 PHPEXCEL은 처음 써보는데 자료찾다가 여기까지 왔네요. 좋은정보 감사합니다.
별 미친놈이 다 있네요 ㅋㅋ
다 잘됩니다. 무턱대고 욕이라니. 터무니 없는 당신 실력을 먼저 탓하시지
일에 임하는 태도가 그모양이니 실력도 그모양이지
니가 낸 결과는 너랑 닮아 제기능을 못하는게 전혀 이상하지 않다
너가 하는건 다 안된다 그게 정상인줄 알고 살아라
이런건 좀 씨발 해보고 댓글 쳐달았으면 좋겠다 안되기는 씨발개뿔 액셀에서 잘만열린다 병신아
아~ 기가 차서
국정농단, 세월호 때도 댓글 안달았는데..
프로그램이라는게 어느 환경에서나 복사 / 붙여넣기 해서 구동될거면
프로그래머라는 직업이 왜 필요한가요..
안되면 왜 안되는지 질문을 올리던가 이리저리 해보고 성공하면 그에 대한 노하우를 올려서
서로 품앗이 하면서 발전하는거지..
참고로 전 잘되서 저사람의 의도를 이해 못하겠습니다.
담아갑니다~~~
방문해 주셔서 감사합니다.
덕분에 여러가지를 알게 되었습니다. 그런데 혹시 엑셀2003 버전으로 저장하는 라이브러리는 모르시나요? ^^; 회사에서 오피스 2003을 쓰고 있어서 2007로 저장하니 조금 불안합니다.
블로그 방문해 주셔서 감사합니다.
말씀하신 내용에 대해서요.. 제가 작성한 코드는 2003으로 저장하는
코드입니다.
PHPExcel 문서를 보시면 2003과 2007을 선택할 수 있는 방법이 나와있습니다.
아 Excel5가 버전인가보군요. 감사합니다!
아.. 잘 안되는게 있어서 염치불구하고 질문드립니다. 사실 PHP는 이제 막 걸음마단계라서 잘 모르는데요. 전에 ASP를 했던 경험으로 엑셀 파일을 쓰는 부분까지는 만들었고 원하는대로 데이터가 잘 저장됩니다만, header() 부분을 첨부해서 브라우저에서 파일을 다운받으면 무조건 깨지네요. 혹시 이 관련해서 도와주실 수 있을까요?
환경은 다음과 같습니다.
서버: 윈도우 서버 2003
SQL: MSSQL 2005
PHP: 5.3.10
아.. 이거참 민망하게;;
해결되었습니다. 기존 페이지를 수정하는 과정에서 불필요한 코드가 남아있었는데 그게 문제를 일으켰나보네요. 여튼 좋은 정보 다시한번 감사드립니다.
잘 해결되셨다니 다행입니다. 좋은 하루 되세요.. ^^
자료 감사합니다….
하나만 질문드리고 싶은게 있는데요 엑셀로 추출했을때 한글만 아무것도 나오지가 않네요
이부분을 아시면 알려주셨으면 합니다. 부탁드립니다…
블로그 방문해 주셔서 감사합니다.
엑셀 파일로 추출을 했는데 한글만 나오지 않는 것은 아마도
캐릭터셋의 문제가 아닐까 의심이 됩니다. DB와 PHP 파일의 캐릭터셋이
일치하지 않으면 한글의 경우 깨지게 되는데 이 부분을 확인해 보시기 바랍니다.
한글은 100% iconv(“EUC-KR”, “UTF-8”, “한글문자”) 함수를 쓰셔야 나옵니다.
드뎌 성공했네요 ㅋㅋㅋ
유용한 정보 알려주셔서 정말 감사합니다…
성공하셨다니 다행입니다. 좋은 하루되세요. ^^
위 소스보고 잘 만들었습니다 ^^
한글도 잘 되고요 ^^
->setCellValue(“L$i”, “발급일”);
이렇게 해도 잘 됩니다 ^^ 그냥 바로 됩니다
그런데
setCreator(“작성자”) 부분은 아무리해도 한글이 깨지네요 ^^;;
setCreator(iconv(‘UTF-8′,’EUC-KR’,’안녕’)); 혹 방법이 있을까요?
블로그 방문해 주셔서 감사합니다.
한글 사용에 문제가 없으시군요. 근데 setCreator 부분은 딱히 한글이 깨질 이유는 없는 것 같은데요..
나중에 기회가 되면 다시 한번 살펴봐야 할 것 같습니다.
너무감사합니다!
경로설정하는 부분이랑 한글 변환부분만 신경써주면될거같네요
저는 저장형식이 utf-8로 했기에 그대로뒀구
CI 프레임워크를 사용해가지구 경로설정부분에서
require_once APPPATH."third_party/PHPExcel/Classes/PHPExcel.php";
이런식으로 했네요~ 안되시는분들 참고하셔서 수정하시면 될거같아용
좋은정보 감사합니다
블로그 방문해주셔서 감사드리구요.. 유용한 정보도 알려주셔서 고맙습니다.
감사합니다. 잘봤습니다.
그런데 한가지 궁금한게 있는데요.
위의 소스를 그대로 사용하는데
header파일 오류가 나거든요..
왜 그런지 이유를 모르겠어서요…
사용하는 곳은 킴스큐 이고 모듈에서 사용하려고 하거든요…
제가 초보라 전혀 모르겠습니다.
좀 가르쳐 주시면 감사~
블로그 방문해 주셔서 감사합니다.
블로그 데이터를 이전하면서 따옴표 부분 등이 제대로 표현되지 않았습니다.
다시 코드를 수정했으니 다시 한번 해보시기 바랍니다.
Warning: Cannot modify header information – headers already sent by (output started at D:\WORKSPACE\lms\index.php:111) in D:\WORKSPACE\lms\pages\menu0094.php on line 70
Warning: Cannot modify header information – headers already sent by (output started at D:\WORKSPACE\lms\index.php:111) in D:\WORKSPACE\lms\pages\menu0094.php on line 71
Warning: Cannot modify header information – headers already sent by (output started at D:\WORKSPACE\lms\index.php:111) in D:\WORKSPACE\lms\pages\menu0094.php on line 72
따옴표하고 쌍따옴표는 맞게 수정했구요.. db도 환경에 맞게 수정했습니다.
그런데 여기에서 안넘어 갑니다.
위에 있는 소스를 그대로 복사해서 넣었기 때문에 뭐 큰 이상은 없으리라 생각하지만 뭔가가 작지만 큰게 빠진거 같습니다. ㅠ
위의 코드가 실행되기 전에 header 정보가 이미 전송된 것으로 보입니다.
위으 코드를 다른 파일에 추가하는 것이 아닌 단일 파일로 만드셔서 테스트해보시기 바랍니다.
귀찮게 해서 죄송한데요..
index.php에서 header파일을 사용했습니다.
그래서 그런가요? 메시지에도 index.php:111이런 메시지 나온게 관련있어보입니다.
현재 모듈로 index에서 레이아웃이 되 있어서 그 영향으로 에러가 나오는건지 궁금합니다.
단일파일로 만들어서 테스트 해보면 실행이 됩니다. 그런데 메뉴와 연결하고 페이지 만들어서 하면 index 에서 사용해서 그런지 계속 에러나 나옵니다.
사용법을 잘 모르니 계속 헤매고 있어요. ㅠ 답변좀…
아 그리고 아래와 같이 글자가 깨지는것은 왜 그런가요..
����������������������������������������������������Oh��+’��0 PX����� � 자격증시험응시리스트 자격증시험응시리스트작성자 자격증시험응시리스트최종수정자@�_yh)��@�_yh)�� � ��B�=�%r8X”1��Calibri��� � ��� � ��� � ��� � ��� � ��� � ��� � ��� � ��� �
귀찮게 해드려 다시 한번 죄송합니다. ~~
위의 코드를 사용해 엑셀 파일을 다운로드 하기 위해서는 이를 처리하는 파일에
html tag 등의 다른 코드는 없어야 할 겁니다. 다른 코드가 들어가 있으면
한글이 깨지는 등의 문제 발생하는 걸로 알고 있습니다.
index.php 파일에서 링크를 하나 추가해서 다운로드 파일을 링크하는 등의
방법으로 다운로드 파일을 실행시키는 게 좋을 것 같습니다.
답변 감사합니다. ^^
하던중 시트를 추가해야 할 일이 생겼는데
시트추가는 어떻게 하는지 알고 계신가요?
아신다면 가르쳐 주시면 감사하겠습니다. ~~
아쉽게도 저 역시 시트 추가는 해본적이 없습니다.
공식 사이트에 방문하셔서 문서를 찾아보셔야할 것 같습니다.
다른 분의 질문에 대해 문서를 보다보니 시트를 추가할 수 있는 방법이 있는 듯 합니다.
https://github.com/PHPOffice/PHPExcel/blob/develop/Documentation/markdown/Overview/06-Worksheets.md
아오 답답한 양반아 좀 알아서좀 해라
감사합니다. 잘사용하고 있습니다.
한가지 궁금한건 숫자형이 아닌 다 TEXT 형으로 셀서식을 만들순 없나요 ? 찾아보다가 몰라서 다시 여쭤 봅니다.
공식사이트의 문서를 보니 타입을 지정할 수 있는 것으로 보입니다.
https://github.com/PHPOffice/PHPExcel/blob/develop/Documentation/markdown/Overview/07-Accessing-Cells.md#setting-a-number-with-leading-zeroes
직접 해본 것은 아니기 때문에 추가적인 답변을 드리는 것은 어려울 듯 합니다.
고맙습니다. 참고 할께요
와! 정말 간편하고 쉽게 잘되는군요. 감사합니다.
그런데 파일하나에 여러시트를 만들려면 어떻게 해야 할까요? 고민은 하고 검색도 해보고는 있는데 딱히~ 아직까지는 모르겠네요 ㅎㅎ
이 포스트 댓글 중 http://chicpro.dev/7254/comment-page-2#comment-7216 에 링크된
문서를 참고하시기 바랍니다. 시트 추가는 직접 해본 것이 아니기 때문에 답변드리기가 어렵습니다.