Dev Blog

스크립트 & 소스코드 공유

실무에서 유용하게 쓰는 스크립트와 코드 조각을 블로그 게시판으로 저장하고 공유합니다.

2건의 글

PHP 엑셀 다운로드 시 숫자 앞자리 0이 사라지지 않게 하기

PHP에서 웹페이지 데이터를 엑셀 형식으로 내보낼 때 셀의 앞자리 0(예: 010...)이 사라지는 문제를 해결하는 방법이다. MIME 타입을 application/vnd.ms-excel로 설정하고, 데이터를 감싸는 td 태그에 vnd.ms-excel.numberformat:@ 스타일을 지정하면 셀이 텍스트 형식으로 출력되어 0이 유지된다. 날짜·숫자·통화·퍼센트 형식도 정리했다.

“首先,我们了解一下excel从web页面上导出的原理。

当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取它,

所以把mime类型设为:application/vnd.ms-excel,当excel读取文件时会以每个cell的格式呈现数据,如果cell没有规定的格式,则excel会以默认的格式去呈现该cell的数据。

这样就给我们提供了自定义数据格式的空间,当然我们必须使用excel支持的格式。

下面就列出常用的一些格式:

1) 文本:vnd.ms-excel.numberformat:@

2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd

3) 数字:vnd.ms-excel.numberformat:#,##0.00

4) 货币:vnd.ms-excel.numberformat:¥#,##0.00

5) 百分比:vnd.ms-excel.numberformat: #0.00%

这些格式你也可以自定义,比如年月你可以定义为:yy-mm等等。

那么知道了这些格式,怎么去把这些格式添加到cell中呢?很简单,我们只需要把样式添加到对应的标签对(即闭合标签)即可。

如,给标签对添加样式,如下:<td style="vnd.ms-excel.numberformat:@">410522198402161833</td>

PHP 엑셀 다운로드 시 셀 서식(mso-number-format) 지정하기

PHP로 데이터를 엑셀 파일로 저장할 때 핸드폰 번호 앞자리 0이 사라지는 문제를 해결하는 방법이다. 출력하는 td 태그의 style에 mso-number-format을 지정해 텍스트(\@) 형식으로 강제하고, 날짜·숫자·소수점·퍼센트·통화·과학 표기법 등 다양한 셀 서식 형식도 정리했다.

이벤트 참가자 정보를 엑셀로 저장하는데 핸드폰 번호 '010...' 가 숫자로 출력되니 '10...' 로 나온다.

원래대로 '010...' 으로 나오게 하려면 숫자가 아닌 텍스트로 출력해야 한다.

셀 서식 지정할 때는 데이터 출력하는 html의 style에 MSO FORMAT을 지정하면 된다.

header("Content-type: application/vnd.ms-excel; charset=UTF-8");
header("Content-Disposition: attachment; filename = userIdentify".date("YmdHis").".xls");
header("Content-Description: PHP5 Generated Data");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

// DB커넥션 파일(PDO)
require_once($_SERVER['DOCUMENT_ROOT'].'/Connection/dbconnect.php');

// 검색 조건 설정
...(생략)

// 데이터 조회
...(생략)

?>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
th,td{border:0.6px solid #666;}
th{background-color: yellow;}
</style>
</head>
<body>
<h3>Table</h3>
<table>
<tr>
<th>이름</th>
<th>전화번호</th>
</tr>
<? while($rows=$stmt->fetch(PDO::FETCH_ASSOC)){ ?>
<tr>
<td><?=$rows['userName']?></td>
<!--셀 서식을 Text로 지정-->
<td style="mso-number-format:'\@'"><?=$rows['userPhone']?></td>
</tr>
<? } ?>
</table>
</body>
</html>

검색해 보면 다른 타입도 많이 나온다. 그러나 실제 사용하는 건 텍스트 형식(\@) 정도인 듯 하다.

(텍스트로 지정 하면 데이터 출력하는 그대로 나온다.)

mso-number-format:"\@"

Text // 텍스트

mso-number-format:"0"

NO Decimals // 소수점 없음

mso-number-format:"0.000"

3 Decimals // 소수점 3자리까지

mso-number-format:"#\,##0.000"

Comma with 3 dec // 숫자 자릿수 구분(,)+소수점 3자리

mso-number-format:"mm\/dd\/yy"

월/일/연도 형식 (05/15/16)

mso-number-format:"mmmm\ d\,\ yyyy"

'mmmm' 하면 월을 영문으로 표시한다. (January 1,2016)

mso-number-format:"d-mmm-yyyy"

01-mar-1998 형식. 월 표기가 다르다.

mso-number-format:"Short Date"

01/03/1998 형식. 간단하게 지정

mso-number-format:"Medium Date"

01-mar-98

mso-number-format:"m\/d\/yy\ h\:mm\ AM\/PM"

날짜 + 시간을 AM/PM으로 구분해서 표시

mso-number-format:"Short Time"

5:16 // 시간만 간단하게

mso-number-format:"Medium Time"

5:16 am

mso-number-format:"Long Time"

5:16:21:00 // 밀리 초(ms) 단위까지

mso-number-format:"Percent"

Percent - two decimals // 퍼센트 기호 + 소수점 2자리까지

mso-number-format:"0%"

Percent - no decimals // 소수점 없는 퍼센트

mso-number-format:"0.E+00"

Scientific Notation // 엑셀에서 숫자 자릿수가 매우 클 때 줄여서 표시되는 그 형식..

mso-number-format:"#\ ???\/???"

Fractions - up to 3 digits (312/943) , 분수형식

mso-number-format:"\0022£\0022#\,##0.00"

£12.76 // 영국 파운드 기호로 통화 표시(원화 표시는 없을까?)

mso-number-format:"#\,##0.00_ \;[Red]-#\,##0.00\ "

2 decimals, negative numbers in red and signed(1.56 -1.56) // 음수는 색깔을 따르게 표시



Let's create something great together.

프로젝트 문의 및 견적 요청은 언제든 환영합니다.