본문 바로가기
PHP

[PHP] xlsx writer로 엑셀파일 생성하기.

by teamnova 2023. 3. 9.
728x90

안녕하세요! 개발을 하다보면 특정 정보들을 엑셀로 작성해야할 때가 있는데요 오늘은 xlsx writer 라이브러리를 사용해서 엑셀 파일을 생성하는 것을 함께 살펴보도록하겠습니다. 

 

1.xlsx writer?

PHP에서 엑셀문서를 만들 수 있는 외부라이브러리는 여러가지가 있습니다. phpSpreadsheet 나 php excel 등등, 그러나 오늘은 xlsx writer을 사용해보겠습니다.

  • PHP 5.2.1 이상부터 사용할 수 있으며 쓰기만 지원합니다. 
  • UTF-8 인코딩된 입력을 사용합니다. 그리고 다중 워크시트 사용이 가능합니다.
  • 통화/날짜/셀 형식, 간단한 공식 및 기본 셀 스타일링을 지원합니다.
  • 속도가 매우 빠르고 가벼움에도 대용량 10만 개 이상의 행 스프레드시트 작성할 수 있다는 장점이 있습니다.

사용할 수 있는 포맷(서식)은 아래와 같습니다.

포맷 포맷 코드
string @
integer 0
date YYYY-MM-DD
datetime YYYY-MM-DD HH:MM:SS
time HH:MM:SS
price #,##0.00
dollar [$$-1009]#,##0.00;[RED]-[$$-1009]#,##0.00
euro #,##0.00 [$€-407];[RED]-#,##0.00 [$€-407]

 

사용가능한 스타일 값은 아래와 같습니다.

font
(폰트)
         
Arial, Times New Roman, Courier New, Comic Sans MS
font-size
(폰트 사이즈)       
8,9,10,11,12 ...
font-style
(폰트 스타일)
bold, italic, underline, strikethrough or multiple ie: 'bold,italic'
border
(외곽선)
left, right, top, bottom, or multiple ie: 'top,left'
border-style
(선 스타일)
thin, medium, thick, dashDot, dashDotDot, dashed, dotted, double, hair, mediumDashDot, mediumDashDotDot, mediumDashed, slantDashDot
border-color
(선 색상)
#RRGGBB, ie: #ff99cc or #f9c
color
(폰트 색상)
#RRGGBB, ie: #ff99cc or #f9c
fill
(셀 색상)
#RRGGBB, ie: #eeffee or #efe
halign
(수평정렬)
general, left, right, justify, center
valign
(수직정렬)
bottom, center, distributed

 

xlsx writer 라이브러리는 아래 링크를 통해 다운받으실 수 있습니다. 

https://github.com/mk-j/PHP_XLSXWriter

 

GitHub - mk-j/PHP_XLSXWriter: Lightwight XLSX Excel Spreadsheet Writer in PHP

Lightwight XLSX Excel Spreadsheet Writer in PHP. Contribute to mk-j/PHP_XLSXWriter development by creating an account on GitHub.

github.com

 

2.예제

 

2-1 기본 사용

<?php

//스타일 및 포맷 미적용 된 기본 사용법.

include_once("xlsxwriter.class.php"); //다운로드한 파일에서 해당 php 파일을 include 시킨다.
$writer = new XLSXWriter(); //xlsxwriter 객체 생성
$file_name = "test.xlsx"; //파일이름 

$data = array( 
    array('year','month','amount'), //첫번째 줄에 들어가는 부분 
    array('2003','1','220'), //두번째 줄 
    array('2003','2','153.5'), //세번째 줄
);

$writer->writeSheet($data);//엑셀에 해당 정보 입력
$writer->writeToFile($file_name);//파일로 다운로드

?>

 

2-2 포맷(서식) 및 스타일 적용

 

<?php

//스타일 및 포맷 적용 사용법.

include_once("xlsxwriter.class.php"); //다운로드한 파일에서 해당 php 파일을 include 시킨다.
$writer = new XLSXWriter(); //xlsxwriter 객체 생성
$file_name = "test_format_style.xlsx"; //파일이름 
$sheet_name = "test"; //시트이름

//헤더에서 포맷 설정 // '첫번째 줄에 들어가는 값' = > 포맷
$header = array(
  'created'=>'date', 
  'product_id'=>'integer',
  'quantity'=>'#,##0',
  'amount'=>'price',
  'description'=>'string',
  'tax'=>'[$$-1009]#,##0.00;[RED]-[$$-1009]#,##0.00',
);

//헤더 이후 들어가는 값들을 array에 넣어준다.
$data = array( 
    array('2015-01-01',873,1,'44.00','misc','=D2*0.05'),
    array('2015-01-12',324,2,'88.00','none','=D3*0.05'),
);

//스타일 값 정의
$styles = array( 
  'font'=>'Arial',
  'font-size'=>10,
  'font-style'=>'bold',
  'fill'=>'#eee',
  'halign'=>'center',
  'border'=>'left,right,top,bottom'
 );

//헤더 작성
$writer->writeSheetHeader($sheet_name,$header);//(파람1: 시트명,파람2: 위에서 정의한 헤더)

foreach($data as $row){
	//한줄씩 지정된 시트에 값 작성.
	$writer->writeSheetRow($sheet_name,$row,$style);//시트이름,시트에 들어가는 값들,스타일
}

$writer->writeToFile($file_name);//파일명으로 파일 생성

?>

 

2-3 복수 시트 사용

 

<?php

include_once("xlsxwriter.class.php");

//헤더 값 및 서식 지정
$header = array(
    'year'=>'string',
    'month'=>'string',
    'amount'=>'price',
    'first_event'=>'datetime',
    'second_event'=>'date'
);

//작성할 값1
$data1 = array(
    array('2003','1','-50.5','2010-01-01 23:00:00','2012-12-31 23:00:00'),
    array('2003','=B2', '23.5','2010-01-01 00:00:00','2012-12-31 00:00:00'),
    array('2003',"'=B2", '23.5','2010-01-01 00:00:00','2012-12-31 00:00:00'),
);

//작성할 값2
$data2 = array(
    array('2003','01','343.12','4000000000'),
    array('2003','02','345.12','2000000000'),
);

//xlsx writer 객체 생성
$writer = new XLSXWriter();

//Sheet1에 헤더 작성(첫번째 헤더명: Sheet2) 
$writer->writeSheetHeader('Sheet1', $header);

//Sheet1라는 이름으로 생성된 시트에 데이터 쓰기.
foreach($data1 as $row){
	$writer->writeSheetRow('Sheet1', $row);
}

//Sheet2라는 이름으로 생성된 시트에 데이터 쓰기. 
foreach($data2 as $row){
	$writer->writeSheetRow('Sheet2', $row);
}

$writer->writeToFile('xlsx-sheets.xlsx');
//$writer->writeToStdOut();
//echo $writer->writeToString();

exit(0);

?>

 

2-4 행 너비 및 높이 지정 

<?php
set_include_path(get_include_path().PATH_SEPARATOR."..");
include_once("xlsxwriter.class.php");

$file_name = 'xlsx_size_option.xlsx';

$writer = new XLSXWriter();//객체 생상
//첫번째 파라미터:시트명, 두번째 파라미터: 셀에 순서대로 들어가는 값, 세번째 파라미터: 가로 및 세로 옵션 값.
$writer->writeSheetHeader('Sheet1', $rowdata = array(300,234,456,789), $col_options = ['widths'=>[10,20,30,40]] );
$writer->writeSheetRow('Sheet1', $rowdata = array(300,234,456,789), $row_options = ['height'=>20] );
$writer->writeSheetRow('Sheet1', $rowdata = array(300,234,456,789), $row_options = ['height'=>30] );
$writer->writeSheetRow('Sheet1', $rowdata = array(300,234,456,789), $row_options = ['height'=>40] );
$writer->writeToFile($file_name);

?>

 

이외에도 셀 병합 등, xlsx writer는 엑셀과 관련한 여러 옵션들을 제공하고 있습니다. 

 

자세한 내용은 위의 링크 참고바랍니다.