html형식의 엑셀 다운로드를 만들경우.

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>
{{생략}}
<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>


출력버퍼 속의 내용이 커질 경우 메모리 제한을 늘려보세요.
댓글
  • No Nickname
    No Comment
  • 권한이 없습니다.
    {{m_row.m_nick}}
    -
목록형 📅 달력형