엑셀 다운로드가 안되는데 코드 좀 봐주실 수 있으신가요?
본문
안녕하세요. 항상 도움 받고 있습니다. 감사합니다.
엑셀 다운로드 버튼을 클릭하면 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";
}
?>
참고하셔서 원하시는 방향으로 로직을 구현 하시면 되지 않을까 합니다.
!-->!-->