PHPExcel 이 deprecated 되어 PHP 7.2 이상에서 지원이 안되므로 PHPSpreadsheet 를 설치해야 한다.
이용환경 : CentOS 7
PHP 7.3 yum 설치 스크립트 : https://link2me.tistory.com/1841 참조
설치 방법
- 윈도우 환경에서는 https://getcomposer.org/download/ 에서 설치 파일을 다운로드 하는 거 같다.
- 리눅스 설치 환경에서는 composor 가 설치되어 있어야 한다.
https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_composer_%EC%84%A4%EC%B9%98
에 나온 방법대로 설치를 한다.
먼저 vi /etc/php.ini 에서 allow_url_fopen = On 이 되어 있어야 아래 코드가 동작된다.
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer -V
export COMPOSER_ALLOW_SUPERUSER=1
composer -V
echo "export COMPOSER_ALLOW_SUPERUSER=1" >> ~/.bashrc
cat ~/.bashrc | grep export
이제 PhpSpreadsheet 의 설치는 PHP가 설치된 경로에서 한다.
cd /var/www/html/
composer require phpoffice/phpspreadsheet
실 사용 예제
기존 PHPExcel 라이브러리를 이용하여 사용하던 코드에서 변경할 부분만 변경해서 사용하면 된다.
<?php error_reporting(0); ini_set('memory_limit', -1); // 메모리 제한을 해제해준다.
require_once 'path.php';// root 폴더를 기준으로 상대적인 경로 자동 구하기 require_once $g['path_root'].'sessionChk.php'; // 세션 체크 require_once $g['path_config'].'config.php'; require_once $g['path_class'].'dbconnect.php'; require_once $g['path_class'].'adminClass.php'; require_once $g['path_admin'].'PHPExcel.php'; $a = new adminClass();
$fname="members"; $posArr=$a->StaffPositionMNArray();
$objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); //set first sheet as active
$objSheet = $objPHPExcel->getActiveSheet();
$objPHPExcel->getDefaultStyle()->getFont()->setSize(12); // 폰트 사이즈 $objSheet->SetCellValue('A2', "번호"); $objSheet->SetCellValue('B2', "성명"); $objSheet->SetCellValue('C2', "직급"); $objSheet->SetCellValue('D2', "아이디"); $objSheet->SetCellValue('E2', "부서1"); $objSheet->SetCellValue('F2', "부서2"); $objSheet->SetCellValue('G2', "부서3"); $objSheet->SetCellValue('H2', "부서4"); $objSheet->SetCellValue('I2', "등록일자"); $objSheet->SetCellValue('J2', "최근접속"); cellColor('A2:J2', 'F28A8C'); // 헤더 배경색 지정
$i=3; // 값을 기록할 셀의 시작위치 $rowCount = 1; // 넘버링
$sql="select * from members "; $sql.=" order by idx"; $result=mysqli_query($db,$sql); while($R=mysqli_fetch_array($result)){
$objSheet->SetCellValue('A'.$i, $rowCount); $objSheet->SetCellValue('B'.$i, $R['username']); $objSheet->SetCellValue('C'.$i, $posArr[$R['codeID']]); $objSheet->SetCellValue('D'.$i, $R['userid']); $objSheet->SetCellValue('E'.$i, $R['group2']); $objSheet->SetCellValue('F'.$i, $R['group3']); $objSheet->SetCellValue('G'.$i, $R['group4']); $objSheet->SetCellValue('H'.$i, $R['group5']); $objSheet->SetCellValue('I'.$i, substr($R['regdate'],0,10)); $objSheet->SetCellValue('J'.$i, SETDATE($R['date']));
$i++; $rowCount++; }
// 표 그리기 $i--; $objSheet->getStyle('A2:J'.$i)->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
// 헤더 칼럼 가운데 정렬 $objSheet->getStyle('A2:J2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
// 셀 높이 $objSheet->getRowDimension(1)->setRowHeight(20);
// 칼럼 사이즈 자동 조정 $objSheet->getColumnDimension('A')->setWidth(6); // setWidth(18); // 칼럼 크기 직접 지정 $objSheet->getColumnDimension('B')->setWidth(8); // 칼럼 크기 직접 지정 $objSheet->getColumnDimension('C')->setWidth(10); $objSheet->getColumnDimension('D')->setWidth(10); $objSheet->getColumnDimension('E')->setWidth(21); $objSheet->getColumnDimension('F')->setWidth(19); $objSheet->getColumnDimension('G')->setWidth(18); $objSheet->getColumnDimension('H')->setWidth(18); $objSheet->getColumnDimension('I')->setWidth(11); $objSheet->getColumnDimension('J')->setWidth(11);
// 파일 PC로 다운로드 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename='.$fname.'.xlsx'); header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->save('php://output'); exit;
// 엑셀의 셀 배경색 지정 function cellColor($cells,$color){ global $objSheet;
$objSheet->getStyle($cells)->getFill()->applyFromArray(array( 'type' => PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => array( 'rgb' => $color ) )); }
function SETDATE($date){ $date = preg_replace("/[^0-9]/", "", $date); // 숫자 이외 제거 return preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})$/", "\\1-\\2-\\3", $date); }
?> |
이제 PHPSpreadsheet 라이브러리를 이용한 코드 예제를 보면 변경된 부분이 뭔지 알 수 있다.
<?php error_reporting(0); ini_set('memory_limit', -1); // 메모리 제한을 해제해준다.
require_once 'path.php';// root 폴더를 기준으로 상대적인 경로 자동 구하기 require_once $g['path_root'].'sessionChk.php'; // 세션 체크 require_once $g['path_config'].'config.php'; require_once $g['path_class'].'dbconnect.php'; require_once $g['path_class'].'adminClass.php'; require_once $g['path_root'].'vendor/autoload.php'; $a = new adminClass();
$fname="members"; $posArr=$a->StaffPositionMNArray();
use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$objPHPExcel = new Spreadsheet(); $objPHPExcel->setActiveSheetIndex(0); //set first sheet as active
$objSheet = $objPHPExcel->getActiveSheet();
$objPHPExcel->getDefaultStyle()->getFont()->setSize(12); // 폰트 사이즈 $objSheet->SetCellValue('A2', "번호"); $objSheet->SetCellValue('B2', "성명"); $objSheet->SetCellValue('C2', "직급"); $objSheet->SetCellValue('D2', "아이디"); $objSheet->SetCellValue('E2', "부서1"); $objSheet->SetCellValue('F2', "부서2"); $objSheet->SetCellValue('G2', "부서3"); $objSheet->SetCellValue('H2', "부서4"); $objSheet->SetCellValue('I2', "등록일자"); $objSheet->SetCellValue('J2', "최근접속"); // 헤더 배경색 지정 $objSheet->getStyle('A2:J2')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)->getStartColor()->setARGB('F28A8C');
$i=3; // 값을 기록할 셀의 시작위치 $rowCount = 1; // 넘버링
$sql="select * from members "; $sql.=" order by idx"; $result=mysqli_query($db,$sql); while($R=mysqli_fetch_array($result)){
$objSheet->SetCellValue('A'.$i, $rowCount); $objSheet->SetCellValue('B'.$i, $R['username']); $objSheet->SetCellValue('C'.$i, $posArr[$R['codeID']]); $objSheet->SetCellValue('D'.$i, $R['userid']); $objSheet->SetCellValue('E'.$i, $R['group2']); $objSheet->SetCellValue('F'.$i, $R['group3']); $objSheet->SetCellValue('G'.$i, $R['group4']); $objSheet->SetCellValue('H'.$i, $R['group5']); $objSheet->SetCellValue('I'.$i, substr($R['regdate'],0,10)); $objSheet->SetCellValue('J'.$i, SETDATE($R['date']));
$i++; $rowCount++; }
// 표 그리기 $i--; $objSheet->getStyle('A2:J'.$i)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
// 헤더 칼럼 가운데 정렬 $objSheet->getStyle('A2:J2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
// 셀 높이 $objSheet->getRowDimension(1)->setRowHeight(20);
// 칼럼 사이즈 자동 조정 $objSheet->getColumnDimension('A')->setWidth(6); // setWidth(18); // 칼럼 크기 직접 지정 $objSheet->getColumnDimension('B')->setWidth(8); // 칼럼 크기 직접 지정 $objSheet->getColumnDimension('C')->setWidth(10); $objSheet->getColumnDimension('D')->setWidth(10); $objSheet->getColumnDimension('E')->setWidth(21); $objSheet->getColumnDimension('F')->setWidth(19); $objSheet->getColumnDimension('G')->setWidth(18); $objSheet->getColumnDimension('H')->setWidth(18); $objSheet->getColumnDimension('I')->setWidth(11); $objSheet->getColumnDimension('J')->setWidth(11);
// 파일 PC로 다운로드 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename='.$fname.'.xlsx'); header('Cache-Control: max-age=0');
/* // OLD 버전 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007"); $objWriter->save('php://output'); */ $writer = new Xlsx($objPHPExcel); $writer->save('php://output'); exit;
function SETDATE($date){ $date = preg_replace("/[^0-9]/", "", $date); // 숫자 이외 제거 return preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})$/", "\\1-\\2-\\3", $date); }
?> |