엄지월드

PHP를 이용하여 Dialogflow의 json 파일을 export해서 Excel로 저장하기 본문

PHP

PHP를 이용하여 Dialogflow의 json 파일을 export해서 Excel로 저장하기

킨글 2019. 8. 8. 21:49
반응형

PHP를 이용하여 Dialogflow의 json 파일을 export해서 Excel로 저장하기 예제입니다.

약간의 하자가 있지만.. 흐름만 익히시고 업무에 도움 되시길 바랍니다^^

저는 이정도만 돼도 잘 사용하고 있네요~

(3번 순서까지 가면 예제 파일이 같이 첨부되어 있습니다)

 

1. Dialogflow에서 intent를 json 파일로 export 합니다.

 

2. 압축을 풀고, Intent 파일 안에 있는 json으로 변환된 질문 POOL들을 폴더 안에 몰아넣습니다.

 

3. 코드 예제 파일입니다. 

저는 Autoset으로 서버를 구축하고,

http://127.0.0.1/temp/dialogflowExport.php 링크로 접속해서 작동을 확인하였습니다.

dialog.zip
3.49MB

PHP 알고리즘 요약 

1) 폴더에 있는 json 파일명을 모두 읽어온다.

2) json 파일을 읽으면서 엑셀에 저장한다. 

3) 엑셀을 다운로드 한다. 

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

<?php include './../PHPExcel-1.8/Classes/PHPExcel.php'; // 엑셀 라이브러리 import ?>
<?php
// 파읽을 읽을 폴더 위치 지정
$dir = "./dialogflowIntent/";

// 핸들 획득
$handle  = opendir($dir);
$files = array();

// 디렉터리에 포함된 파일을 저장한다.
while (false !== ($filename = readdir($handle))) {
    if($filename == "." || $filename == ".."){
        continue;
    }
    // 파일인 경우만 목록에 추가한다.
    if(is_file($dir . "/" . $filename)){
        $files[] = $filename;
    }
}

// 핸들 해제
closedir($handle);

// 정렬, 역순으로 정렬하려면 rsort 사용
sort($files);

// 파일명을 출력한다.
// foreach ($files as $f) {
//     echo $f;
//     echo "<br />";
// }
?>

<?php

ini_set('memory_limit','-1');
set_time_limit(10000); //

//다운로드 시 파일명 설정
$fileName = 'excelTemp';
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set document properties
$objPHPExcel->getProperties()->setCreator("Me")->setLastModifiedBy("Me")->setTitle("My Excel Sheet")->setSubject("My Excel Sheet")->setDescription("Excel Sheet")->setKeywords("Excel Sheet")->setCategory("Me");
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// 첫번째 행의 값 넣기
$objPHPExcel->getActiveSheet()
      ->setCellValue('A1', 'id')
      ->setCellValue('B1', 'name')
      ->setCellValue('C1', 'speech')
;

$ii = 2; // 2번째 행부터 입력
 foreach ($files as $f) {
     // echo $f;
     $searchName = "usersays_ko"; // json 파일마다 형식이 다르기 때문에 이름 별로 구분해준다.
     $searchName1 = "- yes.json";
     $searchName2 = "- no.json";
     if( strpos($f, $searchName ) !== false){
       // echo $f;
       $arr = json_decode(file_get_contents("./dialogflowIntent/".$f), true);
       $aaaa = array();
       foreach ($arr as $f){
         // echo $f["data"][0]["text"]."<br/>";
         array_push($aaaa, $f["data"][0]["text"]); // 이상하게 0번 배열이 아닌 1번 배열을 넣으면 에러가 난다.
       }
       if(strcmp($aaaa[0], "네") && strcmp($aaaa[0], "아니오")){
          $objPHPExcel->getActiveSheet()->setCellValue('D'.$ii, $aaaa[0]);
         $ii++;
       }
     }else{
       if( strpos($f, $searchName1 ) != true){
         if( strpos($f, $searchName2 ) != true){
           $arr = json_decode(file_get_contents("./dialogflowIntent/".$f), true);
           $objPHPExcel->getActiveSheet()->setCellValue('A'.$ii, $arr["id"]);
           $objPHPExcel->getActiveSheet()->setCellValue('B'.$ii, $arr["name"]);
           $objPHPExcel->getActiveSheet()->setCellValue('C'.$ii, $arr["responses"][0]["messages"][0]["speech"]);
         }
       }
     }
 }

 // Set worksheet title
 $objPHPExcel->getActiveSheet()->setTitle($fileName);
 //save the file to the server (Excel2007)
 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
 $objWriter->save('.\\' . $fileName . '.xlsx'); // 저장될 파일 위치

 // 파일 다운로드 구현
 function mb_basename($path) { return end(explode('/',$path)); }
 function utf2euc($str) { return iconv("UTF-8","cp949//IGNORE", $str); }
 function is_ie() {
   if(!isset($_SERVER['HTTP_USER_AGENT']))return false;
   if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) return true; // IE8
   if(strpos($_SERVER['HTTP_USER_AGENT'], 'Windows NT 6.1') !== false) return true; // IE11
   return false;
 }
 $filepath = '.\excelTemp.xlsx';
 $filesize = filesize($filepath);
 $filename = mb_basename($filepath);
 if( is_ie() ) $filename = utf2euc($filename);

 header("Pragma: public");
 header("Expires: 0");
 header("Content-Type: application/octet-stream");
 header("Content-Disposition: attachment; filename=\"$filename\"");
 header("Content-Transfer-Encoding: binary");
 header("Content-Length: $filesize");
 ob_clean();
 flush();
 readfile($filepath);

 // unlink('.\excelTemp.xlsx') // 생성된 excel 파일 삭제

?>
</body>

 

Comments