내가 한 노력들

[ PHP ] PHPExcel 를 이용해서 xlsx파일 읽기 본문

IT 공부/PHP

[ PHP ] PHPExcel 를 이용해서 xlsx파일 읽기

JONGI-N CHOI 2022. 5. 28. 18:40

xlsx파일의 데이터를 postgreSQL에 저장해야할 일이 생겨서, PHP로 저장할 수 있는 방법을 찾았다. 

 

PHPExcel 다운로드

- https://github.com/PHPOffice/PHPExcel 에 들어가서 다운로드를 해준다.

 

 

XLSX 엑셀 파일의 데이터 읽어오기

<?php			

    require_once "./PHPExcel-1.8/Classes/PHPExcel.php"; // PHPExcel.php을 불러옴.	
    $objPHPExcel = new PHPExcel();	
    require_once "./PHPExcel-1.8/Classes/PHPExcel/IOFactory.php"; // IOFactory.php을 불러옴.
    $filename = './testFile.xlsx'; // 읽어들일 엑셀 파일의 경로와 파일명을 지정한다.
    
    
    try {		// 업로드 된 엑셀 형식에 맞는 Reader객체를 만든다.		
    
        $objReader = PHPExcel_IOFactory::createReaderForFile($filename);	
        // 읽기전용으로 설정		
        $objReader->setReadDataOnly(true);		// 엑셀파일을 읽는다	
        $objExcel = $objReader->load($filename);		// 첫번째 시트를 선택	
        $objExcel->setActiveSheetIndex(0);	
        $objWorksheet = $objExcel->getActiveSheet();	
        $rowIterator = $objWorksheet->getRowIterator();		
    
        foreach ($rowIterator as $row) { // 모든 행에 대해서		
            $cellIterator = $row->getCellIterator();		
            $cellIterator->setIterateOnlyExistingCells(false); 	
        }

        $maxRow = $objWorksheet->getHighestRow();

        for ($i = 0 ; $i <= $maxRow ; $i++) {		
            $dataA = $objWorksheet->getCell('A' . $i)->getValue(); // A열		
            $dataB = $objWorksheet->getCell('B' . $i)->getValue(); // B열		
            $dataC = $objWorksheet->getCell('C' . $i)->getValue(); // C열		
            $dataD = $objWorksheet->getCell('D' . $i)->getValue(); // D열		
            $dataE = $objWorksheet->getCell('E' . $i)->getValue(); // E열		
            $dataF = $objWorksheet->getCell('F' . $i)->getValue(); // F열        
            // 날짜 형태의 셀을 읽을때는 toFormattedString를 사용			
            $dataF = PHPExcel_Style_NumberFormat::toFormattedString($dataF, 'YYYY-MM-DD'); 	
        }	

    } catch (exception $e) {	
        echo '엑셀파일을 읽는도중 오류가 발생하였습니다.<br/>';	
    }	
?>

출처: https://thereclub.tistory.com/53 [강남부자:티스토리]

 

 

require_once "./PHPExcel-1.8/Classes/PHPExcel.php";
require_once "./PHPExcel-1.8/Classes/PHPExcel/IOFactory.php";

require_once를 사용할 경우에는, 설치한 PHPExcel의 위치를 지정해줘야 하므로 위의 코드를 그대로 사용하기 위해서는 PHPExcel폴더를 프로젝트의 root 위치에 놓는다. 

 

 

내가 받았던 엑셀 데이터는 sheet가 총 8장까지 존재했기 때문에 

위에 코드에서 for문을 추가하여 

$objExcel->setActiveSheetIndex();

sheet의 index를 지정해주는 부분에 $i 값을 넣고 자동으로 데이터를 가져와 저장시키도록 변경 

 

그리고, 나머지 부분은 딱히 건드릴 부분은 없다.

 


이제 xlsx 파일의 데이터를 받아올 준비는 끝났지만, 파일안에 데이터들이 어떤식으로 작성되어있고, 어떤 데이터를 가져오고 싶은지에 따라서 코드를 달리해줘야한다.

 

$objWorksheet->getCell("가져올 셀위치")->getValue();

getCell() 메소드안에 가져오고 싶은 셀 위치를 넣어주면 된다.

위의 사진처럼, 각각의 셀 위치가 있는데 B2 위치의 데이터를 가져오고 싶으면 

getCell("B2")를 적어주면 된다. 

 

맨위에 나와있듯이 for문같은 반복문을 사용해서  "A" . $i  아니면, "A{$i}" 이런식으로 작성하여 셀위치를 변경시켜줄 수 있다. 


데이터 저장전 전처리 

 

xlsx에 있는 데이터는 줄바꿈 ("\n")이 포함되어있지만, 이것을 그대로 DB에 저장하게 되면, 나중에 이 데이터를 가져와서 뿌려주는 경우에는 제대로된 개행이 되어있지 않을 수 있기 때문에, 데이터를 넣어주기전에 전처리해주는 과정이 필요하다. 

 

str_replace("바꿀 대상", "바꿀 문자", "대상 문자열");

PHP의 str_replace()를 이용하면, 문자열안에 있는 특정 문자를 다른 문자로 변경할 수 있습니다.

 

$a1_data = $objWorksheet->getCell("A1")->getValue();
str_replace("\n", "<br />", $a1_data);

A1위치의 데이터를 받아와서, "\n"문자열을 "<br />"로 변경시켜 DB에 저장하게 된다면, 나중에 DB로부터 데이터를 받아 올 경우에 제대로 개행을 포함한 문자열이 출력될 수 있게 됩니다. 

 

 

 


한 번 도전해볼 것 

PHPExcel 를 require_once로 불러오는 것이 아니라, library에 등록하여서 사용할 수 있도록 변경해보기