ASP를 이용하여 엑셀 파일을 만드는 방법에는 여러 가지가 있다. 여기에는 웹 서버 쪽에서 작업을 하게 하는 방법도 있고, 클라이언트 쪽에서 작업을 하게 하는 방법이 있다. 이 중 여기서는 클라이언트 쪽에서 작업을 하게 하는 방법에 대해 살펴볼 것이다. 이 방법은 아주 간단하면서도 필요할 경우 유용하게 사용할 수 있다.

이 강좌의 내용을 배우고 나면 다음과 같은 결과물을 만들 수 있을 것이다.

우선 해야할 일은 엑셀 파일에 삽입할 표를 하나 만드는 것이다. 다음과 같은 내용이 들어 있는 HTML 코드를 작성해 보도록 하자.

회사 주소록

ASP에서 엑셀 파일을 만드는 방법에 대한 예제입니다.

날짜 이름 내선번호 부서 주소
2001.08.01 Daniel Joe 4286 미디어 사업부 서울시 서초구 서초동 1306-6
2001.08.02 Peter Lee 4285 연구소 서울시 서초구 방배 2동 1234-56
2001.08.14 Tapestry 4280 전략 기획실 경기도 과천시 원문동 2번지

이제 위에서 작성한 HTML 태그 앞에 다음과 같은 ASP 코드를 삽입하도록 하자.

<%
Response.Buffer = TRUE
Response.ContentType = "application/vnd.ms-excel"
%>

이렇게 해서 만들어진 결과물은 다음과 같다:

엑셀 프로그램이 설치되어 있을 경우 위 링크를 클릭하면 브라우저 상에서 직접 엑셀 파일로 열어볼 수가 있다. 만일 설치되어 있지 않다면 클라이언트 컴퓨터로 다운로드 받을 수 있다. 이렇듯 웹 페이지의 내용을 동적으로 엑셀 파일로 만들어 낼 수가 있다.

이렇게 해서 실행된 결과 화면은 다음과 같다:

이와 관련된 전체 ASP 코드를 살펴 보면 다음과 같다:

<%
Response.Buffer = TRUE
Response.ContentType = "application/vnd.ms-excel"
%>

<html>
<head></head>
<body>
<p><b><font color="blue" size="5">회사 주소록</font></b></p>
<p><font color="navy" size="2">ASP에서 엑셀 파일을 만드는 방법에 대한 예제입니다.</font></p>
<table border="1" cellpadding="5" cellspacing="0" align="center" width="100%" bordercolordark="white"
bordercolorlight="black">
<tr>
<th bgcolor="#EFEFEF">날짜</th>
<th bgcolor="#EFEFEF">이름</th>
<th bgcolor="#EFEFEF">내선번호</th>
<th bgcolor="#EFEFEF">부서</th>
<th bgcolor="#EFEFEF">주소</th>
</tr>
<tr>
<td align="CENTER">2001.08.01</td>
<td align="CENTER">Daniel Joe</td>
<td align="CENTER">4286</td>
<td align="CENTER">미디어 사업부</td>
<td align="CENTER">서울시 서초구 서초동 1306-6</td>
</tr>
 
<tr>
<td align="CENTER">2001.08.02</td>
<td align="CENTER">Peter Lee</td>
<td align="CENTER">4285</td>
<td align="CENTER">연구소</td>
<td align="CENTER">서울시 서초구 방배 2동 1234-56</td>
</tr>
 
<tr>
<td align="CENTER">2001.08.14</td>
<td align="CENTER">Tapestry</td>
<td align="CENTER">4280</td>
<td align="CENTER">전략 기획실</td>
<td align="CENTER">경기도 과천시 원문동 2번지</td>
</tr>
 
</table>
</body>
</html>

마찬가지로, ASP 코드로 삽입된 MIME 타입을 약간만 수정하면 웹 페이지의 내용을 워드 파일이나 파워포인트 파일로 생성해 낼 수 있다.

워드 파일

<%
Response.Buffer = TRUE
Response.ContentType = "application/msword"
%>

파워 포인트 파일

<%
Response.Buffer = TRUE
Response.ContentType = "application/vnd.ms-powerpoint"
%>

위의 MIME 타입을 바꾼 결과를 직접 확인하려면 아래 링크를 클릭해 보기 바란다.

지금까지 살펴 본 방법은 응용하기에 따라 간단하면서도 유용한 팁이 될 수 있다. 만일 데이터베이스와 결합하여 사용한다면 좀 더 유용할 것이다.

지금 현재 보고 있는 웹 페이지 앞 부분에 Response.ContentType = "application/msword" 부분만 삽입하여 동적으로 워드 파일을 만든 결과는 다음과 같다.

2007/11/22 15:01 2007/11/22 15:01

<object runat="server" progid="ADODB.Recordset" id="rs"></object>
<object runat="server" progid="ADODB.Recordset" id="oRs"></object>
<object runat="server" progid="ADODB.Connection" id="dbCon"></object>

<object runat="server" progid="CDONTS.NewMail" id="objMail"></object>

 

<%

 

Response.Expires = -1
Response.AddHeader "Pragma", "no_cache"
Response.AddHeader "cache-control", "no_cache"

 

Const dbConStr = "Provider=SQLOLEDB.1;Initial Catalog=BIZ_INFO;Data Source=localhost;User ID=User;PWD=PW"

dbCon.Open("dbConStr")


dbCon.BeginTrans   '트랜잭션을 시작


SQL = "insert into office(idx, o_name,addr) values "
SQL = SQL & " (" & request("id") & ""
SQL = SQL & ",'" & request("name") & "'"

SQL = SQL & ",'" & request("addr") & "'"


dbCon.execute SQL

 

If dbCon.errors.count > 0 then

   dbCon.RollbackTrans     '에러일 경우 이전상태로 복구

   Response.write "<script language='javascript'>"&chr(13)
   Response.write " alert('데이터를 저장하는중 에러가 발생하였습니다.\n관리자에게 문의하시기 바랍니다.');"&chr(13)
   Response.write " history.back();"&chr(13)
   Response.write "</script>"&chr(13)
   dbCon.Close

   Response.end
Else

   dbCon.CommitTrans      '에러가 없을 경우 완료

   Response.write "<script language='javascript'>"&chr(13)
   Response.write " alert('데이터가 성공적으로 처리되었습니다.');"&chr(13)
   Response.write "</script>"&chr(13)
   dbCon.Close
End If

Response.Redirect "office_list.asp

%>

2007/11/22 15:01 2007/11/22 15:01

◇ ASP에러 처리의 처음과 끝

JSP가 갖고 있는 장점중의 하나가 Exception(Error)처리가 뛰어 나다는 것입니다. 철저한 Exception Class를 상속해 가면서 마치

작은 그물에서 큰 그물로 이어가는 에러 처리 기법은 프로그래머를 매우 정신적으로 여유있게 해주는 기능 중에 하나 입니다.

ASP의 경우 3.0으로 업그레이드 되면서 ASPError객체를 제공함으로써 기존의 Err객체의 단점을 개선하기는 했지만 이 역시도

내부서버오류 앞에서는 전혀 무용지물입니다.

아쉽지만 그래도 에러를 잡아 낼 수 있는 방법이 무엇이 있는지 알아 보도록 하겠습니다.

(참고로 자바스크립트 에러는 웹브러우저가 자동으로 에러를 찾아 줍니다.)


1. Response.End를 이용한 에러 잡아 들이기

에러를 잡는 가장 고전적인 방법입니다.

ASP코드의 중간에

Response.Write "여기 까지는 이상이 없습니다."

Response.End

라고 사용하면 에러가 발생되는 라인을 알아 낼 수 있는 방법입니다.

하지만 이 방법은 프로그램의 라인이 많으면 반복해서 사용해야 함으로 효율이 떨어지고 IE의 버퍼에

문제 있는 코드가 있다면 계속 오류 발생하여 버퍼를 다 지우고 IE를 모두 닫았다가 열어야 하는 번거로움이 있습니다.

하지만 위의 방법은 가장 간단하고 별 다른 코드 입력이 없기 때문에 아직도 많이 쓰여지고 있습니다.

특히 SQL문 실행 과정에서 에러가 나는 부분은 아래처럼 함으로 확인 할 수 있습니다.

esponse.Write sql

Response.end


2. Err객체를 이용한 에러 처리하기

아래와 같이 에러가 있는 파일을 작성합니다.

Err.asp로 저장하고 불러 옵니다.

<HTML><BODY>
<%
Dim su1, su2, hap, cha, gob, div
su1=100 : su2=0

hap=su1+su2 : cha = su1-su2 : gob = su1 * su2 : div = su1 / su2
Response.Write "두수의 더하기 : " & hap & "<BR>"
Response.Write "두수의 빼기: " & cha & "<BR>"
Response.Write "두수의 곱하기 : " & gob & "<BR>"
Response.Write "두수의 나누기 : " & div & "<BR>"
%>
</BODY></HTML>

위의 에러의 경우 전 두대의 컴퓨터로 테스트를 해보았습니다.

서버상에서의 결과 화면

다른 클라이언트에서의 결과 화면 입니다.

같은 에러에 대해서 다른 화면이 보이고 있습니다. 어떤 때는 에러의 원인이 보이고 어떤 때에는

골치아픈 HTTP 500 내부 서버 오류가 나오고 있습니다. IIS를 정지하고 버퍼를 지우고 다 해보았지만 결과는 같았습니다.

위의 경우 해결 방법은 Response.end를 중간 중간에 심어서 테스트 하는 1번의 방법을 이용하면 찾아 낼 수 있습니다.

이런 상황이 계속 되면 성질 급한 사람은 포기를 하던 아니면 오기로 매달리는 겁니다.밤 새도록...

이번에는 Err객체를 이용해서 에러를 잡아 보겠습니다. 아래의 소스처럼 수정하고 실행시킵니다.

Err2.asp로 저장하고 불러 옵니다.

<%
Option Explicit
On Error Resume Next
%>
<HTML><BODY>
<%
Dim su1, su2, hap, div

su1=100 : su2=0 : hap=su1+su2 : div = su1 / su2

Response.Write "두수의 더하기 : " & hap & "<BR>"
Response.Write "두수의 나누기 : " & div & "<BR>"

If Err.Number > 0 then
Response.Write "에러가 있습니다."
Err.Clear
else
Response.Write "에러가 없습니다."
End if

%>

</BODY></HTML>

아래는 2대의 컴퓨터의 결과 화면입니다. 자세히 원인은 모르지만 페이지 자체적으로 Err객체는 에러를 알아 내고 있습니다.

Option Explicit 는 변수 선언 확인문 입니다. 선언되지 않은 변수는 사용할 수 없어서 변수로 인한 오류를 막을 수 있는좋은 방법입니다.

On Error Resume Next문은 에러가 나도 계속 진행하라는 선언문입니다. 그래야 에러 원인을 알 수 있습니다.

Err.Number는 에러가 난 갯수를 갖고 있는 객체 입니다. 따라서 에러가 발생하면 에러 갯수로 에러를 알 수 있습니다.

Err.Clear는 반드시 선언해야 합니다. 에러를 Err객체 목록에서 지우는 역활을 합니다.

아래와 같이 소스를 수정하고 테스트 합니다.

Err3.asp로 저장하고 불러 옵니다.

<%
Option Explicit
On Error Resume Next
%>
<HTML><BODY>
<%
Dim su1, su2, hap, div

su1=100 : su2=0 : hap=su1+su2 : div = su1 / su2

Response.Write "두수의 더하기 : " & hap & "<BR>"
Response.Write "두수의 나누기 : " & div & "<BR>"

If Err.Number > 0 then
Response.Write "에러가 있습니다.<BR><BR>"
Response.Write "ASP에 지정된 에러 번호:" & Err.Number & "<BR>"
Response.Write "에러 원인 : " & Err.Description & "<BR>"
Response.Write "에러를 발생 시킨 객체 :" & Err.Source & "<BR>"
Err.Clear
else
Response.Write "에러가 없습니다.<BR>"
End if

%>

</BODY></HTML>

결과는 아래와 같습니다. 좀더 자세한 결과가 출력 되었습니다.

Err객체의 경우 어느 라인에서 에러가 났는지 알아낼 방법이 없습니다.


3. IE의 기능을 이용한 에러 잡기(HTTP 500 내부서버 오류 잡아냄)

아래처럼 소스를 작성하고 IE에서 확인 합니다. ("%>" ASP표식이 빠져있습니다.)

Err4.asp로 저장하고 불러 옵니다.

<HTML><BODY>
<%
Response.clear
Response.Write "A" & "<BR>"
Response.Write "B" & "<BR>"


</BODY></HTML>

아래는 결과 화면입니다. 역시 HTTP 500 - 내부 서버 오류가 뜹니다.

IE를 열고 [도구]메뉴의 [인터넷 옵션]을 클릭합니다.

[고급]탭의 [HTTP 오류 메시지 표시] 체크를 풀어 줍니다.

[확인]을 누르고 페이지를 다시 불러 온 결과입니다. 내부 서버 오류의 원인이 보이고 있습니다.

이 방법은 DB관련 내부서버 오류도 잡아 내는 기능을 갖고 있습니다.

위의 방법 중에서 3번이 가장 정확히 HTTP 500 - 내부 서버 오류를 찾아 냈습니다. 3번의 방법은 한번만 설정해 두면 편리할 것입니다.

평상시에 Option Explicit문을 선언하는 습관을 갖으셨으면 좋겠습니다.

그리고 Err객체도 완전한건 아니지만 많은 도움이 될 것입니다.


4. IIS에 사용자가 에러 페이지 만들어 추가하기

1. 아래의 내용을 error500.asp 로 해서 IIS 기본 웹사이트에 등록할 경우 c:\winnt\Help\iisHelp\common폴더에 저장합니다.


<%Set objError = Server.GetLastError%>

<html>
<body bgcolor=#fcffef>
<h4>에러 이름 : 500 내부 서버 오류입니다.</h4>
<hr>
ASPError.Number : 0x<%= Hex(objError.Number) %><br>
<font color="red">
ASPError.Source : <%= Server.HTMLEncode(objError.Source) %><br>
</font>
ASPError.Category : <%= objError.Category %><br>
ASPError.File : <%= objError.File %><br>
<font color="blue">
ASPError.Line : <%= objError.Line %><br>
ASPError.Column : <%= objError.Column %><br>
</font>
ASPError.Description : <%= objError.Description %><br>
<hr>
<input type="submit" value="다시 읽기" onclick="location.reload()">
<input type="submit" value="돌아가기" onclick="history.back()">

</body>
</html>

 

2. 에러를 적용하려는 프로젝트를 선택하고 [등록정보]로 들어갑니다.
 


3. [사용자 정의 오류]탭을 선택하고 500;100을 선택하고 [등록 정보 편집] 버튼을 클릭합니다.
 


4. 메시지 형식을 [URL]로 바꿉니다.
 


5. 메시지 형식을 URL로 지정하고 URL은 같은 사이트의 가상 디렉토리를 지정합니다.
    실제로 저는 기본 웹사이트를 사용함으로 IIS에서 열어보면
[/IISHelp/common/]이라는 폴더를 발견할 수 있습니다.
    이 가상 디렉토리는 실제로
c:\winnt\Help\iisHelp\common로 매핑 되어 있습니다.
 


6. 정상적으로 등록된 것이 보입니다.
 


7. 잘못된 ASP파일을 작성합니다. test.asp로 저장합니다.

<%
option explicit

Dim str

str = "<body>안녕하세요..?"
      & " 반갑습니다."

Response.Write str
%>
 


8. 에러 원인이 자세하게 출력 되었습니다.
 


9. 에러를 수정하고 다시 읽기 버튼을 누르면 결과가 제대로 보입니다.

수정된 test.asp파일

<%
option explicit

Dim str

str = "<body>안녕하세요..?" _
      & " 반갑습니다."

Response.Write str
%>


10. 정상적으로 출력 되었습니다.
 


2007/11/22 15:00 2007/11/22 15:00

약간의 꽁수로 자신의 홈페이지에 방문하는 분들에게 내 홈의 아이콘을
바탕화면에 설치되도록 할수 있습니다.
이미 알고계신분들고 계시겠지요..
엑티브엑스를 이용해서 만들려면 프로그래밍 못하는 사람들은 어림도 없죠..
아래 소스를 인덱스파일에 넣어주시면 해결됩니다.

<head> 와 </head> 사이에 넣어주셔야합니다.

<script language='JavaScript' SRC='http://inlive.co.kr/js/ShortCut.js'></script>
<script language='JavaScript'>
  MakeShortCut("아이콘제목", "홈페이지주소", "아이콘파일경로");
[ Ex.. MakeShortCut("바로가기","http://demo.webbut.com","http://demo.webbut.com/webbut.ico"); ]
</script>

 

원문 : http://www.nzeo.com/bbs/zboard.php?id=p_etc&page=1&sn1=&divpage=1&sn=off&ss=on&sc=off&select_arrange=hit&desc=desc&no=699

2007/11/22 15:00 2007/11/22 15:00