PHPSpreadsheet 사용한 엑셀 업로드 (composer 없이) > 그누보드5 팁자료실

그누보드5 팁자료실

PHPSpreadsheet 사용한 엑셀 업로드 (composer 없이) 정보

PHPSpreadsheet 사용한 엑셀 업로드 (composer 없이)

첨부파일

PhpOffice.zip (1.1M) 18회 다운로드 2022-04-12 21:15:50
excel_up1.php (1.4K) 2회 다운로드 2022-04-12 21:15:50
excel_up2.php (6.9K) 2회 다운로드 2022-04-12 21:15:50
register_excel.xls (37.0K) 2회 다운로드 2022-04-12 21:15:50

본문

안녕하세요.

서버를  PHP8.0 + MySQL 8.0.27 + Apache 2.4.53 + 그누보드 5.5.4 로 

업데이트 한 후 기존  라이브러리 (Excel)로 엑셀 자료를 서버에 업로드 하면 그냥 멈춥니다.

PHP 호환문제로 상당히 큰 문제라 구글링 하면서 될 수 있는 방법을 찾아서

드디어 성공 했기에 여기에 올려 봅니다.

엑셀라이브러리는 PHPSpreadsheet (composer 없이) 처리 하였습니다.

필요한 autoload.php나 psr.php 는 안에 포함되어 있습니다.

 

먼저 이 파일을 저는 테마의 lib에 그대로 압축 풀기를 했습니다.

경로는 Apache24 \ htdocs \  ??? \ theme \ ??? \ lib \ PhpOffice

(기본 말고 테마로 한 이유는 나중에 그누보드 순정을 건들면 별로라서...)

혹 다른 폴더에 압축해제하더라도 변수만 변경해 주시면 됩니다. (예시1)


    require_once(G5_THEME_PATH.'/lib/PhpOffice/Psr/autoloader.php');        //설치폴더 변경시 G5_THEME_PATH 수정요함
    require_once(G5_THEME_PATH.'/lib/PhpOffice/PhpSpreadsheet/autoloader.php');    //설치폴더 변경시 G5_THEME_PATH 수정요함
    $reader = new PhpOffice\PhpSpreadsheet\Reader\Xls();    //업로드용 엑셀은 xls 입니다.
   //Xlsx로 변경시
    // $reader = new PhpOffice\PhpSpreadsheet\Reader\Xlsx();
    // //업로드용 엑셀을 받으신 후 포멧을 xlsx 로 저장하시면 됩니다.

 

순서는 

excel_up1.php 에서 파일을 선택(신규 데이터 입력만 구현)한 후

excel_up2.php 에서 실제 mysql로 넘어 갑니다.

 

excel_up2.php 안에  wr_subjcet의 중복체크하여 나중에 표시해 줍니다.

제가 사용하는 wr_subject는 D2022-xxxx (4개 숫자포맷으로 되어 있습니다.)

필요하신 입력폼 형태를 정의 하시고 $wr_1 ~ $wr_xxx 설정하세요

 

* 중간에 날짜형태 2022-04-12 를 PHPSpreadsheet 로 읽어 드리면

   45563 이렇게 5글자로 바뀌어서 중간에 함수를 넣어 놓았습니다.

 


    function time_convert($time) {  //45563 날짜값을 날짜포맷변경
        $t = ( $time - 25568 ) * 86400-60*60*9;  // 25569 : -1 daty 
        $t = round($t*10)/10;
        $t = date('Y-m-d',$t);
        return $t;
    }

 

그리고 중요한 것이 처음 use 선언을 하지 않으시면 에러가 납니다.


<?php
include_once('./_common.php');
use PhpOffice\PhpSpreadsheet\Spreadsheet;    //처음 선언해야 함.
use PhpOffice\PhpSpreadsheet\Reader\Xls;    //처음 선언해야 함.
//Xlsx를 사용하실려면  바꾸세요.
//use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
error_reporting(E_ALL);
ini_set("display_errors", 1);

 

엑셀 자료 읽어 드릴때 array가 0 아니고 1부터 입니다.

그리고 헤더를 제외한 데이터는 2부터 입니다. (주의)


for ($i=2; $i<=count($data);$i++ ){   //실제데이터는 2부터.. 

 

잘 사용하시길 바랍니다.

 

 

 

 

 

추천
7

댓글 4개

감사합니다.
엑셀파일 업로드, 다시 엑셀 템플릿으로 다운로드 사용 중인데 매뉴얼도 나름 잘 되어 있고 기능이 대단하더군요.
엄청난 뭔가 인듯 한데 적용을 하고 싶어 지네요..  상품이나 회원 정보, 지역 정보등 엑셀로 만들어 놓고 올리면 작성을 할 수 있다는 겄이죠?
excel_up2.php에서 실제 db로 넘겨주기위해서 작업을 좀 하시면 됩니다.


                $reader->setReadDataOnly(true);

                 $data = $spreadsheet->getSheet(0)->toArray(null,true,true,true);   // >getSheet(0) 첫번째 시트 /  두번째는 getSheet(1)
                //print_r2($data);  엑셀자료가 제대로 인식 되는지  하세요.
                 ......
                $wr_datetime = time_convert($data[$i]['A']);        
                $wr_subject = $data[$i]['B'];                       
                $wr_1       = time_convert($data[$i]['C']);      
                $wr_2       = $data[$i]['D'];                       
                $wr_3       = $data[$i]['E'];                     
                $wr_4       = $data[$i]['F'];                      
                $wr_5       = $data[$i]['G'];                      
                $wr_6       = $data[$i]['H'];                   

저는 8개 필드로 엑셀파일에서 한줄씩 읽어서 변수로 받으면 데이터가 없는 줄에서 완료가 됩니다.
예전 버전인 Excel 라이브러리와 다른점이 엑셀의 열이 숫자로 표현 되었지만,
현재의 PHPSpreadsheet 에서는 A , B, C ,  .... AA..AB.. 처럼 숫자가 아니고 영문으로 되어있기에
이부분만 주의 하시면 어떤 방대한 자료도 한번에 DB로 갈수 있습니다.
 또한 print_r2($data) 에서 주석처리를 푸시고 이하 줄부터는 주석처리 하신  후에  자료가 제대로 읽어 드리는지 먼저 확인하세요.  읽어 드릴때는 전체(헤더포함)로 표시 되어 있어야 정상입니다.

그럼..
전체 2,132 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIR SOFT