Server.CreateObject("Excel.Application") 을 이용하여 엑셀을 출력하는 방법

 

보통 asp를 통해서 웹에서 엑셀 양식을 만들어서 클라이언트로 줄 때

아래와 같은 방법을 많이 사용하는 것 같습니다.

Response.ContentType = "application/vnd.ms-excel"

Response.CacheControl = "public"

Response.AddHeader "Content-Disposition","attachment;filename=파일명.xls"

 

저도 주로 저 방법을 많이 썼는데;;

저것의 단점은 만들어진 엑셀파일이 진정한 엑셀 파일이 아닌, 헤드만 엑셀이고..

파일 자체는 html로 되어 있어서 엑셀에서 열 때 엑셀이 파싱해서 보여준다는 것.

여하튼 그런것이라서 클라이언트가 완전한 엑셀 파일을 원할 때 곤란한 점이 --;

 

예를 들어 내부 전자 결제 시스템에 바로 올리고 싶다거나 할 때;; 물론 처음에 방식으로

만들어진 파일을 열어서 다른이름으로 저장하시면 OK

겠지만 그걸 싫어하시는 클라이언트가 있어서

헤딩식으로 Server.CreateObject("Excel.Application")을 사용했던거 같네요.

정보가 별로 없어서 고생 했었다는....

 

아래에 기술하는 부분은 거의 다 추론해서 이것 저것 해보고 아 그런 것 같구나~

해서 주석을 단것이라 틀릴수도 있습니다. >_<

 

Server.CreateObject("Excel.Application")의 최대 단점은 객체를 생성할 때 서버에

엑셀이 하나에 하나씩 떠야 한다는 거겠네요그래서 엄청 느리져.. 엄청나게;;

멀티스레딩이 안되는 느낌이라고나 해야할까.... 여튼 그러네요;;

그래서 객체를 열면 반듯이 닫아 줘야 합니다.

그렇지 않으면 작업관리자의 프로스세를 보면 엄청난 수의 EXECEL.EXE를 볼수 있어요

 

그럼 Server.CreateObject("Excel.Application") 사용 하기 위한 기본 준비~!

 

첫 번째로 먼저 서버에 엑셀이 깔려 있어야 합니다

당연 한가요?

엑셀의 버전 별로 사용법에 차이가 있습니다엑셀 2007을 설치에서 코드를

짠 다음에 만들면

똑 같은 소스로 엑셀 다른 버전이 깔린 서버에서 동작 안 하는 경우가 생깁니다.

그야 말로 캐 곤란;;

해결방안은?? 흠 저는 낮은 버전의 excel로 했답니다;;

 

두 번째로 권한 설정

시작 -> 프로그램 -> 관리도구 -> 구성요소서비스를 실행 시키죠.

그럼 트리 메뉴가 보이는데 상단 콘솔 루트의 하위 루트인 구성 요소 서비스에서

구성 요소 서비스 -> 컴퓨터 -> 내 컴퓨터 -> DCOM구성 로 갑니다.

그럼 DOM구성이라는 하위 트리가 보입니다.

DCOM구성 -> Microsoft Excel 응용 프로그램 -> 속성

 

 

속성을 여시고..

속성 -> 보안탭 -> 시작 및 활성화 권한 -> 사용자 지정(선택)

추가 -> IUSR_컴퓨터이름(인터넷 게스트 계정추가

인터넷 게스트 계정의 사용 권한 -> 로컬 시작로컬 활성화 (체크)

ID 탭에서 대화형 사용자로 변경~

 

다시 DCOM구성으로 돌아가셔서..

DCOM구성 - {000C101C-0000-0000-C000-000000000046} -> 속성

속성 -> 보안탭 -> 시작 및 활성화 권한 -> 사용자 지정(선택)

추가 -> IUSR_컴퓨터이름(인터넷 게스트 계정추가

인터넷 게스트 계정의 사용 권한 - 로컬 시작로컬 활성화 (체크)

 

참고 문서 http://support.microsoft.com/?kbid=257757

 

이상으로 준비 과정이였습니다.

 

 

이제 asp 소스

Set xlApp = Server.CreateObject("Excel.Application")

객체를 만들고..

xlApp.Visible = True

서버에서 엑셀이 만들어지는 과정을 볼 수 있습니다;;

다 만들고 나서 주석처리를 해도 무방하겠네요.

 

 

Set xlWorkbook = xlApp.Workbooks.Add

xlApp.Sheets.Add

엑셀에 쉬트를 추가합니다처음에 만들면 기본적으로 3개가 만들어져 있습니다.

쉬트가 5개라면 for문등으로 2번 더 돌리면 되겠네요.

만들어진 시트는 최초 시트의 맨 처음으로 가게 됩니다.

그래서 그래서 시트를 마지막으로 옴킬 필요가 생길지도 모름니다.

xlApp.Sheets("Sheet2").Move(xlApp.Sheets(1))

위에 구문은 그 예로써 sheet2라는 이름을 가진 시트를 전체 시트 중에서

첫 번째로 이동시킨다라는 뜻 입니다.

 

 

시트의 이름을 바꿔주고 싶은 경우가 있습니다.

xlApp.Sheets("Sheet1").Name = “바꾸고싶은시트이름

이라고 해주면 sheet1의 이름이 바뀜니다.

 

이제 전체 페이지의 스타일을 정합니다.

 

xlApp.Sheets("Sheet1").Select        첫번째 시트를 선택한 후

이후의 .select 라고 되어 있는건, 우선 위의 줄에서

시트를 선택 했기 때문에 되는 것입니다.

시트를 선택 하지 않고 xlSheet.Range("A2").Select  등의 명령어를 날리면

오류 납니다.~

 

 

xlSheet.Cells.Select

           With xlApp.Selection

                     .ColumnWidth = 2.44

                     .RowHeight = 17

                     .HorizontalAlignment = -4108       가운데 정렬~

                     .Font.Name = "굴림"

                     .Font.FontStyle = "보통"

                     .Font.Size = 9

           End With

넓이는 2.44 높이는 17로 해라 등등의 뜻이져. -4108은 엑셀에 있는 상수입니다.

가운데 정렬이라는 뜻입니다상수를 찾는 법은 잠시 후에~

 

하나씩 바꿀 수도..

xlSheet.Range("A2").Select           ‘A2셀을 선택한 후

xlApp.Selection.ColumnWidth = 8.5           넓이는 8.5로 머 이런뜻..

 

데이터를 넣을때는

xlSheet.Range("A2") = "글자

위와 같이 넣습니다.

 

이제 저장을 하고 싶습니다.

저장을 하고 싶은 폴더의 권한을 인터넷 익명엑세스가 가능하게 권한을 설정하신후에

xlApp.DisplayAlerts = False

이라고 넣습니다.

이유는 저장할 때 같은 파일등이 있으면 경고가 나오는데 그게실행되고 있는 서버의 엑셀에서

나오는것이기 때문에 안나오게 해야 합니다.

 

프로그래밍 적으로 파일 이름이 겹치지 않게 해야겠져?

 

그 담에 저장을 합니다.

Filename = “로컬경로\겹치지않는파일네임.xls”

예를들어

Filename  = “D:\newfile.xls”

xlApp.ActiveWorkbook.SaveAs(Filename)

이러면 저장이 됩니다.

 

저장이 된 후에는 객체를 닫어야져.

xlWorkbook.Close

xlApp.Quit

set xlWorkbook = nothing

set xlApp =  nothing



[참고]마이크로소프트는 서버에서 excel개체가 실행되는 것은 권장하고 있지 않음


주소 : http://support.microsoft.com/default.aspx?scid=kb;ko;257757


 


[참고]정 사용을 원하면 ADO를 사용하라고 되어있습니다.


주소 : http://support.microsoft.com/default.aspx?scid=kb;EN-US;278973


'asp' 카테고리의 다른 글

ASP - > excel  (0) 2008.12.10
Response.ContentType CONTENTSTYPE 종류들  (2) 2008.12.10
ASP+ORACLE  (0) 2008.12.04
asp + Oracle 페이징  (0) 2008.12.04
Preventing SQL Injections in ASP  (0) 2008.10.28

+ Recent posts