테스트 사이트 - 개발 중인 베타 버전입니다

테이블과 첨부파일 피벗 테이블 문의 채택완료

위젯마스터 8개월 전 조회 1,481

안녕하세요.

 

각 게시판의 제목, 내용, 작성일자 그리고 첨부파일을 각각 엑셀로 출력하고 싶습니다.

JOIN시 첨부파일수 만큼 엑셀의 행이 생기는 데 피벗을 통해 아래가 아닌 우측으로 첨부파일을 노출하고 싶습니다.  경험이 있으신 고수님들의 조언을 부탁드립니다.

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트
glitter0gim
8개월 전

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 "엑셀 저장 완료: 다운로드"; ?>

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

8개월 전

간단하게 하시려면 최대 첨부파일 갯수만큼 미리 행을 만들어놓고 하시면 편합니다.

그 이상은 QNA 보단 의뢰에 가까워 보입니다..

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인