WEB&J2EE

Hagi 2011. 8. 18. 11:50

(원래 글쓴 사람 : 박주용, payletter)

보통 웹서버에서 파일들의 다운로드를 많이 사용합니다.

방법은 헤더에 "ConentType"을 추가하면 원하는 파일형식으로 표현하여 다운로드를 지원 할 수 있는데요

그 중 Microsoft Word와 Mocrosoft Excel은 HTML을 별도의 가공 없이 클라이언트 웹단에 보여지는 HTML정보를
쉽게 다운받을 수 있는 어플리케이션
이 입니다.

그 이유는 다른 어플리케이션과는 다르게 Microsoft Word와 Mocrosoft Excel이 HTML을 인식 할 수 있기 때문에
다른 가공작업 없이 Excel과 Word 파일로 다운로드를 할 수 있는 것입니다.

Excel과 Word가 HTML을 인식할 수 있다?

아래의 예시로 이해가 가능합니다.

우선 HTML 소스가 있습니다.

<table border="1">
    <tr>
        <td>순번</td>
        <td>이름</td>
        <td>키</td>
    </tr>
    <tr>
        <td>1</td>
        <td>황성규</td>
        <td>178</td>
    </tr>
    <tr>
        <td>2</td>
        <td>조재영</td>
        <td>182</td>
    </tr>
    <tr>
        <td>3</td>
        <td>박주용</td>
        <td>188</td>
    </tr>
    <tr>
        <td>4</td>
        <td>조정훈</td>
        <td>152</td>
    </tr>
</table>

해당 HTML 소스를 저장합니다.

HTML을 임시로 이름을 exeltext.html로 저장 하였습니다.



그리고, 파일의 확장자를 doc로 변경(저장)
Word에서 파일을 열어보면 해당 테이블이 보여집니다.

  
  [저장한 파일]
  


  [워드로 실행한 화면]

그리고 파일의 확장자를 xls로 변경(저장)
Excel에서 파일을 열어보면 해당 테이블이 그대로 보여지는 것을 확인 할 수 있습니다.


 [저장한 파일]



 [엑셀로 실행한 화면]

위의 예에서 보여지듯이 HTML을 지원 하기 때문에 별도의 가공 없이 HTML을 Excel이나 Word파일로
손쉽게 다운로드 할 수 있는 것입니다.

참고로 아래는 각 웹언어별로 Exel과 Word로 다운로드를 할때에 추가하는 헤더 값입니다.
(php와 asp는 헤더 값을   예~~~~~~~전에(전 대학교를 다니고 있었습니다) 이희진 팀장님께서 올려주신 글이 있네요. 
  - [2631] 웹페이지 다운로드시 Excel,Word로 저장  )

ASP.Net

Excel Down
    Response.AddHeader("content-disposition", "attachment;filename=DataGrid.xls");
    Response.ContentType = "application/vnd.xls";   혹은    Response.ContentType = "application/vnd.ms-excel";
Word Down
    Response.AddHeader("content-disposition", "attachment;filename=DataGrid.doc");
    Response.ContentType = "application/vnd.word";  혹은 Response.ContentType = "application/vnd.ms-word";


asp

Excel Down
    Response.AddHeader "Content-Disposition","attachment; filename=paylist.xls"
    Response.ContentType = "application/vnd.xls" 혹은 Response.ContentType = "application/vnd.ms-excel"
Word Down
    Response.AddHeader "Content-Disposition","attachment; filename=paylist.doc"
    Response.ContentType = "application/vnd.word" 혹은 Response.ContentType = "application/vnd.ms-word"

PHP

Excel Down
    Header("Content-Disposition: attachment; filename=paylist.xls");
    Header("Content-type: application/vnd.xls"); 혹은 Header("Content-type: application/vnd.ms-excel");
Word Down
    Header("Content-Disposition: attachment; filename=paylist.xls");
    Header("Content-type: application/vnd.word"); 혹은 Header("Content-type: application/vnd.ms-word");   

JSP

Excel Down
    <%@ page language="java" contentType="application/vnd.ms-excel; charset=euc-kr"%>
    response.setHeader("Content-Description", "JSP Generated Data");  
    response.setHeader("Content-Disposition", "attachment;filename=ServieRequestList.xls");
Word Down
    <%@ page language="java" contentType="application/vnd.word; charset=euc-kr"%>
    response.setHeader("Content-Description", "JSP Generated Data");  
    response.setHeader("Content-Disposition", "attachment;filename=ServieRequestList.doc");


감사합니다.

수고하세요


==== 추가(by Hagi) ==========================================================================

daisky86님이 아래와 같이 질문, 답을 주셨는데... 그 이유에 대해서 설명할까한다. 

(Q)엑셀 2003버전으로 .xls는 가능하지만 .xlsx(2007버전)은 되지 않네요;;

2007버전 부터는 위의 기능을 제공하지 않는 건가요?

(A)

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 변경하고 

HttpContext.Current.Response.AddHeader("Content-Disposition:", "attachment;filename=EXCEL"); 하면 파일 다운로드 시 사용할 프로그램 엑셀로 하면 열리네요 ~

그런데 HttpContext.Current.Response.AddHeader("Content-Disposition:", "attachment;filename=EXCEL.xlsx"); 

확장자를 넣어 다운로드를 받아 파일을 열면 파일형식 또는 확장명이 잘못되서 "EXCEL.xlsx'파일을 열 수 없습니다. 파일이 손상되지 않았는지, 파일 확장명이 파일 형식과 일치하는지 확인하십시오 라고 경고창이 나오고 열리지 않고 Excel.xlsx에서 확장자명을 xls로 바꿔서 열면 열리네요 ;ㅁ; 

좀 더 고민해봐야겠어요 ~


[이유 설명] - 박정환 사원의 도움을 얻었음

http://forums.sdn.sap.com/thread.jspa?threadID=1726392 에서 답변 중 하나를 보면,


현재버전으로는 API정의상 힘든것으로 보입니다.

downloadPdforXls.jsp의 내용중에서

확장자를 xlsx로 변경하고, contenttype을

application/vnd.ms-excel -> application/vnd.openxmlformats-officedocument.spreadsheetml.sheet(excel2007 통합문서)

로 변경하더라도 

실제 파일속성이 맞지 않아 열리지가 않습니다.

해당 contenttype으로 문서를 만들때 사용되는 BinaryView 속성에 대한 설명이 아래 링크와 같이

Excel2003만 고려되어 있기 때문인 것으로 보입니다.


(http://devlibrary.businessobjects.com/businessobjectsxi/en/en/RE_SDK/resdk_dg_doc/doc/customizing_webintelligence_EN/ewucw_052.html참조)



여기서 참조를 따라가 보면, JSP에서 엑셀 파일을 보여주기 위해 BinaryView라는 API를 쓰고 있다는 것을 알게된다. 

BinaryView의 API를 보면, getMimeType이라는 메서드가 있는데... http://help.sap.com/javadocs/boe/xi/ws/en/com/businessobjects/dsws/bicatalog/Document.html#getMimeType()


getMimeType

public java.lang.String getMimeType()
Return the mime type of the Document. 
Supported Business Objects Document types:
  • application/x-rpt (Crystal Report)
  • application/rep (Full Client)
  • application/wid (Webi Document)

Supported third party document mime-types:
  • application/msword (doc)
  • application/vnd.ms-powerpoint (ppt)
  • application/vnd.ms-excel (xls)
  • application/pdf (pdf)
  • application/zip (zip)
  • application/rtf (rtf)
  • application/winhlp (hlp)
  • video/msvideo (avi)
  • video/mpeg (mpg, mpeg)
  • text/plain (txt)
  • text/html (html)
  • text/xml (xml)
  • image/jpeg (jpeg)
  • image/gif (gif)
  • image/bmp (bmp)
  • audio/x-wav (wav)
  • application/x-msaccess (mdb)
  • application/x-mswrite (wri)
  • application/octet-stream

Returns:
a string containing the mime type.


아직 xlsx를 포함하고 있지 않다. 

좋은 정보 감사합니다~
위의 html로 테스트를 해보았는데요
엑셀 2003버전으로 .xls는 가능하지만 .xlsx(2007버전)은 되지 않네요;;
2007버전 부터는 위의 기능을 제공하지 않는 건가요?
답변 부탁드려요 ^^
안드로이드 폰에 무슨 어플을 깔았는데 답변달렸다고, 바로 연락오네요 ㅋ
아무튼 한번 찾아봤는데요. 저희 고객은 xlsx로 요구하지 않아서 테스트 못해봤습니다.
외쿡아저씨가 자신있게 올린 답변이라 걍 올립니다.
(혹시 잘되시면, 댓글 좀 달아주세요 ㅋ)

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); // this is for Excel 2007
// response.setContentType("application/vnd.ms-excel"); // this is for Excel 2003
response.setHeader("Content-disposition", "attachment; filename=" + filename);
response.setHeader("Pragma", "no-cache");

출처 : http://www.coderanch.com/t/132258/gc/JSP-EXCEL-save-defualt-xls
결국 인식을 하느냐 마느냐는 Header의 세팅을 어떻게 하느냐 겠죠...?
답변 감사합니다 +_+
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 변경하고
HttpContext.Current.Response.AddHeader("Content-Disposition:", "attachment;filename=EXCEL"); 하면 파일 다운로드 시 사용할 프로그램 엑셀로 하면 열리네요 ~
그런데 HttpContext.Current.Response.AddHeader("Content-Disposition:", "attachment;filename=EXCEL.xlsx");
확장자를 넣어 다운로드를 받아 파일을 열면 파일형식 또는 확장명이 잘못되서 "EXCEL.xlsx'파일을 열 수 없습니다. 파일이 손상되지 않았는지, 파일 확장명이 파일 형식과 일치하는지 확인하십시오 라고 경고창이 나오고 열리지 않고 Excel.xlsx에서 확장자명을 xls로 바꿔서 열면 열리네요 ;ㅁ;
좀 더 고민해봐야겠어요 ~
오늘 시간이 남아서 찾아보니, JSP에서 사용하는 Api에서 아직 xlsx를 지원하지 않는군요~ 덕분에 좋은 공부가 되었습니다.