Programming/PHP

[PHP, MySQL]엑셀 파일 업로드 및 쿼리 적용하기

Rexter 2019. 8. 20. 17:08
반응형

0. 준비물

 엑셀 파일 업로드에 사용 할 라이브러리 를 다운 받을 수 있는 링크입니다.

 http://opensource.box.com/spout/getting-started/

 

Getting Started

This guide will help you install Spout and teach you how to use it. Requirements PHP version 7.1 or higher PHP extension ext-zip enabled PHP extension ext-xmlreader enabled Installation Composer (recommended) Spout can be installed directly from Composer.

opensource.box.com

요구 사항이 있긴 한데 그냥 최신 php 를 사용하고 있으면 기본은 되는 거 같네요.

설정 파일을 열어서 extensions 를 찾아 봤는데 보이지가 않더군요.

따로 설치를 해야 되나 싶었는데 그냥 되서 사용 중이니 이 부분은 참고 부탁드립니다.

 

 라이브러리를 처음 이용해 보려고 했을 때 참 막막하더군요.

 깊게 생각 할 거 없이 다운 받아서 웹서버 기본 경로에 압축해제 를 해 주면 됩니다.

 사용 할 때는 해당 경로를 지정해서 파일을 불러와 주는 방식으로 사용하면 되고요.

 

1. MySQL 연결(pdo 이용)

 우선 php.ini 파일을 텍스트편집기로 연 후 extension=pdo_mysql 을 검색 한 후 주석(;)을 제거 한 후 웹서버를 재시작 해 줍니다.

 테스트용 php 파일을 하나 만든 후 <body></body> 사이에 다음 내용을 입력하시면 됩니다.

<?php

$host='localhost'; //서버주소

$dbname='mydb'; //db명

$username='root'; //id

$userpw='1234'; //비번

try {

  $pdo = new PDO('mysql:host='.$host.';dbname='.$dbname, $username, $userpw);

} catch (PDOException $e) {

  echo 'DB 접속 실패 : '.$e->getMessage().', 위치 : '.$e.getFile(). ' : '.$e->getLine();

}

?>

 

접속 성공 확인을 위해서는 try {} 안에 echo 문을 넣어서 성공 여부를 확인 하면 됩니다만 여기선 생략하겠습니다.

 

2. 폼 사용해서 파일 업로드 하기

 <body></body> 사이에 다음 내용을 입력합니다.

<form enctype="multipart/form-data" action="" method="post">

파일 선택<br/>

<input id="selectfile" type="file" name="upload"/><br/>

<input type="submit"/>

</form>

 이 방법은 같은 파일 안에서 php를 이용해 업로드된 파일을 처리할 때 사용하는 방법입니다.

 action="" 부분에서 "" 사이에 다른 파일의 경로를 입력하는 등의 방법으로 다른 파일로 전달해서 사용할 수도 있습니다만, 우선 기본적인 사용방법만 설명하도록 하겠습니다.

 

3. 라이브러리 불러오기

 서버 데이터가 있는 곳에 libs폴더를 만들고 아까 받았던 라이브러리를 압축해제 해 줬습니다.

 <form></form> 밑에 <?php ?>를 지정해 준 후 다음 내용을 추가해 주면 됩니다.

 

 

  use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;

  require_once $_SERVER['DOCUMENT_ROOT'].'/libs/Spout/Autoloader/autoload.php';

 

  경로는 설치한 환경에 따라 달라질 수 있습니다.

  앞에 $_SERVER['DOCUMENT_ROOT'] 부분은 절대 경로로 서버의 경로를 지정한 것입니다.

 

4. 업로드 한 파일 저장하기

  HTML 을 이용해서 파일을 업로드 하면 임시 저장공간에만 파일이 위치하게 됩니다.

  때문에 파일을 복사해 주는 과정이 필요하게 됩니다.

  업로드한 파일을 복사해주는 함수가 있으니 그걸 이용하면 됩니다.

 

move_uploaded_file($_FILES['upload']['tmp_name'], "./file/{$_FILES['upload']['name']}");

 

./file 부분은 루트 디렉토리에 있는 file 이라는 디렉토리안에 파일을 옮기겠다는(복사한다는) 의미입니다.

리턴값을 가지는 함수 이기 때문에 제대로 되었을 경우에만 다음 코드들을 실행하고자 한다면 if문을 이용한 후 참일 때 실행되도록 할 수 있습니다.

 

5. 파일 읽어들이기

  변수를 하나 만들고 업로드한 파일이 위치한 경로를 지정해 줍니다.

$filename = $_SERVER['DOCUMENT_ROOT'].'/file/'.$_FILES['upload']['name'];

 

$reader = ReaderEntityFactory::createReaderFromFile($filename);

$reader->open($filename);

 

라이브러리를 이용해서 파일을 불러오는 거라 따로 설명은 안 하겠습니다.

 

6. db에 입력

 이 부분은 아무래도 제대로 된 데이터가 없어서 그냥 막 한 거라 많이 허접합니다.

 

foreach($reader->getSheetIterator() as $sheet){

  foreach($sheet->getRowIterator() as $row){

    $cells = $row->getCells();

    $myquery = 'insert into mydata set date="';

    $i=0;

    foreach ($cells as $value) {

      $valArray[$i++] = $value;

    }

    $myquery .= $valArray[0].'", name="'.$valArray[1].'", phone="'.$valArray[2].'", age='.$valArray[3];

    $pdo->exec($myquery);

    }

  }

$reader->close();

 

  첫번째 foreach 문은 시트를 불러오는 부분입니다.

  두번째 foreach 문은 각 행을 불러오는 부분입니다.

  한 행을 불러 올 때 마다 쿼리문을 실행하도록 코드를 작성해 놓았으니 이 부분 참고 하시면 될 것 같습니다.

  쿼리에 바로 적용하기 보다는 우선 생성되는 myquery 를 출력해 보고 이상이 없을 때 적용하시는 게 좋습니다.

 

7. 전체 코드 내용

 

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

<form enctype="multipart/form-data" action="" method="post">

  파일 선택<br/>

  <input id="selectfile" type="file" name="upload"/><br/>

  <input type="submit"/>

</form>

<?php

  $host='localhost';

  $dbname='mydb';

  $username='root';

  $userpw='1234';

  try {

    $pdo = new PDO('mysql:host='.$host.';dbname='.$dbname, $username, $rootpw);

  } catch (PDOException $e) {

    echo 'DB 접속 실패 : '.$e->getMessage().', 위치 : '.$e.getFile(). ' : '.$e->getLine();

  }

 

  use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;

  require_once $_SERVER['DOCUMENT_ROOT'].'/libs/Spout/Autoloader/autoload.php';//라이브러리 블러오기

  if(isset($_FILES['upload'])){

    move_uploaded_file($_FILES['upload']['tmp_name'], "./file/{$_FILES['upload']['name']}");

    $filename = $_SERVER['DOCUMENT_ROOT'].'/file/'.$_FILES['upload']['name'];

 

    $reader = ReaderEntityFactory::createReaderFromFile($filename);

    $reader->open($filename);

 

    foreach($reader->getSheetIterator() as $sheet){

      foreach($sheet->getRowIterator() as $row){

      $cells = $row->getCells();

      $myquery = 'insert into mydata set date="';

      $i=0;

      foreach ($cells as $value) {

        $valArray[$i++] = $value;

      }

      $myquery .= $valArray[0].'", name="'.$valArray[1].'", phone="'.$valArray[2].'", age='.$valArray[3];

      $pdo->exec($myquery);

    }

  }

  $reader->close();

}

?>

</body>

</html>

반응형