개발이야기

OpenAPI를 이용하여 엑셀 키워드에 그림표시하기(Beta)

정주Go 2008. 3. 31. 00:05

Daum DevDay 08에 작업한 프로젝트입니다.

와우 엑셀! 엑셀만큼이나 시간을 단축시키는 작업은 찾기 힘들 듯 합니다.

많은 데이터를 변환할 때 직접 프로그래밍을 하거나 일일이 작업하는 것을 봐왔습니다. 하지만 본인은 엑셀의 VBA를 사용하여 한번에 간편하게 처리를 하게 됩니다.

사실 일일이 작업하는 시간과 VBA를 구현하는 시간이 동일 할 순 있습니다. 하지만 요구사항 변경시에는 몇 배의 효과가 나타나게 되며 VBA의 잦은 구현으로 노하우가 생기게 되어 더 빠른 구현이 가능하게 됩니다.



아주 강력한 VBA 기능에 조금 아쉬운 것은 다양한 예제가 없고 도움말도 많은 도움이 되지 못한다는 것입니다. 그리고 프레임웍의 기능이 약해서 웹 서비스나 현 기술에 걸맞은 작업 시 찝찝한 편법을 구사해야 한다는 것이죠.

이번 Daum 데브데이 프로젝트는 OpenAPI 이용하여 엑셀문서에 키워드를 그림으로 표현한다는 것입니다. 이 프로젝트는 카이스트의 심규진님과 함께 하였습니다.

일반 자바나 C# 같은 고급언어는 주소를 요청하고 받은 XML을 파싱하여 원하는 데이터만 끌어 쓰면 그만입니다. 하지만 VBA는 도저히 그런 쉬운 방법이 없었습니다. XML을 웹에서 바로 받는 것은 없으며 XML을 엑셀에 통합하려는 기능은 있었습니다.

저는 XML을 바로 요청하고 파싱하는 예제나 방법을 열심히 찾았고 심규진님은 편법을 이용한 방법을 구현하였습니다. 결국 시간상, 기능상 심규진님의 방법을 사용하였으며 의외로 아주 잘 돌아갔습니다.(심규진님 아니었으면....ㄷㄷㄷ)

심규진님의 방법은 XML을 새로운 엑셀 시트에 매핑하고 매핑된 시트에 행과 열을 찾아 중요데이터를 긁어 오는 방법이었습니다.

그런데 매핑된 시트는 중요데이터의 위치가 키워드마다 달라 열에 있는 데이터가 진짜 데이터인지 검사하는 모듈을 삽입 하여야 했습니다. 편법도 아주 뺑 돌아서 구현된 결과이지요. 사실 더 빠르고 간단하게도 할 수 있었을 것이지만 시간의 문제로 오로지 결과를 위해 달려야 했습니다.

구현한 코드를 보겠습니다.

Public Sub RequestTest()

Dim urlApi As String
Dim wb As Workbook
Dim getImageURL As String
Dim getImageURL2 As String
Dim oneCell As Range
Dim pic As PictureFormat
For Each oneCell In Selection
Dim se As Object

Set se = ActiveSheet
urlApi = http://apis.daum.net/search/image?q=
& oneCell.Value & --여기에 현재 선택된 키워드 삽입
"&result=10&start=1&output=xml&apikey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

-새로운 시트를 만들고 XML을 매핑한다
Set wb = Workbooks.Open(urlApi, IgnoreReadOnlyRecommended:=True, ReadOnly:=True)

For I = 10 To 15
-새로 만들어진 시트에 "/item/thumbnail" 값을 찾고 바로 아래 행 정보 얻기
    If wb.Sheets("image").Cells(2, I) = "/item/thumbnail" Then
        getImageURL = wb.Sheets("image").Cells(3, I) 
        getImageURL2 = wb.Sheets("image").Cells(3, I - 3)
        'Set p = se.Pictures.Insert("http://static.naver.com/kin/ending/btn_reply_metoo.gif")
        Exit For
    End If
Next I
-키워드 1칸 옆에 썸네일사진주소와 2칸 옆에 링크주소를 넣는다
oneCell.Offset(0, 1).Value = getImageURL
oneCell.Offset(0, 2).Value = getImageURL2

-XML과 매핑된 새로운 시트를 저장하지 않고 종료한다.
wb.Close (False)

Next oneCell

End Sub

먼저 VBA의 능숙한 실력이 아니라 문법도 힘들어 For문 조차도 도움말을 보면서 작성을 하였습니다. 여러 가지 우여곡절 끝에 결국 사진은 시트에 표현을 못하고 링크 주소만 출력하였는데 그럴 수밖에 없는 이유는 엑셀은 이미지를 URL을 사용하여 올릴 수 있지만 내부는 이미지를 다운받고 시트에 삽입하게 되어 있습니다. 이 방법을 코드로 구현 하려면 웹 이미지를 로컬메모리에 올리고 시트에 삽입을 해야 하는 것이죠.

링크주소의 이미지를 다운받고 삽입한다는 건 쉬운 기능이겠지만 아직 능숙한 실력이 아니고 또한 시간은 촉박했기에 못내 아쉽지만 주소만 출력하기로 결정하였습니다.

가능성

우리 팀은 큰 가능성을 보였습니다. OpenAPI를 통해 웹이든 로컬이든 여러 서비스를 할 수 있지만 문서작성에서도 적용 할 수 있다는 것이죠.

이 기능을 사용한다면 많은 기업이나 제품이름을 선택만 하고 매크로를 실행만 하면 됩니다. 그럼 문서는 단지 매크로 실행으로 이미지가 삽입이 되고 문서는 이해하기 쉬운 멋진 문서가 될 것입니다.

마지막으로 같은 팀으로 작업한 심규진님에게 감사를 드립니다.  심규진님이 아니었다면 아마 저 혼자 끙끙 되었을 것입니다.

좋습니다.^^