나는 초보다 :: [JSP]엑셀 excel 다운로드 파일 만들기 (한글깨짐, 숫자 포함)

달력

5

« 2019/5 »

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  


<%@ page language="java" contentType="application/vnd.ms-excel; name='excel', text/html; charset=UTF-8"

        pageEncoding="UTF-8"%>

 

1. 첫번째 방법

<%     
    response.setHeader("Content-Disposition", "attachment; filename=diary.xls"); 
    response.setHeader("Content-Description", "JSP Generated Data"); 
    response.setContentType("application/vnd.ms-excel");
%>

 
 

2. 두번째 방법
<%@ page contentType="application/vnd.ms-excel;charset=euc-kr" %>
<%
    response.setHeader("Content-Disposition", "attachment; filename=LIST.xls");
    response.setHeader("Content-Description", "JSP Generated Data");
%>

 
 

3. 세번째 방법 (한파일에 기본 페이지와 엑셀 다운로드 설정할때)

<%

 if(actionKind.equals("Search")){
     response.setContentType("text/html; charset=euc-kr");
 }else{
     response.setHeader("Content-Disposition", "attachment; filename=diary.xls"); 
     response.setHeader("Content-Description", "JSP Generated Data"); 
     response.setContentType("application/vnd.ms-excel");
 }
 %>

 

4. 네번째 방법 (한글 제목에 브라우저별 처리)

titleName = "한글제목";

titleName = new String(titleName.getBytes("KSC5601"), "8859_1");

if(clientBrowser.indexOf("MSIE 5.5")>-1 || clientBrowser.indexOf("MSIE 6.0") > -1 ){
  response.setHeader("Content-Type", "doesn/matter;");
  response.setHeader("Content-Disposition", "filename="+titleName+".xls");
}else{
  response.setHeader("Content-Type", "application/vnd.ms-excel;charset=EUC-KR");
  response.setHeader("Content-Disposition", "attachment; filename="+titleName+".xls");
}

response.setHeader("Content-Transfer-Encoding", "binary;");
response.setHeader("Pragma", "no-cache;");
response.setHeader("Expires", "-1;");

 

 

=========================================================================================================================

=========================================================================================================================

한글깨짐

 

head 에 다음과 같은 처리를 같이 해주면 왠만하면 해결이 된다.

 

<META HTTP-EQUIVE="CONTENT-TYPE" CONTENT="TEXT/HTML; CHARSET=KSC5601">

 or
response.reset(); // response 버퍼를 비우고 respose 값을 세로 세팅

=========================================================================================================================

=========================================================================================================================

 

운영서버에서는 한글이 다 깨지는데 개발서버에서는 제대로 나와서 더 해결방법 찾기가 난감했다.

jsp 소스를 운영 거로 업어치고 나서도 여전히 잘만 보이는 개발서버 쪽 엑셀.. 뭐가 문제냐. ㄱ-

DB 상의 데이터까지 운영 쪽으로 맞추니 그제서야 한글이 깨지기 시작했다.

그럼 문제는 데이터라는 소리인데.. 어떻게 봐도 한글이 깨질 건수가 안 보였다.

 

웹 상에 떠도는 한글 깨짐 방지 태그라는

<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">

이 녀석을 써 봐도 여전히 묵묵부답..

 

하지만 해결책은 간단했다.

엑셀 녀석이 데이터를 인코딩 태그로 인식하는 경우가 간혹 생기는데

데이터 타입 앞에 &nbsp;만 입력해주면 끝. 아주 깨끗하게 잘 나온다.

 

<td>&nbsp;<%= crset.getString(1) %></td>  ← 이런 식으로

 

 

=========================================================================================================================

=========================================================================================================================

 

 

숫자형식 엑셀에서 표현하기

==  사용법  ==

<style type="text/css">

td {mso-number-format:000000;}

</style>

또는

<td align='center' style='mso-number-format:000000'>

 

000000 : 소수도 여섯자리 정수 (반올림)로 표현된다. 여섯자리 앞의 빈칸은 0으로 채워짐

            1.23 => 000001, 67.67 => 000068

000.000 : 소수자리 세자리까지 (반올림) 표현된다. 앞 뒤 빈칸은 0으로 채워짐

             format은 0.00 인데 숫자가 15.1 인 경우 15.10으로 표현됨

             1.5678 => 001.568

\@ : 셀형식을 텍스트형으로 표현

        00035.90 인 경우 셀 형식이 숫자형이라면 35.9로 표현되지만 문자형으로 하면 0을 포함하여 보이는 그대로 표현됨

 

 

 

 

그 외 mso-number-format 요소들

mso-number-format:"0"                       
        NO Decimals 
mso-number-format:"0\.000"                       
        3 Decimals 
mso-number-format:"\#\,\#\#0\.000"                       
        Comma with 3 dec 
mso-number-format:"mm\/dd\/yy"                       
        Date7 
mso-number-format:"mmmm\ d\,\ yyyy"                       
        Date9 
mso-number-format:"m\/d\/yy\ h\:mm\ AM\/PM"                       
        D -T AMPM 
mso-number-format:"Short Date"                       
        01/03/1998 
mso-number-format:"Medium Date"                       
        01-mar-98 
mso-number-format:"d\-mmm\-yyyy"                       
        01-mar-1998 
mso-number-format:"Short Time"                       
        5:16 
mso-number-format:"Medium Time"                       
        5:16 am 
mso-number-format:"Long Time"                       
        5:16:21:00 
mso-number-format:"Percent"                       
        Percent - two decimals 
mso-number-format:"0%"                         
        Percent - no decimals 
mso-number-format:"0\.E+00"                       
        Scientific Notation 
mso-number-format:"\@"                         
        Text 
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)

 

 

한 셀 안에서 줄바꿈

<style>   

.xl24   {mso-number-format:"\@";}   

br      {mso-data-placement:same-cell;}   

</style> 


출처 :  http://blog.naver.com/tyboss/70038694288 

=================================================================================================

<%@ page language="java" contentType="application/vnd.ms-excel; name='excel', text/html; charset=UTF-8"

        pageEncoding="UTF-8"%>

그런데 왜인지는 모르겠지만 아래와 같이 선언해주면 엑셀에서 글자가 보이지 않는다.. 한글, 숫자 모두..


그래서 아래와 같이 선언해주니까 잘 보이긴 하는데 이유는 모르겠다
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
 
 UTF-8로 써야 할때 방법은 다시 찾아봐야겠다
Posted by 꼬렙