less than 1 minute read

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();

$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>

&lt;tr&gt;
	&lt;td&gt;....&lt;/td&gt;
&lt;/tr&gt;

</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>


출력버퍼 속의 내용이 커질 경우 메모리 제한을 늘려보세요.


🔗original-link

Updated: