답변 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 예제 (엑셀 변환)
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 "엑셀 저장 완료: 다운로드"; ?>
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인