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을 설치에서 코드를
짠 다음에 만들면
똑 같은 소스로 엑셀 다른 버전이 깔린 서버에서 동작 안 하는 경우가 생깁니다.
그야 말로 캐 곤란;;
두 번째로 권한 설정
시작 -> 프로그램 -> 관리도구 -> 구성요소서비스를 실행 시키죠.
그럼 트리 메뉴가 보이는데 상단 콘솔 루트의 하위 루트인 구성 요소 서비스에서
구성 요소 서비스 -> 컴퓨터 -> 내 컴퓨터 -> 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 |