엑셀 다운로드가 안되는데 코드 좀 봐주실 수 있으신가요? 채택완료
안녕하세요. 항상 도움 받고 있습니다. 감사합니다.
엑셀 다운로드 버튼을 클릭하면 post 로 year month name 값을 받아서 db 에서 해당하는 데이터를 찾아서 엑셀 파일로 다운로드 해주려고 하는데요.
엑셀 파일이 다운로드 되지 않거나 post 로 받은 값만 출력하는게 아니라 페이지 전체 내용을 다운로드 했습니다.
코드는 아래와 같습니다.
accept_list_each.php
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: "/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("엑셀 다운로드를 실패했습니다. 다시 시도해주세요.")
});
}
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개
다음과 같은 방법으로 시도해 볼 수 있을것 같습니다.
</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개
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인