개발 꿀팁/PHP

php Excel 패키지 클래스 내보내기

Jammie 2022. 9. 28. 12:27
반응형

실제 상황의 필요 때문에 엑셀 양식을 도출하는 것은 백그라운드 개발 과정에서 자주 사용됩니다.다음은 PHP 엑셀의 지원이 필요한 실제 응용 프로그램에서 직접 분류한 Excel 유형입니다. 이 유형은 내보내기 양식의 기본 스타일, 경로 저장, 작업 기록 전환 기능을 잘 완성하여 여러분에게 도움이 되기를 바랍니다.

1:PHP 엑셀 지원 필요

2: 내보내기 시 워크북을 자동으로 전환할 수 있습니다. 기본 워크북은 2000개입니다. 테스트 결과 5000개 정도의 데이터 내보내기가 실패할 수 있으며 내보내기 시간이 오래 걸릴 수 있습니다.

워크북을 바꾸면 성공률을 높일 수 있고, 읽기 편하다

3: 필요한 파라미터가 전송되어야 하며, 반환된 값은 저장된 엑셀 주소이며, 링크는 다운로드 가능합니다

<?php
/**
 * 공통 내보내기 클래스@author:zhaoyaei
 * $column     :내보낸 첫 줄 제목
 * $result     :내보낼 결과 세트
 * $path       :파일 저장 경로 내보내기
 * $sheet_num  :워크북당 최대 행 수 (선택 사항)
 * @return     :저장된 주소
 */
class Export{

    public function __construct(){
        //클래스 초기화, 관련 클래스 파일 가져오기
        include "PHPExcel.php";
        include "PHPExcel/IOFactory.php";
    }

    //내보내기 설정
    public function createxcel($column,$result,$path,$sheet_num = null){
        //데이터의 합법성을 검사하다
        if(empty($column) || empty($path) || $path == "" || empty($result)){
            return false;
        }

        //만약 데이터가 크다면, 박으로 나누어 내보낸다
        if(empty($sheet_num) || $sheet_num <= 0){
            $sheet_num = 2000;
        }

        $path = $this->check_encod("GBK",$path);
        //PHP 엑셀 인스턴스 만들기
        $objPHPExcel = new \PHPExcel();
        //총 데이터 행 수 및 데이터 열 수
        $arr_num     = count($result);
        $field_count = count($column);
        //작업부 수, 작업부 수량이 너무 많아 석탄업에서 도출한 데이터 건수를 조절하여 작업부 수를 줄일 수 있다
        $get_num     = ceil($arr_num / $sheet_num);
        if($get_num > 20){
            return false;
        }

        //열 정보 생성
        $ary = array("", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
        for($i = 1;$i <= $field_count; $i++){
            $ary_info[$i]     = $ary[$i/27].$ary[$i%27];
            $fieldwidth[$i-1] = 20; //기본 값은 열 너비 20를 설치하고 있다
        }


        //각 워크북을 순환합니다
        for($sheet = 0;$sheet < $get_num; $sheet++){
            //워크북 만들기, 시작 워크북 설정
            $objPHPExcel->createSheet($sheet);
            $Sheet = $objPHPExcel->setActiveSheetIndex($sheet);
            //워크북 스타일 설정
            $i = 1;
            foreach ($column as $key => $value){
                //첫 번째 줄 값 설정
                $Sheet->setCellValue($ary_info[$i] .'1', $value);
                //첫 번째 줄을 굵게 설정합니다
                $objPHPExcel->getActiveSheet()->getStyle($ary_info[$i] .'1')->getFont()->setBold(true);
                //행폭 설정
                $objPHPExcel->getActiveSheet()->getColumnDimension($ary_info[$i] )->setWidth($fieldwidth[$i-1]);
                $i = $i + 1;
            }

            //각 워크북에서 시작하는 행 수
            $hang_num  = 2;
            //이 작업 북의 종료 행수부터 0
            $end_num   = 0;
            //start_num 이 워크북 시작 줄 수
            $start_num = $sheet*$sheet_num;
            //각 내보내기 시작 줄과 끝 줄 수를 계산합니다(멀티 워크북 내보내기)
            if($arr_num > ($start_num + $sheet_num)){
                $end_num = $start_num + $sheet_num;
            }else{
                $end_num = $arr_num;
            }

            //순환 행수
            for($i = $start_num; $i < $end_num; $i++){
                //순환열수
                for($j = 1;$j <= $field_count; $j++){
                    //데이터 쓰기
                    $Sheet->setCellValue($ary_info[$j].($hang_num)," ".$result[$i][$j]);
                }
                $hang_num++;
            }
            //sheet 이름 설정
            $objPHPExcel->getActiveSheet($sheet)->setTitle('sheet'.$sheet,$sheet);
            //sheet 시작 위치 설정
            $objPHPExcel->setActiveSheetIndex($sheet);
        }

        //PHPExcel_IOFactory의 쓰기 함수를 통해 위의 데이터를 씁니다
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        //시간대 설정
        date_default_timezone_set("Asia/Shanghai");
        //저장 후 저장 경로로 돌아가기
        $objWriter->save($path);
        return $this->check_encod("utf-8",$path);
    }

    public function check_encod($encod,$string){
        //판단 문자 인코딩
        $encode = mb_detect_encoding($string, array("ASCII","UTF-8","GB2312","GBK","BIG5"));
        if($encode != $encod){
            $string = iconv($encode, $encod, $string);
        }
        return $string;
    }
}
?>

 

반응형

'개발 꿀팁 > PHP' 카테고리의 다른 글

PHP 멀티프로세스 초탐  (1) 2022.09.29
php 상용 판단 함수  (0) 2022.09.28
php 페이지 인코딩 및 문자 작업  (0) 2022.09.28
PHP 미리 정의된 인터페이스의 ArrayAccess  (0) 2022.09.27
PHP의 Trait 특성  (0) 2022.09.27