Scriptom에 해당하는 글 2

Groovy 처음 시작하기 : Scriptom 설치

기타|2007. 11. 1. 23:40

Groovy에서 COM이나 ActiveX를 사용할 수 있게 해주는 모듈인 Scriptom을 설치해 보겠습니다.

Scriptom의 설치는 매우 간단합니다. Groovy를 설치한 후 몇 개의 관련 파일을 설치 폴더에 복사해 주기만 하면 됩니다.

Scriptom 설치를 위한 선행조건

  • Java 1.5 이상이 설치 되어 있어야 합니다(Scriptom 2.0은 Jacob 1.4를 사용하기 때문입니다)
  • Groovy 1.1이 설치 되어 있어야 합니다
  • GROOVY_HOME 환경 변수가 설정되어 있어야합니다(Groovy 설치 폴더를 가리키도록)

Scriptom 설치

먼저 Scriptom 페이지에서 가장 최신인 Scriptom 2.0 alpha Scriptom 2.0 (Beta) 버젼을 다운로드 다운로드 받습니다. 보통은 알파 버젼을 추천하지는 않겠지만, Scriptom은 2.0 버젼 부터는 하위 호환성을 보장하지 않기 때문에 2.0 버젼부터 시작하는 것을 추천합니다.

다시 말씀드리지만 설치는 간단합니다. 다운로드 받은 scriptom-2.0-alpha.zip 파일을 원하는 경로에 압축을 풀어주고 새로 생긴 폴더에 있는 jacob.dll, scriptom-2.0-alpha.jar 두 개의 파일을 복사해 주기만 하면 됩니다.
만약 jacob이 의존하고 있는 라이브러리가 PC에 설치가 안된 상태라서 '응용 프로그램 구성이 올바르지 않기 때문에...' 메시지를 보게된다면 Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)를 설치해야할 수도 있습니다

저는 D:\Repository\Groovy\zip\scriptom-2.0-alpha 폴더에 압축을 풀었습니다.

사용자 삽입 이미지

D:\Repository\Groovy\zip\scriptom-2.0-alpha 폴더에 압축을 풀었습니다


이제 압축을 풀어 둔 폴더에 있는 scriptom-2.0-alpha.jar 파일을
%GROOVY_HOME%\lib 폴더로 복사합니다(scriptom-2.0-alpha.jar 파일은 이전 버젼과는 다르게 scriptom이 의존하고 있는 jacob 라이브러리까지 포함하여 패키징되었습니다).
제 시스템환경변수에는 %GROOVY_HOME%이 'D:\SDK\groovy-1.1-rc-1' 폴더로 지정 되어 있어서 'D:\SDK\groovy-1.1-rc-1\lib' 폴더로 복사했습니다(환경변수 설정에 대해서는 이전 글을 참고하세요).

사용자 삽입 이미지

scriptom-2.0-alpha.jar 파일 복사


다음으로 jacob.dll 파일을 %GROOVY_HOME%\bin 폴더로 복사합니다. java.library.path에 포함되는 다른 곳(예를 들면 'C:\WINDOWS\system32')에 복사해도 됩니다.

사용자 삽입 이미지

jacob.dll 파일 복사


이제 Scriptom 설치는 완료 되었습니다. 간단하죠? :)

Caught: java.lang.UnsatisfiedLinkError: D:\SDK\groovy-1.1-rc-1\bin\jacob.dll: 응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다.
위와 같은 오류 메시지를 보게 되면 Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)를 설치합니다.


설치가 완료 됐으니까 정말 잘 된건지 확인해 보도록 하겠습니다.
먼저 명령 프롬프트를 하나 띄운 후, 압축을 풀어 둔 폴더 하위의 examples\ie 폴더로 이동합니다. 저는 'D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\ie'로 이동했습니다.
groovy IE.groovy 명령을 실행한 후, 익스플로러 창이 열리면서 http://glaforge.free.fr/weblog 사이트로 이동하면 제대로 설치에 성공하신 겁니다.

사용자 삽입 이미지

+

아침에 출근해 보니 몇시간 사이에 alpha 버젼이 없어지고 Beta 버젼으로 변경되었더군요. 급하게 링크만 수정했습니다

댓글()
  1. BlogIcon 지니랜드 2008.03.29 20:35 댓글주소  수정/삭제  댓글쓰기

    제가 가진 버전은 예제에서 ie.Navigate "http://glaforge.free.fr/weblog" 에 괄호를 넣어야 에러가 안나더라구요. ie.Navigate ("http://glaforge.free.fr/weblog" )

Scriptom 2.0 alpha

기타|2007. 10. 25. 17:42
Groovy 홈페이지에 오래간만에 들어가 봤더니 Scriptom 2.0 alpha버젼이 나와있더군요.  Scriptom은 ActiveX나 COM 컴포넌트를 Groovy에서 접근할 수 있게 해주는 훌륭한 모듈입니다.
루비의 'win32ole'로 엑셀을 만지는 재미를 Groovy에서도 느낄 수 있을까해서 예전에 사용해 봤었는데 루비와 비교해볼 때 기능이 약했던 기억이 있습니다.
하지만 Scroptom 2.0은 1.2 버젼과 비교해서 많은 면에서 발전이 있다고 합니다. 아직 alpha 버젼이지만 코드는 안정화된 상태고 기능구현도 완료되었다고 해서 금새 다운 받아서 예제를 실행시켜 봤습니다.

Scriptom 페이지에 Quick Start 예제로 나와있는 그루비 코드는 examples/speech 폴더에 각각 'Speak.groovy', 'SpeechInterfaces.groovy'라는 파일로 있었습니다. Quick Strat 예제답게 잘 실행됩니다.
 그런데, 가장 완성도 높은 예제라고 소개된 examples/excel 폴더의 'ExcelReport.groovy'는 아래와 같이 오류가 발생합니다.

D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\excel>groovy ExcelReport.groovy
  CREATING A SPREADSHEET FROM A TEMPLATE:
  Opening Excel template, inserting data, and creating a chart.
  The output document is 'D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\excel\report.xls'.
Caught: com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: Item
Description: 매개 변수의 개수가 잘못되었습니다.
        at ExcelReport$_run_closure2.doCall(ExcelReport.groovy:30)
        at ExcelHelper$_create_closure1.doCall(ExcelHelper.groovy:101)
        at ExcelHelper$_create_closure1.doCall(ExcelHelper.groovy)
        at ExcelHelper.create(ExcelHelper.groovy:69)
        at ExcelReport.run(ExcelReport.groovy:28)
        at ExcelReport.main(ExcelReport.groovy)

COM에서 발생한 예외라니! 나보고 어쩌라고...... 줄 30을 찾아보니 다음과 같았습니다.

def worksheet = workbook.Worksheets.Item[1]

한참을 멍하니 있다가, Excel Workbook의 Worksheets 컬렉션에서 Item을 호출하는건 Excel API를 바로 호출하는거니까 일반적인 컬렉션을 다루는 문법과는 다를 것이라는 생각에 대괄호를 소괄호로 바꿨습니다.

def worksheet = workbook.Worksheets.Item(1)
               .
               .
               .
def worksheet = workbook.Worksheets.Item('DATA') // 줄95

저장하고 다시 실행해 보니. 이번에는 줄 61에서 예외가 발생했습니다. 'Item'을 키워드로 파일 내용을 검색하다보니 눈에 띄었던 부분이었습니다.

worksheet.Cells.Item[row+1,1] = "$row/1/2007"

줄 61과 줄 65를 마찬가지 형식으로 변경했습니다.

worksheet.Cells.Item(row+1,1) = "$row/1/2007"
               .
               .
               .
worksheet.Cells.Item(row+1,col+1) = (row + col)

엉뚱한 에러가 납니다.

D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\excel>groovy ExcelReport.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, ExcelReport.groovy: 61:
"worksheet.Cells.Item((row + 1), 1)" is a method call expression, but it should be a variable expression at line: 61 column: 35. File: ExcelReport.groovy @ line 61, column 35.
       worksheet.Cells.Item(row+1,1) = "$row/1/2007"
                                                                ^
1 error

Item Property를 호출하여 Range 객체를 꺼낸 것까지는 좋았는데 문자열 할당을 하려면 Value Property에 해야한다는걸 깜빡했나 봅니다.

worksheet.Cells.Item(row+1,1).Value = "$row/1/2007"
               .
               .
               .
worksheet.Cells.Item(row+1,col+1).Value = (row + col) // 줄65

이제야 잘되는군요. :)

D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\excel>groovy ExcelReport.groovy
  CREATING A SPREADSHEET FROM A TEMPLATE:
  Opening Excel template, inserting data, and creating a chart.
  The output document is 'D:\Repository\Groovy\zip\scriptom-2.0-alpha\examples\excel\report.xls'.
        EVENT Change (1,2) = 1/1/2007
        EVENT Change (2,2) = 2.0
        EVENT Change (3,2) = 3.0
        EVENT Change (4,2) = 4.0
        EVENT Change (5,2) = 5.0
        EVENT Change (6,2) = 6.0
        EVENT Change (1,3) = 2/1/2007
               .
               .
               .

가장 완성도 높은 예제라고 했는데 왜 오류가 있을까요? 단순히 추측해보면 Groovy에서 List나 Map을 다루는 방식으로 COM의 Property(indexed properties)를 다룰 수 있도록 한다는 Scriptom 2.0의 개선사항 반영이 제대로 안된게 아닌가하는 생각이 듭니다.

+

COM Methods and Properties in Scriptom 이 문서를 보니까 확실히 알파버젼이라서 생기는 문제군요. 그렇다면 베타 버젼쯤에서는 이 예제가 멀쩡히 잘 돌아가겠지요?

+

2007.11.02
베타 버젼이 나와서 테스트 해 봤습니다. 줄 30과 줄 95의 소스가 약간 변경('workbook.Worksheets'가 'workbook.Sheets'로) 되었지만 여전히 제 PC에서는 같은 오류가 발생합니다. 'workbook.Worksheets'를 'workbook.Sheets'로 변경하지 않고 괄호 등만 위의 방식으로 변경하면 잘 실행됩니다만...... 이거 설마 제 PC에서만 안되는건가요? Excel 2003 버젼 쓰고 있습니다만...... :(

댓글()