엑셀 다운로드 셀 병합 .. 채택완료
호다
1년 전
조회 1,924
안녕하세요 항상 도움 받고 있습니다. 감사합니다. 엑셀 다운로드 기능을 만들어서 데이터는 제대로 출력이 되는데 $rowCounter++ 으로 반복문을 돌면서 1, 2, 3 .. 수 만큼 셀이 생성이 되면 옆에 셀을 그 셀의 갯수만큼 행을 병합하고 중앙 정렬을 하려고 하는데 어떻게 해야 하나요?
</p>
<p><?php</p>
<p>include_once('./_common.php');</p>
<p>include_once(G5_LIB_PATH.'/PHPExcel.php');</p>
<p> </p>
<p>$year = isset($_POST['year']) ? $_POST['year'] : '';</p>
<p>$month = isset($_POST['month']) ? $_POST['month'] : '';</p>
<p>$wr_dong = isset($_POST['wr_dong']) ? $_POST['wr_dong'] : '';</p>
<p> </p>
<p>$search_date = $year . "-" . $month;</p>
<p> </p>
<p>$ca_name = '상업용';</p>
<p> </p>
<p>$sql = "SELECT a.it_id,</p>
<p> a.io_id,</p>
<p> a.ct_status,</p>
<p> a.ct_post,</p>
<p> b.mb_name,</p>
<p> b.mb_company,</p>
<p> b.mb_nick,</p>
<p> c.od_memo</p>
<p> FROM g5_shop_cart AS a</p>
<p> LEFT JOIN g5_member AS b ON a.mb_id = b.mb_id</p>
<p> LEFT JOIN g5_shop_order AS c ON a.od_id = c.od_id</p>
<p> WHERE a.mb_id != 'admin'</p>
<p> AND a.ct_apply_date = '$search_date' </p>
<p> AND a.ca_name = '$ca_name'</p>
<p> AND (a.ct_status = '입금' OR (a.ct_status = '쇼핑' AND TIMESTAMPDIFF(MINUTE, a.ct_time, NOW()) < 5));";</p>
<p> </p>
<p>$result = sql_query($sql);</p>
<p> </p>
<p>$banner_array = array();</p>
<p>while ($row = sql_fetch_array($result)) {</p>
<p> $it_id = $row['it_id'];</p>
<p> $io_id = explode(chr(30), $row['io_id']);</p>
<p> $mb_name = $row['mb_name'];</p>
<p> $mb_company = $row['mb_company'];</p>
<p> $od_memo = $row['od_memo'];</p>
<p> </p>
<p> if ($row['ct_status'] == '입금') {</p>
<p> if ($search_date <= date("Y-m"))</p>
<p> $banner_array[$it_id][$io_id[0]][$io_id[1]][0] = "<span class='fixed'>[게첨]</span>";</p>
<p> else</p>
<p> $banner_array[$it_id][$io_id[0]][$io_id[1]][0] = "<span class='paid'>[입금완료]</span>";</p>
<p> } else</p>
<p> $banner_array[$it_id][$io_id[0]][$io_id[1]][0] = "<span class='wait'>[입금대기]</span>";</p>
<p> </p>
<p> $banner_array[$it_id][$io_id[0]][$io_id[1]][1] = "$mb_name ($mb_company - $od_memo)";</p>
<p>}</p>
<p> </p>
<p>//전체 게시대</p>
<p>$sql_where = "WHERE ca_name = '$ca_name' ";</p>
<p> </p>
<p>if($wr_dong){</p>
<p> $sql_where .= "AND wr_dong = '$wr_dong' ";</p>
<p>}</p>
<p> </p>
<p>$sql = "SELECT *</p>
<p> FROM g5_write_menu02_1 AS d</p>
<p> $sql_where</p>
<p> ORDER BY wr_id";</p>
<p> </p>
<p>$result = sql_query($sql);</p>
<p> </p>
<p>if (!function_exists('column_char')) {</p>
<p> function column_char($i)</p>
<p> {</p>
<p> return chr(65 + $i);</p>
<p> }</p>
<p>}</p>
<p> </p>
<p>$headers = array(</p>
<p> array('현수막지정게시대 장소별 접수현황'),</p>
<p> array($year . "년" . $month . "월 접수현황"),</p>
<p> array('장소번호', '게시대명', '면', '1기', '2기', '3기')</p>
<p>);</p>
<p> </p>
<p>$widths = array(20, 40, 10, 40, 40, 40);</p>
<p>$last_col = column_char(count($headers[2]) - 1);</p>
<p> </p>
<p>$data = array_merge($headers, array());</p>
<p> </p>
<p>$rowCounter = 1;</p>
<p> </p>
<p>while ($row = sql_fetch_array($result)) {</p>
<p> $it_id = $row['it_id'];</p>
<p> $wr_1 = $row['wr_1'];</p>
<p> $wr_subject = $row['wr_subject'];</p>
<p> $wr_4 = $row['wr_4'];</p>
<p> $mb_name = $row['mb_name'];</p>
<p> $mb_company = $row['mb_company'];</p>
<p> $od_memo = $row['od_memo'];</p>
<p> </p>
<p> // 면 열의 셀을 합병하기 위해 해당 행을 여러 번 추가</p>
<p> for ($i = 0; $i < $wr_4; $i++) {</p>
<p> $row_data = array(</p>
<p> ($i === 0) ? $wr_1 : '', // 장소번호 (첫 번째 행에서만 표시)</p>
<p> ($i === 0) ? $wr_subject : '', // 게시대명 (첫 번째 행에서만 표시)</p>
<p> $rowCounter++, // 면</p>
<p> );</p>
<p> </p>
<p> for ($j = 1; $j <= 3; $j++) {</p>
<p> if ($j <= $wr_4) {</p>
<p> $banner_data = $banner_array[$it_id][$j][$i + 1];</p>
<p> if (!empty($banner_data) && isset($banner_data[1])) {</p>
<p> $row_data[] = $banner_data[1];</p>
<p> } else {</p>
<p> $row_data[] = "-";</p>
<p> }</p>
<p> } else {</p>
<p> // 기존 코드에서 주석 처리된 부분을 활성화하고 필요에 따라 내용을 채워주세요.</p>
<p> // $row_data[] = ''; // 해당 셀의 내용</p>
<p> }</p>
<p> }</p>
<p> </p>
<p> $data[] = $row_data;</p>
<p> </p>
<p> }</p>
<p> </p>
<p> $rowCounter = 1;</p>
<p>}</p>
<p> </p>
<p>$excel = new PHPExcel();</p>
<p> </p>
<p>// $excel->setActiveSheetIndex(0)->getStyle("A:$last_col")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setWrapText(true);</p>
<p>// foreach ($widths as $i => $w) $excel->setActiveSheetIndex(0)->getColumnDimension(column_char($i))->setWidth($w);</p>
<p>// $excel->getActiveSheet()->fromArray($data, NULL, 'A1');</p>
<p> </p>
<p>$last_row = count($data);</p>
<p>$last_col = count($data[0]) - 1; // 마지막 열의 인덱스</p>
<p>$last_col_char = column_char($last_col);</p>
<p> </p>
<p>$excel->setActiveSheetIndex(0)->getStyle("A:$last_col_char")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setWrapText(true);</p>
<p>foreach ($widths as $i => $w) $excel->setActiveSheetIndex(0)->getColumnDimension(column_char($i))->setWidth($w);</p>
<p>$excel->getActiveSheet()->fromArray($data, NULL, 'A1');</p>
<p> </p>
<p>// A1에서 F2 까지 병합</p>
<p>// 볼드체와 중앙 정렬 적용</p>
<p>$excel->getActiveSheet()->mergeCells("A1:F1");</p>
<p>$excel->getActiveSheet()->getStyle('A1:F1')->getFont()->setBold(true)->setSize(14);</p>
<p>$excel->getActiveSheet()->getStyle('A1:F1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);</p>
<p>$excel->getActiveSheet()->setCellValue('A1', '현수막지정게시대 장소별 접수현황');</p>
<p> </p>
<p>// A3 에서 F3 까지 병합</p>
<p>// 볼드체와 중앙 정렬 적용</p>
<p>$excel->getActiveSheet()->mergeCells("A2:F2");</p>
<p>$excel->getActiveSheet()->getStyle('A2:F2')->getFont()->setBold(true);</p>
<p>$excel->getActiveSheet()->getStyle('A2:F2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);</p>
<p>$excel->getActiveSheet()->setCellValue('A2', "$year 년 $month 월 접수현황");</p>
<p> </p>
<p>// A4에서 F4까지 회색으로 배경색</p>
<p>$excel->getActiveSheet()->getStyle("A3:F3")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('d3d3d3');</p>
<p>$excel->getActiveSheet()->getStyle("A3:F3")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);</p>
<p>$excel->getActiveSheet()->setCellValue('A3', '장소번호');</p>
<p>$excel->getActiveSheet()->setCellValue('B3', '게시대명');</p>
<p>$excel->getActiveSheet()->setCellValue('C3', '면');</p>
<p>$excel->getActiveSheet()->setCellValue('D3', '1기');</p>
<p>$excel->getActiveSheet()->setCellValue('E3', '2기');</p>
<p>$excel->getActiveSheet()->setCellValue('F3', '3기');</p>
<p> </p>
<p>// 전체 범위에 중앙 정렬 적용</p>
<p>for ($rowIndex = 1; $rowIndex <= $last_row + 1; $rowIndex++) {</p>
<p> $excel->getActiveSheet()->getStyle("A$rowIndex:F$rowIndex")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);</p>
<p>}</p>
<p> </p>
<p>header("Content-Type: application/octet-stream");</p>
<p>// header("Content-Type: application/vnd.ms-excel");</p>
<p>// header("Content-Disposition: attachment; filename=\"월별 접수목록-" . date("ymd", time()) . ".xls\"");</p>
<p> </p>
<p>// 엑셀 파일 이름 설정</p>
<p>$formatted_month = str_pad(date('m'), 2, '0', STR_PAD_LEFT);</p>
<p>$formatted_day = str_pad(date('d'), 2, '0', STR_PAD_LEFT);</p>
<p>$filename = "게시물접수현황(" . date("ymd", time()) . ").xls";</p>
<p> </p>
<p>header("Content-Disposition: attachment; filename=\"$filename\"");</p>
<p> </p>
<p>header("Cache-Control: max-age=0");</p>
<p> </p>
<p>$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');</p>
<p>$writer->save('php://output');</p>
<p>?></p>
<p> </p>
<p>
댓글을 작성하려면 로그인이 필요합니다.
답변 1개
채택된 답변
+20 포인트
1년 전
$objPHPExcel->setActiveSheetIndex(0)
->mergeCells('A1:D1')
->setCellValue('A1', "Col병합");
$objPHPExcel->setActiveSheetIndex(0)
->mergeCells('A2:A5')
->setCellValue('A2', "Row병합");
이걸로 예시가 있어요
https://jdh5202.tistory.com/541
로그인 후 평가할 수 있습니다
답변에 대한 댓글 2개
�
호다
1년 전
알려주셔서 감사합니다. 활용해볼게요
�
리오닥터
1년 전
이게 table 로 만들었으면 쉽게 가능할건데~ 라이브러리로 만들어서 좀 어렵네요..
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인