PHP 웹 사이트에서
현재 보이는 페이지를 엑셀로 다운 받게 해달라는 요청을 받는 경우가 꽤 있는데...
그 웹 페이지 안애서 DB접속하고 쿼리 날리는 비지니스 부분까지 다 있다면...
소스 복사해서 down_excel.php 만들지 말라. 병신같은 짓이다.
쿼리 바뀔 때마다 down_excel.php 도 같이 바꿔줘야하는 2중 작업이 생긴다.
대신 본 페이지 부분의 내용을 버퍼 캐시를 사용해서 내용을 잘라서 붙여 주는 방식으로 해서
즉, 현재 보이는 페이지를 후처리로 다운로드하게.
#참고로 이건 html을 확장자만 xls로 받을 경우 편하게 하기위한 방법이다.
(excel writer 같은걸 쓴다면 이미 DB관련 부분이 따로 빠져있겠지....)
#기본 소스 (down_excel.php)
<?
ob_start();
header( "Content-type: application/vnd.ms-excel" );
header( "Content-Disposition: attachment; filename={{다운로드 받을 파일명}}.xls" );
require({{웹에서보여지는 PHP파일}});
$cont = ob_get_contents();
ob_end_clean();
$cont = substr($cont,strpos($cont,'<!-- CONTENT TABLE -->')); //주석을 기준으로 잘라온다.
$cont = substr($cont,0,strpos($cont,'<!-- //CONTENT TABLE -->')+strlen('<!-- //CONTENT TABLE -->'));//주석을 기준으로 잘라온다.
$cont = preg_replace('/<input[^>]*>/i','',$cont); //input 태그 삭제.
echo $cont;
exit('<!-- END -->');
?>
# 웹에서보여지는 PHP파일 (view.php)
{{생략}}
<!-- CONTENT TABLE -->
<table>
<tr>
<td>....</td>
</tr>
{{생략}}
</table>
<!-- //CONTENT TABLE -->
{{생략}}
view.php를 get으로 불렸다면 똑같은 값(queryString)으로 down_excel.php 를 get으로 불러라
post라면 똑같은 post값으로 ...
다운로드 버튼으로 밑의 소스를 사용하길 추천.
<form action="down_excel.php">
<input type="submit" value="EXCEL 저장">
<? foreach($_POST as $k=>$v){ ?>
<input type="hidden" name="<?=htmlspecialchars($k)?>" value="<?=htmlspecialchars($v)?>" >
<? } ?>
</form>
출력버퍼 속의 내용이 커질 경우 메모리 제한을 늘려보세요.