날개단바람의 잡기서재

[수정중] XE 게시판 목록을 Excel로 일괄 출력하기 본문

Computer

[수정중] XE 게시판 목록을 Excel로 일괄 출력하기

날개단바람 2015. 1. 25. 06:35
(초안입니다. 차후에 내용이 추가되거나 삭제될 수 있습니다.)

먼저 본 내용은 게시물의 내용 출력이 아닌 게시판에 올라온 글 목록을 출력하는 것임을 밝힌다.

사실 그냥 HTML로 표 형태로 작성 후 xls로 출력해줘도 엑셀이 읽어오기는 하지만
실행할 때 경고문을 내뱉기 때문에 그걸 피하고자 여기저기 찾아다니다가
PHPExcel 이라는 API를 사용해서 출력하는 방법이 있었다.

우선 게시판 목록을 출력하는 소스의 기초는 한이73님의 코드가 큰 도움이 되었다.
https://www.xpressengine.com/tip/22795784

PHP 5.5 이후에는 mysql_* API가 모조리 depricate 되기 때문에 자꾸 경고가 뜬다.
(물론 error_reporting을 사용하여 피할 수는 있지만 이 경우 차후의 작동여부를 장담할 수 없다.)
아래의 코드는 위의 내용들을 모두 포함하여 수정한 것이다. (좀 길다.)
하지만 아직도 문제가 있는 점은 PHPExcel이 몇몇 함수만 숫자좌표에 의한 셀 설정이 가능해서
나머지는 전부 컬럼부분을 알파벳으로 처리해야하는데 AA부터는(숫자로는 27 이후가 되겠지) 답이 없다.
뭐 얼마든지 어마무식하게 한다면 switch-case문을 사용해서 배정 할 수도 있겠지만...
좋은 방법은 아니므로... 조금 찾아봐야겠다.

그리고 컬럼 출력 순서를 사용자 임의로 조정할 수가 없다.

이 두가지만 해결되면 상당히 좋은 소스가 될 거라 본다.

덧 : 한이73님이 이 글을 보고 불편해 하실 경우 언제든지 삭제될 수 있다.

WARNING : You cannot run this script directly!"; exit; } error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '
'); require_once '../phpexcel/PHPExcel.php'; $objxls = new PHPExcel(); $info = array( "host" => "(mysql_server_address)", "user" => "(mysql_account)", "pass" => "(mysql_password)", "db" => "(mysql_database)", "table" => "xe_documents", // 단 이 부분은 접미사를 수정하여 쓰는 분들은 접미사를 고쳐서 쓰기 바란다. "module_srl" => "(해당 게시판 모듈번호)", ); $getFields = array("title","author", ... ); //출력원하는 칼럼을 배열로 입력 $dbm=new mysqli($info['host'], $info['user'], $info['pass'],$info['db']); if ($dbm->connect_errno) { printf("Connect failed: %s\n", $dbm->connect_error); exit(); } $dbm->query("set names utf8"); $objxls->setActiveSheetIndex(0); //제목 불러오기 $fields = $dbm->query("SHOW COLUMNS FROM $info[table]"); $cell_col=0; while ($row=$fields->fetch_row()) { if(in_array($row[0], $getFields) ) { $objxls->getActiveSheet()->setCellValueByColumnAndRow($cell_col,'1',$row[0]); $cell_col=$cell_col+1; } } //확장변수의 타이틀은 값이므로 $result = $dbm->query("select var_name from xe_document_extra_keys where module_srl = $info[module_srl]"); while( $data = $result->fetch_array(MYSQLI_BOTH) ) { $objxls->getActiveSheet()->setCellValueByColumnAndRow($cell_col,'1',htmlspecialchars($data['var_name'])); $cell_col=$cell_col+1; } $cell_row=2; //데이터 불러오기 $result = $dbm->query("select * from $info[table] where module_srl = $info[module_srl]"); while( $data = $result->fetch_assoc() ) { $cell_col=0; foreach( $data as $key => $val ) { if( in_array($key, $getFields) ) { if ($key == 'regdate') { $objxls->getActiveSheet()->setCellValueByColumnAndRow($cell_col,$cell_row,htmlspecialchars($val)); }elseif ($key == 'content'){ //내용 출력할경우 태그가 그대로 출력됨 //echo "".$val.""; //셀이 두칸이상으로 늘어남 $objxls->getActiveSheet()->setCellValueByColumnAndRow($cell_col,$cell_row,htmlspecialchars(strip_tags(str_replace(" ","",$val)))); }else { $objxls->getActiveSheet()->setCellValueByColumnAndRow($cell_col,$cell_row,htmlspecialchars($val)); } $cell_col=$cell_col+1; } if ($key == 'document_srl'){ //확장변수 불러올때 사용 $d_srl=$val; } } //확장변수 출력 //////////////////////////////////////////// //eid리스트를 불러온다 $query=$dbm->query("select eid from xe_document_extra_keys where module_srl = $info[module_srl]"); while($extra_title=$query->fetch_array(MYSQLI_BOTH)) { $egetFields = array("value","eid"); //확장변수 값을 불러와 eid값이 같은곳에 출력 $extra_result = $dbm->query("select * from xe_document_extra_vars where document_srl = $d_srl"); while( $edata = $extra_result->fetch_assoc() ) { $extra_str=""; foreach( $edata as $key => $val ){ if( in_array($key, $egetFields) ){ $extra_str = $val."|".$extra_str; } } $extra_arr=explode("|",$extra_str); if ($extra_title['eid']==$extra_arr[0]){ //전화번호값은 "|@|" 를 "-" 로 변경 if($extra_title['eid']=="mb_phone_Number"){ $objxls->getActiveSheet()->setCellValueByColumnAndRow($cell_col,$cell_row,str_replace("|@|","-",htmlspecialchars($extra_arr[1]))); //기타 배열값들은 ',' 로 변경 }elseif($extra_title['eid']=="mb_incomplete"||$extra_title['eid']=="mb_cs"){ $objxls->getActiveSheet()->setCellValueByColumnAndRow($cell_col,$cell_row,str_replace("|@|",",",htmlspecialchars($extra_arr[1]))); }else{ $objxls->getActiveSheet()->setCellValueByColumnAndRow($cell_col,$cell_row,htmlspecialchars($extra_arr[1])); } } } $cell_col=$cell_col+1; } ///////////////////////////////////////////////////////////////////// $cell_row=$cell_row+1; } // 이 부분은 서식 지정 부분이다. for($i=0;$i<$cell_col;$i++) { $objxls->getActiveSheet()->getColumnDimension(chr($i+65))->setAutoSize(true); } $styleArray = array('borders'=>array('allborders'=>array('style'=>PHPExcel_Style_Border::BORDER_THIN,'color'=>array('argb'=>'00000000'),),),); $objxls->getActiveSheet()->getStyle('A1:'.chr($cell_col+64).($cell_row-1))->applyFromArray($styleArray); $objxls->getActiveSheet()->getStyle('A1:'.chr($cell_col+64).'1')->getFont()->setSize(12)->setBold(true); $objxls->getActiveSheet()->getStyle('A1:'.chr($cell_col+64).'1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objxls->setActiveSheetIndex(0); // 파일 출력 부 header('Content-Type: application/vnd.ms-excel'); header("Content-Disposition: attachment;filename=doc_int_conf_".date('Ymd').".xlsx"); header('Cache-Control: max-age=0'); $objxlsWriter=PHPExcel_IOFactory::createWriter($objxls,'Excel2007'); //$objxlsWriter->save("doc_int_conf_".date('Ymd').".xls"); //$objxlsWriter->save(str_replace('.php', '.xls', __FILE__)); $objxlsWriter->save('php://output'); exit; ?>