반응형

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 다운로드 강좌였음 ㅋㅋㅋ ^^

끝~~~~~~~~~~




반응형

+ Recent posts