Dev Blog

스크립트 & 소스코드 공유

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

4건의 글

PHP 엑셀 업로드 시 날짜·시간 변환 함수

PHP에서 엑셀 파일을 업로드할 때 날짜/시간 값을 일반 날짜 형식으로 변환하는 함수 excelformatTime()을 소개한다. 값에 '-'가 포함된 문자열이면 strtotime으로 변환하고, 그렇지 않은 엑셀 시리얼 숫자면 기준값 25569에서 (값-25569)*3600*24로 환산해 Y-m-d H:i:s 형식으로 반환한다.

function excelformatTime($timevalue){

if(strpos($timevalue,"-")){
$time =  strtotime($timevalue);
}else{
$time =  intval(($timevalue- 25569) * 3600 * 24);
}
return date('Y-m-d H:i:s', $time);
}

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) // 음수는 색깔을 따르게 표시

그누보드 전체 회원 정보를 엑셀로 저장하는 PHP 소스

그누보드에서 전체 회원 정보를 엑셀 파일로 저장하는 PHP 소스다. _common.php 파일이 있는 경로(예: /adm/)에 파일을 만들고 소스를 붙여넣으면 되며, 관리자 모드로 접속해야 다운로드가 가능하다. 2019년 1월 15일 업데이트로 탈퇴한 회원은 목록에서 제외되도록 수정되었다.

  • '_common.php'파일 있는 경로(예. /adm/)에 파일하나 만들고 아래 소스 복붙하시면 됩니다.

(관리자모드에서 진입해야 다운로드 가능)

[update]

190115 : 탈퇴인원 제외

<?php
include_once("./_common.php");
include_once(G5_LIB_PATH.'/PHPExcel.php');

if (!$is_admin =="super")
alert_close("최고 관리자 영역 입니다.");

function column_char($i) { return chr( 65 + $i ); }

$headers = array('번호', 'ID', '이름', '닉네임', '레벨', '포인트', '가입일', 'Email', '홈페이지', '성별', '생일', '전화', '휴대폰', '메일링', '정보공개', '최근로그인', '주소');
$widths  = array(18, 15, 15, 15, 15, 15, 15, 50, 20, 20, 20, 20, 20, 20, 20, 20, 100);
$header_bgcolor = 'FFABCDEF';
$last_char = column_char(count($headers) - 1);

$sql    = " select * from g5_member where mb_leave_date = '' order by mb_datetime desc ";
$result = sql_query($sql);
for($i=1; $row=sql_fetch_array($result); $i++) {

if ($row['mb_sex'] =="M") { $mb_sex ="남자"; } else if ($row['mb_sex'] =="F"){ $mb_sex ="여자"; }
if ($row['mb_mailling'] =="1") { $mb_mailling ="받음"; } else if ($row['mb_mailling'] =="0"){ $mb_mailling ="안받음"; }
if ($row['mb_open'] =="1") { $mb_open  ="공개"; } else if ($row['mb_open'] =="0"){ $mb_open ="비공개"; }
$rows[] =
array(
$i,
$row[mb_id],
$row[mb_name],
$row[mb_nick],
$row[mb_level],
$row[mb_point],
$row[mb_datetime],
$row[mb_email],
$row[mb_homepage],
$mb_sex,
$row[mb_birth],
$row[mb_tel],
$row[mb_hp],
$mb_mailling,
$mb_open,
$row[mb_today_login],
print_address($row['mb_addr1'], $row['mb_addr2'], $row['mb_addr3'], $row['mb_zip1'])
);
}

$data = array_merge(array($headers), $rows);

$excel = new PHPExcel();
$excel->setActiveSheetIndex(0)->getStyle( "A1:${last_char}1" )->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB($header_bgcolor);
$excel->setActiveSheetIndex(0)->getStyle( "A:$last_char" )->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setWrapText(true);
foreach($widths as $i => $w) $excel->setActiveSheetIndex(0)->getColumnDimension( column_char($i) )->setWidth($w);
$excel->getActiveSheet()->fromArray($data,NULL,'A1');

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"members-".date("ymd", time()).".xls\"");
header("Cache-Control: max-age=0");

$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
$writer->save('php://output');
?>


Let's create something great together.

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