PHP

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

teamnova 2023. 3. 9. 12:00
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는 엑셀과 관련한 여러 옵션들을 제공하고 있습니다. 

 

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