기존에 자주 사용하였던 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');
?>
'IT > PHP' 카테고리의 다른 글
[PHP] form 배열로 값이 안넘어간다 !!, php form array request error / php.ini max_input_vars (0) | 2020.07.21 |
---|---|
PHP5 에서 PHP7로 업그레이드시 문제가 되었던 점 (0) | 2020.07.19 |
[Composer] composer 설치시 오류 Your requirements could not be resolved to an installable set of packages. (0) | 2020.06.24 |
<?php ?> 에서 php 없이 쓰기 short open tag (0) | 2020.06.22 |
열뻗치는 PHP mail() 이용해서 메일보내기 mail header 부분 (0) | 2020.05.14 |