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에 등록하여서 사용할 수 있도록 변경해보기
'IT 공부 > PHP' 카테고리의 다른 글
[ PHP ] Selenium사용해서, 브라우저 자동화 테스트하기 (0) | 2022.06.14 |
---|---|
[ PHP ] PDF 파일을 이미지 파일로 ( convert PDF to image ) (0) | 2022.06.01 |
[ PHP ] CSV파일 내용 불러오기 (Spreadsheet 와 fgetcsv) (0) | 2022.03.02 |
[ PHP ] 연관배열에서 특정키(index)값이 존재하는지 확인하고 싶을 경우 (0) | 2022.02.20 |
[ PHP ] 디렉토리(폴더)에 있는 파일 리스트 가져오기 (0) | 2022.02.20 |