IT/PHP

[PHP] php spreadsheet + mysql db 연동 #composer #컴포저 #phpspreadsheet엑셀다운 #php엑셀파일다운

월공 2020. 6. 24. 16:12
728x90
300x250

기존에 자주 사용하였던 php excel 다운로드는 header 에만 엑셀 껍데기를 뒤집어 씌우는 방식이었는데

이 방법에는 사소한(?) 문제가 있다

 

아래와 같은

"""

xls 의 파일 형식 및 확장명이 일치하지 않습니다. 파일이 손상되었거나 안전하지 않을 수 있습니다. 데이터 원본을 신뢰하지 않는다면 파일을 열지 마세요. 그래도 파일을 여시겠습니까?

"""

라는 경고창이 뜬다는것, 물론 (예) 를 누르면 열리긴한다

그리고 실제 엑셀파일이 아니므로 모바일에서도 열리지 않는다

이걸 해결해준 방법이 바로 PHP Spreadsheet 였는데

우선 spreadsheet 를 사용하려면 php composer 가 필요한데 node 의 npm 과 같은 존재라고 보면된다

쉽게말하면 그냥 필요한 라이브러리들 가져와다 쓸수있게 해주는 편리한 패키지~!

 

사실 기존에 회사에서 쓰던 PHP 버전이 5 버전대라서 composer 를 엄두도 못내고 있었는데 이번에 centos 6 에서 8로 아예 업그레이드 시키면서 php 7.3 버전대로 가고 composer 도 쓸수있게되어서 사용하게됐다

 

여튼 composer 를 이용해서 내가 진행하고있는 프로젝트 내부에서 설치가 정상적으로 된다면 vendor 라는 폴더가 하나 생길꺼고, 아래 소스는 vendor 라는 폴더가 정상적으로 설치되있고, php spreadsheet 가 이상없이 설치되어있다는 가정하에 돌아가는 소스이다

 

이 망할 엑셀 다운로드 파일은 상단에 띄어쓰기도 용납을 안하고 주석 도 용납하지않는거같다

안열리는 엑셀파일만 40개 가량 열어보는 뻘짓을 하고난 이후에 ... 정상작동하는거 확인하게됐다

<?
	require_once '/vendor/autoload.php';	
	
    //DB 연동부분
	include $_SERVER["DOCUMENT_ROOT"]."/common/inc/db.php";

	$query  = "  SELECT 쿼리문  ";	
	
	$result = mysqli_query($connect,$query);	

	while ($row = mysqli_fetch_array($result)){	     
	     $datas[] = $row;
	}	

	$cells = array(
	    'A' => array(15, '컬럼명1', '엑셀에 보여질 컬럼명1'),
	    'B' => array(20, '컬럼명2', '엑셀에 보여질 컬럼명2'),
	    'C' => array(20, '컬럼명3', '엑셀에 보여질 컬럼명3')   	    
	);		

	use PhpOffice\PhpSpreadsheet\Spreadsheet;
	use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

	$spreadsheet = new Spreadsheet();
	$sheet = $spreadsheet->getActiveSheet();

	foreach ($cells as $key => $val) {
	    $cellName = $key.'1';
 
	    $sheet->getColumnDimension($key)->setWidth($val[0]);
	    $sheet->getRowDimension('1')->setRowHeight(25);
	    $sheet->setCellValue($cellName, $val[2]);
	    $sheet->getStyle($cellName)->getFont()->setBold(true);
	    $sheet->getStyle($cellName)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
	    $sheet->getStyle($cellName)->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
	}

	for ($i = 2; $row = array_shift($datas); $i++) {
	    foreach ($cells as $key => $val) {
	        $sheet->setCellValue($key.$i, $row[$val[1]]);
	    }
	}

	$filename = '파일명';

	header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
	header('Content-Disposition: attachment; filename="'.$filename.'.xlsx"');

	$writer = new Xlsx($spreadsheet);
	$writer->save('php://output');

?>
728x90
300x250