테스트 사이트 - 개발 중인 베타 버전입니다

엑셀 다운로드가 안되는데 코드 좀 봐주실 수 있으신가요? 채택완료

호다 1년 전 조회 1,868

안녕하세요. 항상 도움 받고 있습니다. 감사합니다. 

엑셀 다운로드 버튼을 클릭하면 post 로 year month name 값을 받아서 db 에서 해당하는 데이터를 찾아서 엑셀 파일로 다운로드 해주려고 하는데요. 

엑셀 파일이 다운로드 되지 않거나 post 로 받은 값만 출력하는게 아니라 페이지 전체 내용을 다운로드 했습니다. 

코드는 아래와 같습니다. 

accept_list_each.php

   

 

   

           

           

       

     

     

     

       

     

 

 

     

       

     

 

     

       

     

 

     

   

 

   

 

 

   

 

 

bbs/download_excel_each.php  

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    if (isset($_POST['year']) && isset($_POST['month']) && isset($_POST['keyword'])) {

        $year = $_POST['year'];

        $month = $_POST['month'];

        $keyword = $_POST['keyword'];

 

        require_once('./_common.php');

        include_once(G5_LIB_PATH.'/PHPExcel.php');

 

        function column_char($i) { return chr( 65 + $i ); }

 

        $headers = array('번호', '상태', '게시월', '이름', '업체명', '게시대명', '기간 / 게첨면', '등록일');

        $widths  = array(15, 15, 15, 15, 15, 50, 15, 15);

        $header_bgcolor = 'FFABCDEF';

        $last_char = column_char(count($headers) - 1);

 

        $sql = "SELECT a.ct_id, a.ct_status, a.ct_apply_date, a.it_id, a.it_name, a.ct_option, a.ct_time, b.mb_name, b.mb_nick, b.mb_id

        FROM g5_shop_cart AS a

        LEFT JOIN g5_member AS b ON a.mb_id = b.mb_id

        WHERE a.mb_id != 'admin'

        AND YEAR(a.ct_time) = $year

        AND MONTH(a.ct_time) = $month

        AND a.ct_status IN ('입금', '취소')";

 

        if (!empty($keyword)) {

            $sql .= " AND (b.mb_name LIKE '%$keyword%' OR b.mb_nick LIKE '%$keyword%')";

        }

 

        $sql .= " ORDER BY a.ct_time DESC";

 

        $result = sql_query($sql);

 

        for($i=1; $row=sql_fetch_array($result); $i++) {

 

            $rows[] =

                    array(

                      $i,

                      $row[ct_status],

                      $row[ct_apply_date],

                      $row[mb_name],

                      $row[mb_nick],

                      $row[it_name],

                      $row[ct_option],

                      $row[ct_time]

                    );

        }

 

        $data = array_merge(array($headers), $rows);

 

        $excel = new PHPExcel();

        $excel->setActiveSheetIndex(0)->getStyle( "A1:${last_char}1" )->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB($header_bgcolor);

        $excel->setActiveSheetIndex(0)->getStyle( "A:$last_char" )->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setWrapText(true);

        foreach($widths as $i => $w) $excel->setActiveSheetIndex(0)->getColumnDimension( column_char($i) )->setWidth($w);

        $excel->getActiveSheet()->fromArray($data,NULL,'A1');

 

        header("Content-Type: application/octet-stream");

        header("Content-Disposition: attachment; filename=\"members-".date("ymd", time()).".xls\"");

        header("Cache-Control: max-age=0");

 

        $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');

        $writer->save('php://output');

    } else {

        echo "fail";

    }

} else {

    echo "fail";

}

?>

항상 감사합니다. 

댓글을 작성하려면 로그인이 필요합니다.

답변 1개

채택된 답변
+20 포인트

다음과 같은 방법으로 시도해 볼 수 있을것 같습니다.

 

</p>

<p><!-- accept_list_each.php --></p>

<p><!-- ... (기존 코드) ... --></p>

<p><script src="<a href="https://code.jquery.com/jquery-3.6.4.min.js"></script>" target="_blank" rel="noopener noreferrer">https://code.jquery.com/jquery-3.6.4.min.js"></script></a> <!-- jQuery 추가 --></p>

<p><script>

    function exportToExcel() {

        var year = $("#year").val();

        var month = $("#month").val();

        var keyword = $("#searchInput").val();</p>

<p>        $.ajax({

            url: "download_excel_each.php",

            type: "POST",

            data: {

                year: year,

                month: month,

                keyword: keyword

            }

        })

        .done(function(data) {

            if (data === "success") {

                alert("엑셀 다운로드가 완료되었습니다.");

            } else {

                alert("엑셀 다운로드를 실패했습니다. 다시 시도해주세요.");

            }

        })

        .fail(function() {

            alert("엑셀 다운로드를 실패했습니다. 다시 시도해주세요.");

        });

    }

</script></p>

<p><!-- ... (기존 코드) ... -->

 

</p>

<p><!-- bbs/download_excel_each.php --></p>

<p><?php

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    if (isset($_POST['year']) && isset($_POST['month']) && isset($_POST['keyword'])) {

        $year = $_POST['year'];

        $month = $_POST['month'];

        $keyword = $_POST['keyword'];</p>

<p>        require_once('./_common.php');

        include_once(G5_LIB_PATH.'/PHPExcel.php');</p>

<p>        function column_char($i) { return chr(65 + $i); }</p>

<p>        $headers = array('번호', '상태', '게시월', '이름', '업체명', '게시대명', '기간 / 게첨면', '등록일');

        $widths = array(15, 15, 15, 15, 15, 50, 15, 15);

        $header_bgcolor = 'FFABCDEF';

        $last_char = column_char(count($headers) - 1);</p>

<p>        // SQL 인젝션 방지를 위해 사용자 입력 이스케이핑

        $year = sql_escape_string($year);

        $month = sql_escape_string($month);

        $keyword = sql_escape_string($keyword);</p>

<p>        $sql = "SELECT a.ct_id, a.ct_status, a.ct_apply_date, a.it_id, a.it_name, a.ct_option, a.ct_time, b.mb_name, b.mb_nick, b.mb_id

                FROM g5_shop_cart AS a

                LEFT JOIN g5_member AS b ON a.mb_id = b.mb_id

                WHERE a.mb_id != 'admin'

                AND YEAR(a.ct_time) = '{$year}'

                AND MONTH(a.ct_time) = '{$month}'

                AND a.ct_status IN ('입금', '취소')";</p>

<p>        if (!empty($keyword)) {

            // SQL 인젝션 방지를 위해 사용자 입력 이스케이핑

            $keyword = sql_escape_string($keyword);

            $sql .= " AND (b.mb_name LIKE '%{$keyword}%' OR b.mb_nick LIKE '%{$keyword}%')";

        }</p>

<p>        $sql .= " ORDER BY a.ct_time DESC";</p>

<p>        $result = sql_query($sql);</p>

<p>        for ($i = 1; $row = sql_fetch_array($result); $i++) {

            $rows[] = array(

                $i,

                $row['ct_status'],

                $row['ct_apply_date'],

                $row['mb_name'],

                $row['mb_nick'],

                $row['it_name'],

                $row['ct_option'],

                $row['ct_time']

            );

        }</p>

<p>        $data = array_merge(array($headers), $rows);</p>

<p>        $excel = new PHPExcel();

        $excel->setActiveSheetIndex(0)->getStyle("A1:{$last_char}1")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB($header_bgcolor);

        $excel->setActiveSheetIndex(0)->getStyle("A:$last_char")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setWrapText(true);

        foreach ($widths as $i => $w) $excel->setActiveSheetIndex(0)->getColumnDimension(column_char($i))->setWidth($w);

        $excel->getActiveSheet()->fromArray($data, NULL, 'A1');</p>

<p>        header("Content-Type: application/octet-stream");

        header("Content-Disposition: attachment; filename=\"members-" . date("ymd", time()) . ".xls\"");

        header("Cache-Control: max-age=0");</p>

<p>        $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');

        $writer->save('php://output');</p>

<p>        echo "success"; // 다운로드가 성공했을 때 "success" 출력

    } else {

        echo "fail";

    }

} else {

    echo "fail";

}

?>

참고하셔서 원하시는 방향으로 로직을 구현 하시면 되지 않을까 합니다. 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

호다
1년 전
알려주셔서 감사합니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인