테이블과 첨부파일 피벗 테이블 문의
본문
안녕하세요.
각 게시판의 제목, 내용, 작성일자 그리고 첨부파일을 각각 엑셀로 출력하고 싶습니다.
JOIN시 첨부파일수 만큼 엑셀의 행이 생기는 데 피벗을 통해 아래가 아닌 우측으로 첨부파일을 노출하고 싶습니다. 경험이 있으신 고수님들의 조언을 부탁드립니다.
답변 2
SQL에서 MAX를 사용해 첨부파일을 가로로 변환하고,
PHPExcel라이브러리로 엑셀을 생성하는 방식이 최적일 듯합니다.
*bbs/list.php와 bbs/view.php를 통해 게시판 데이터를 가져올 수 있음.
*첨부파일은 data/file/{게시판명}/{wr_id} 경로에 저장됨.
*lib/PHPExcel/ 폴더가 존재하여 PHPExcel을 활용한 엑셀 변환 가능.
*기존 common.lib.php에서 SQL 처리 함수를 재사용할 수 있음.
*SQL 예제 (첨부파일 피벗 변환)
SELECT
b.wr_id AS 글번호,
b.wr_subject AS 제목,
b.wr_content AS 내용,
b.wr_datetime AS 작성일,
MAX(CASE WHEN f.file_no = 1 THEN f.file_name END) AS 첨부파일1,
MAX(CASE WHEN f.file_no = 2 THEN f.file_name END) AS 첨부파일2,
MAX(CASE WHEN f.file_no = 3 THEN f.file_name END) AS 첨부파일3
FROM g5_write_board b
LEFT JOIN g5_board_file f ON b.wr_id = f.wr_id
GROUP BY b.wr_id;
*PHP 예제 (엑셀 변환)
<?php
include_once('./_common.php'); // 그누보드 환경
require 'lib/PHPExcel/PHPExcel.php'; // PHPExcel 라이브러리 로드
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
// 데이터 조회
$sql = "SELECT
b.wr_id AS 글번호,
b.wr_subject AS 제목,
b.wr_content AS 내용,
b.wr_datetime AS 작성일,
f.file_no AS 파일번호,
f.file_name AS 첨부파일
FROM g5_write_board b
LEFT JOIN g5_board_file f ON b.wr_id = f.wr_id
ORDER BY b.wr_id, f.file_no";
$result = sql_query($sql);
$data = [];
while ($row = sql_fetch_array($result)) {
$wr_id = $row['글번호'];
if (!isset($data[$wr_id])) {
$data[$wr_id] = [
'글번호' => $row['글번호'],
'제목' => $row['제목'],
'내용' => $row['내용'],
'작성일' => $row['작성일'],
];
}
$fileIndex = '첨부파일' . $row['파일번호'];
$data[$wr_id][$fileIndex] = $row['첨부파일'];
}
// 엑셀 객체 생성
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 헤더 설정
$headers = ['글번호', '제목', '내용', '작성일'];
$fileHeaders = [];
foreach ($data as $row) {
foreach ($row as $key => $value) {
if (strpos($key, '첨부파일') !== false && !in_array($key, $fileHeaders)) {
$fileHeaders[] = $key;
}
}
}
$headers = array_merge($headers, $fileHeaders);
$sheet->fromArray([$headers], NULL, 'A1');
// 데이터 입력
$rowNum = 2;
foreach ($data as $row) {
$rowData = [];
foreach ($headers as $header) {
$rowData[] = isset($row[$header]) ? $row[$header] : '';
}
$sheet->fromArray([$rowData], NULL, "A$rowNum");
$rowNum++;
}
// 엑셀 저장
$writer = new Xlsx($spreadsheet);
$file_path = "게시판_엑셀_출력.xlsx";
$writer->save($file_path);
echo "엑셀 저장 완료: <a href='$file_path' download>다운로드</a>";
?>
간단하게 하시려면 최대 첨부파일 갯수만큼 미리 행을 만들어놓고 하시면 편합니다.
그 이상은 QNA 보단 의뢰에 가까워 보입니다..