테이블과 첨부파일 피벗 테이블 문의

테이블과 첨부파일 피벗 테이블 문의

QA

테이블과 첨부파일 피벗 테이블 문의

답변 2

그누보드5(영카트) 버전

5.6.10

본문

안녕하세요.

 

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

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>";
?>

답변을 작성하시기 전에 로그인 해주세요.
전체 1
© SIRSOFT
현재 페이지 제일 처음으로