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

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

QA

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

본문

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

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

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

코드는 아래와 같습니다. 

accept_list_each.php

<form action="<?php echo G5_BBS_URL; ?>/page.php?hid=accept_list_each" method="POST">    

  <div id="currentbn">

    <div class="row">

           

            <div class="col-xs-6 col-sm-3 col-md-2 col-lg-2 selectrow">

        <select name="year" id="year">

          <option value="">검색 년도</option>

                    <?php

                        $now_year = date("Y");

                        $one_year_ago = date("Y", strtotime("-1 year"));

                        $one_year_later = date("Y", strtotime("+1 year"));

                    ?>

          <option value="<?php echo $one_year_ago;?>" <?php if($year == $one_year_ago) echo "selected"; ?>><?php echo $one_year_ago;?>년</option>

                    <option value="<?php echo $now_year;?>" <?php if($year == $now_year) echo "selected"; ?>><?php echo $now_year;?>년</option>

                    <option value="<?php echo $one_year_later;?>" <?php if($year == $one_year_later) echo "selected"; ?>><?php echo $one_year_later;?>년</option>

        </select>

      </div>

     

      <div class="col-xs-6 col-sm-3 col-md-2  col-lg-2 selectrow">

        <select name="month" id="month">

          <option value="">검색 월</option>

                    <?php

                        for($i=1;$i<=12;$i++){

                            $month_value = sprintf("%02d", $i)

                    ?>

              <option value="<?php echo $month_value; ?>" <?php if($month == $month_value) echo "selected"; ?>><?php echo $i; ?>월</option>

                    <?php } ?>

        </select>

      </div>

 

 

      <div class="col-xs-6 col-sm-3 col-md-3  col-lg-3 selectrow">

        <input type="text" id="searchInput" name="keyword" value="<?php echo $keyword; ?>" placeholder="이름 또는 업체명을 입력하세요.">

      </div>

 

      <div class="col-xs-6 col-sm-3 col-md-2  col-lg-1 selectrow">

        <button type="submit" class="searchBtn">검색</button>

      </div>

 

     

    </div>

  </div>

    </form>

 

  <div class="pull-right">

    <button onclick="exportToExcel()" id="exceldownload"><i class="fa fa-download"></i> 엑셀 다운로드</button>

  </div>
 

<script>

    function exportToExcel() {

        var year = document.getElementById('year').value;

        var month = document.getElementById('month').value;

        var keyword = document.getElementById('searchInput').value;

 

        // console.log("Year: " + year + ", Month: " + month + ", Keyword: " + keyword);

 

        $.ajax({

            // url: "<?php echo G5_BBS_URL; ?>/page.php?hid=export_excel",

            url: "download_excel_each.php",

            type: "POST",

            data: {

                year: year,

                month: month,

                keyword: keyword

            }

        }).done(function(data) {

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

        }).fail(function() {

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

        });

    }

</script>

bbs/download_excel_each.php
 

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

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

 


<!-- accept_list_each.php -->
<!-- ... (기존 코드) ... -->
<script src="https://code.jquery.com/jquery-3.6.4.min.js"></script> <!-- jQuery 추가 -->
<script>
    function exportToExcel() {
        var year = $("#year").val();
        var month = $("#month").val();
        var keyword = $("#searchInput").val();
        $.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>
<!-- ... (기존 코드) ... -->

 


<!-- bbs/download_excel_each.php -->
<?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 인젝션 방지를 위해 사용자 입력 이스케이핑
        $year = sql_escape_string($year);
        $month = sql_escape_string($month);
        $keyword = sql_escape_string($keyword);
        $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 인젝션 방지를 위해 사용자 입력 이스케이핑
            $keyword = sql_escape_string($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');
        echo "success"; // 다운로드가 성공했을 때 "success" 출력
    } else {
        echo "fail";
    }
} else {
    echo "fail";
}
?>

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

답변을 작성하시기 전에 로그인 해주세요.
전체 57,958
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT