728x90

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);
}

?>
 


728x90
블로그 이미지

Link2Me

,