반응형
PHP 에서 Excel Download 방법은 몇가지가 있다.
머 JSP 도 그리 차이는 없지만 젤 편한 방법이 MIME TYPE을 변경하는 일이다.
[1] MIME TYPE 변경방법
header("Content-type: application/vnd.ms-excel; charset=UTF-8"); |
위와 같이 vnc.ms-excel MIME Type 을 사용하여 변경하는 방법 이 있지만, office 2007이 나온 뒤로는 그닥 좋은 방법으로 평가받지 못하는 것이 현실이다. 그 이유는 매번 파일을 열때마다 아래 그림과 같은 에러가 발생하기 때문이다.
==> 에러 그림
이런 이유로 이번 회사에서 사내 프로젝트시 excel file 제작은 인터넷을 검색하던중 MS-Excel Stream Handler 모듈을 발견하게 되었다.
[2] MS-Excel Stream Handler Module 다운로드 방법
예제 모듈 다운로드 사이트 : http://www.phpclasses.org/package/1919-PHP-Stream-wrapper-to-read-and-write-MS-Excel-files.html
위 예제 사이트에 들어가서 회원가입 후 로그인 하면 MS 예제 파일을 다운받을 수 있다.
예제 파일은 현재 한글 처리가 안되어있을 뿐더라 header값에 값이 잘못 설정되어있다.
[ 다운받은 원본 ]
require_once "excel.php"; $export_file = "xlsfile://tmp/example.xls"; header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header ("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); header ("Cache-Control: no-cache, must-revalidate"); header ("Pragma: no-cache"); header ("Content-type: application/x-msexcel"); header ("Content-Disposition: attachment; filename=\"" . basename($export_file) . "\"" ); header ("Content-Description: PHP/INTERBASE Generated Data" ); readfile($export_file); exit; |
header ("Cache-Control: no-cache, must-revalidate"); ==> 요기 부분이 문제의 line이다.
테스트 결과 firefox 와 크롬에서는 다운로드가 잘되는데 IE에서는 경로를 못찾는 문제가 생긴다.
그래서 저부분을 php.net에 있는 내용데로 바꾸어주었다.
header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
저부분이 왜 저렇게 돼는지는 아직 원인을 모른다. 그래서 위키디피아에 검색해 보니 이런 글이 있다.
IE에서는 Cache-Control:no-cache로 응답이 온 경우 local cache에 리소스를 저장하지 않으므로 해당 resource는 항상 일반 Request(Condtional-GET 하지 않음)로 요청하게 된다. 하지만 Firefox에서는 Cache-control:no-cache인 경우에도 page navigation(back/forward)를 위해 local cache에 저장한다. 이 경우 저장시에 브라우저가 만기일을 1970-01-01 09:00:00로 설정하며, 응답 헤더에 Last-Modified나 Etag가 존재할 경우에는 Condtional-GET이 발생하며, 없을 경우에는 일반 request를 하도록 되어 있다. 따라서 정말로 no-cache 한 동작을 하기 위해서는 응답 헤더에 Cache-control:no-cache를 추가할 뿐만 아니라 Last-modified와 Etag를 제거해야 한다. |
추가적으로 한글 문제를 해결하기 위해 charset를 추가한다.
header ("Content-charset=euc-kr");
이제 바로 사용가능하도록 수정이 완료되었으니 최종 본을 살펴보자
27 header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 28 header ("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); 29 header ("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 30 header ("Pragma: public"); 31 header ("Content-type: application/x-msexcel"); 32 header ("Content-Disposition: attachment; filename=\"" . basename($export_file) . "\"" ); 33 header ("Content-Description: PHP/INTERBASE Generated Data" ); 34 header ("Content-charset=euc-kr"); 35 ob_clean(); 36 flush(); 37 readfile($export_file); 38 exit; |
이렇게 변경하니 다운로드가 원활하게 됐다.
매번 다운받아 헤더값 을 다시 수정하기도 귀찮고 하니 한글이랑 IE에서 잘되는 샘플 파일을 첨부하도록 하겠다.
받아가는 놈들은 고맙다고 제발 댓글 달고 조회수좀 팍팍 올려주길 바란다.~~~
이상 성랑이의 PHP Excel 다운로드 강좌였음 ㅋㅋㅋ ^^
끝~~~~~~~~~~
반응형
'Program > PHP' 카테고리의 다른 글
[ JQuery Ajax + PHP 한글 처리문제 해결방법 ] (0) | 2010.07.20 |
---|---|
[ PHP E-mail 전송 ] (6) | 2010.07.03 |
[ PHP5 공통모듈 ] (0) | 2010.06.10 |
PHP - HttpRequest ( POST 방식 ) (0) | 2010.06.09 |
Php Function (mcrypt_encrypt) 사용법 - 업데이트 예정임. (0) | 2010.01.26 |