php_writeexcel 이용 xls 파일 생성
php를 이용해 xls 파일을 생성할 때는 PHPExcel를 이용하는 게 편하다. 그런데 PHPExcel은 최소 php 5.2이상이어야 사용할 수 있는데(사이트를 방문해보니 PHPExcel 2.0부터는 php 5.3) 배포형 솔루션에 PHPExcel을 탑재하는 것은 쉬운 일은 아니다. 그래서 다른 라이브러리를 찾게 되었는데 여러 가지 중 php_writeexcel을 선택하게 됐다. 오래전에 배포된 버전이라 최신 버전에 맞지 않을 것 같아서 고려하지 않았던 라이브러리인데 xml 형태로 xls 파일을 만들어주는 라이브러리를 사용해보니 엑셀에서 열 때 파일형식이 다르다는 경고가 나와서 php_writeexcel을 선택하게 됐다.
php_writeexcel 사이트 : http://www.bettina-attack.de/jonny/view.php/projects/php_writeexcel/
위 사이트에서 다운로드한 파일을 압축해제 후 웹서버에 업로드 하고 예제 페이지를 참고해 코드를 작성하면 된다. 아래는 이번에 작업하면서 작성한 코드로 주문정보를 xls 파일로 저장한다.
/*================================================================================
php_writeexcel http://www.bettina-attack.de/jonny/view.php/projects/php_writeexcel/
=================================================================================*/
include_once('./lib/php_writeexcel/class.writeexcel_workbook.inc.php');
include_once('./lib/php_writeexcel/class.writeexcel_worksheet.inc.php');
$fname = tempnam("/tmp", "tmp-orderlist.xls");
$workbook = new writeexcel_workbook($fname);
$worksheet = $workbook->addworksheet();
// Put Excel data
$data = array('우편번호', '주소', '이름', '전화1', '전화2', '상품명', '수량', '선택사항', '배송비', '상품코드', '주문번호', '운송장번호', '전하실말씀');
$data = array_map('iconv_euckr', $data);
<?php
$col = 0;
foreach($data as $cell) {
$worksheet->write(0, $col++, $cell);
}
for($i=1; $row=mysql_fetch_array($result); $i++) {
$sendcost = iconv_euckr(($row['sendcost'] ? '착불' : '선불'));
$row = array_map('iconv_euckr', $row);
$worksheet->write($i, 0, $row['zip1'].'-'.$row['zip2']);
$worksheet->write($i, 1, $row['addr1'].' '.$row['addr2']);
$worksheet->write($i, 2, $row['name']);
$worksheet->write($i, 3, $row['tel']);
$worksheet->write($i, 4, $row['hp']);
$worksheet->write($i, 5, $row['item']);
$worksheet->write($i, 6, $row['qty']);
$worksheet->write($i, 7, $row['option']);
$worksheet->write($i, 8, $sendcost);
$worksheet->write($i, 9, $row['item_id']);
$worksheet->write($i, 10, $row['order_id']);
$worksheet->write($i, 11, $row['invoice']);
$worksheet->write($i, 12, $row['memo']);
}
$workbook->close();
header("Content-Type: application/x-msexcel; name="orderlist-".date("ymd", time()).".xls"");
header("Content-Disposition: inline; filename="orderlist-".date("ymd", time()).".xls"");
$fh=fopen($fname, "rb");
fpassthru($fh);
unlink($fname);
exit;
?>
위 코드에서는 DB의 문자셋이 utf-8이기 때문에 utf-8 문자를 euc-kr로 변환해주는 iconv_euckr 함수를 사용했다. 이 함수의 코드는 아래와 같다.
function iconv_euckr($str)
{
return iconv('utf-8', 'euc-kr', $str);
}
배열에 저장된 값에 문자변환 함수를 적용하기 위해 array_map 함수를 사용했다. 그리고 코드에는 DB에서 자료를 가져오는 코드는 빠져있다. 이 부분은 직접 작성해야 하며 위 코드를 참고해서 자신의 환경에 맞는 코드로 수정해서 사용하면 된다.
그리고 한가지 주의할 것이 있는데 이 코드를 테스트할 때 php 5.3에서 진행했는데 php_writeexcel 사이트에서 받은 라이브러리를 그대로 사용하게 되면 에러가 발생한다. 에러 내용을 보고 코드를 수정해도 되고 아래 첨부된 class 파일을 사용해도 된다. 모든 코드를 완벽하게 수정한 것은 아니고 에러가 나오지 않도록 수정한 정도이기 때문에 만약 에러가 발생한다면 직접 수정해서 사요하는 게 좋을 것 같다.
class 파일 다운로드 : php_writeexcel
참고 : http://stackoverflow.com/questions/3930975/alternative-for-php-excel