office 2013 preview 버전을 설치하다 보면 가끔 오류가 발생하여 지우고 싶지만 삭제에 문제가 발생되는 경우가 있다.
특히나 설치 중 오류로 인한 경우가 대부분인 듯 하다.
이때는 계속 제어판의 프로그램 추가/삭제에서 헤메지 말고 아래 링크를 참조면 된다.
http://support.microsoft.com/kb/2739501
해결방법에 문제 해결사를 클릭하여 실행한다.(열기)
office 2013 preview 버전을 설치하다 보면 가끔 오류가 발생하여 지우고 싶지만 삭제에 문제가 발생되는 경우가 있다.
특히나 설치 중 오류로 인한 경우가 대부분인 듯 하다.
이때는 계속 제어판의 프로그램 추가/삭제에서 헤메지 말고 아래 링크를 참조면 된다.
http://support.microsoft.com/kb/2739501
해결방법에 문제 해결사를 클릭하여 실행한다.(열기)
이번에는 이미지 부분회 주소록 부분을 만들어 봅니다.
먼저 Database가 만들어 져야 합니다.
1. 먼저 오른쪽 솔루션 탐색기의 프로젝트 이름(저는 Contact1)을 선택하여 마우스 오른쪽 클릭 --> 추가 --> 새 항목
3. 로컬 데이타베이스를 선택하고 이름을 지정해 줍니다.
4. 데이터베이스 모델 형식에 데이터집합 --> 다음 --> 마침
5. 좌측의 서버 탐색기에서 만들어진 데이터베이스를 확인할 수 잇습니다. 테이블에서 테이블 만들기를 선택해 주세요.
6. 테이블의 항목을 적어 줍니다.
ConractID는 int(정수)형식의 4길이를 가지고 Null값(무조건 입력되어야 한다.)과 고유(중복될 수 없음), 기본키(인덱스)값을 가집니다. 나머지는 ... 뭐 특별한건 없고.
아래의 Client는 고객 유무 입니다. 고객이 맞는지 틀린지만 확인하기 때문에 bit값으로 선택합니다.(비트값은 참, 거짓 .. 두가지만 구분합니다.)
7. 만들어진 테이블에서 테이블데이터 표시를 선택 합니다.
8. 데이블 데이터를 입력 합니다.
ContactID는 순서대로.. 클라이언트는 True와 False 두가지 값으로 표시하는 것만 주의하면 특별한 주의 사항은 없습니다.
9. 데이터 --> 데이터 소스 표시
10. 데이터 소스 창에서 만들어 놓은 People데이터베이스에서 자세히를 선택하고 폼에 끌어놓습니다.
11. 폼에 데이타베이스 내용이 표시 됩니다. 마우스로 알맞은 영역으로 이동해 주시기 바랍니다.
별도로 정돈을 해 주시면 좋습니다. client에 checkbox1의 글자가 신경쓰시면 해당 부분을 클릭하고 우측의 속성에서 text값을 없애 주시면 됩니다.
12. 디버그에서 디버깅 시작이나 리본메뉴에서 디버깅시작 메뉴를 누르면 실행이 됩니다.
13. 빌드 --> Contact 게시를 눌러 실행파일을 만들어 주시면 됩니다.
- 1차 주소록 만들기 끝 -
이글은 Oreilly사의 Head First C# 을 읽으면서 작성해 보는 예제 강좌 입니다.
이책의 첫번째 장에는 "Hello World!"가 아닌 주소록을 만들어 보게 만드는 군요.
오히려 딱딱한 "Hello World"보다는 이런식의 예제가 더 마음에 듭니다.
자 이제 주소록을 만들어 보겠습니다.
Visual Studio 2010을 기준으로 만들었으나 Visual Studio 2012도 틀린 점은 없습니다.
예제의 기능 설명 : 주소록 입니다. 고유번호와 이름, 회사, 전화번호, 이메일, 고객유무, 마지막통화일자로 구성됩니다.
이미지를 누르면 작성자가 표기됩니다.
1. 먼저 Form을 만들어 봅니다. Visual C# --> Windows Form 응용프로그램 --> 마지막으로 이름을 입력 후 확인을 선택 합니다.
2. 우선 오른쪽 이미지를 먼저 구성해 보겠습니다. 마우스로 폼 오른쪽 바를 선택하여 길이를 오른쪽으로 조금더 끌어 조정해 주세요.
좌측의 도구상자에서 pictureBox를 선택하여 폼의 오른족으로 끌어다 놓습니다.
3. 이미지 여역의 사각박스안의 ◀표시를 선택하여 작업창을 엽니다. 크기모드는 Zoom으로 선택.
4. 그리고 이미지를 선택하고 로컬리소스 선택 --> 가져오기 후 이미지를 선택합니다.
5. 이제 이미지가 표시 됩니다. 이미지를 더블클릭 하면 더블클릭 햇을때의 이벤트를 작성할 수 있습니다.
6. 더블 클릭 후 선택된 Edit창입니다.
mbox를 타이핑 후 tab키를 두번 누르면 아래와 같이 Massagebox로 변경되어 작성 됩니다.
| MessageBox.Show("Contact List 1.0. \nWritten by: Yule", "About"); |
이와 같이 박스내용을 변경해 줍니다. \n은 줄바꿈 문자라고 합니다. About 가 적혀있는 부분은 창의 이름입니다. 원하는대로 바꾸셔도 좋습니다.
[ CSS의 적용 ]
1. HTML코드에 직접 적용하는 법
p{font-family:"굴림"; color:#ccc; font-size:12px;}
<p> ... </p> p테크로 감싼 HTML내의 본문에 전부 해당 속성이 적용됩니다.
2. 클래스 선택자를 만들어 사용하는 법
.myclass{font-size:14px; color:#fcf;}
클래스의 처음 시작을 "."으로 하며, 어떤 이름을 만들어 사용하든지 상관 없습니다.
<div class="myclass">...</div>
3. 아이디 선택자를 만들어서 적용하는 법
#myID{margin:10px; padding:5px;}
<div id="myID"> ... </div>
아이디 선택자는 "#"으로 시작된다. 주로 레이아웃을 잡을때 사용된다.
※ CSS구성요소
선택자{속성:속성값;}
★ CSS3에서 추가된 속성 들
|
css 속성 값 |
내용 |
| border |
테두리의 색을 다양하게 적용할 수 잇습니다. 또한 테두리에 이미지를 넣을 수 있고 모서리를 둥그렇게 적용할 수 있습니다. |
| background |
하나의 태그에 다중 이미지를 추가할 수 있고 백그라운드의 위치를 정확하게 잡을 수 잇습니다. 또한 백그라운드의 사이즈도 조절할 수 있습니다. |
| color |
색의 농도(투명도)를 조절할 수 있습니다. 또한 RGB색과 인쇄용인 HSL컬러로 색을 지정할 수 있습니다. |
| text |
텍스트에 그림자 효과를 줄 수 있습니다. 또한 단어가 잘리는 효과를 줄 수 있으며, 텍스트 overflow효과를 줄 수 잇습니다. |
| transfomation | 변형효과(크기 조절, 기울기 효과, 회전 효과등)를 줄 수 있습니다. |
| box |
박스에 그림자를 적용할 수 있고 사이즈 조절이 가능하며 세로축과 가로축을 기본으로 overflow를 각각 조절할 수 있습니다. |
|
content |
요소(Element)에 직접 콘텐츠를 지정해서 스타일을 줄 수 있습니다. |
| opacity |
요소(Element)에 투명도를 지정할 수 있습니다. |
| media |
css2에서 사용하던 media를 다양하게 해상도나 색상들 여러가지 요소를 지정해 줄 수 있게 되엇습니다. |
|
web font |
모든 브라우저에서 웹 폰트가 정식으로 지원됩니다. |
[ video 테크 ]
이전까지의 브라우저에서는 동영상을 보기 위해서는 별도의 플러그인을 추가하거나 ActiveX를 설치해야만 했습니다. 이 경우에는 별도의 보안상 위험을 비롯한 여러가지 문제(불편함도 매우 큽니다.)가 발생하며 이에 따라 HTML5에서는 video테그가 추가 되었습니다.
| <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>비디오 예제</title> </head> <body> <video src="DSC_2190.mp4" width="400" height="240" controls autoplay preload="auto"> </video> </body> </html> |
업계 표준은 H.264이며, mp4또는 m4v 확장자를 가지고 있습니다.
그러나 상용라이센스이기 때문에 파이어폭스나 오페라에서는 재생되지 않습니다.(그러나 파이어폭스 최신버전(15.0)으로 테스트 결과 정상적으로 동작이 됨을 확인하였습니다. 물론 오페라는 확인해 보지 않았습니다. IE8에서는 지원하지 않더군요 이게 가장 큰 문제 네요.)
따라서 파이어폭스나 오페라에서는 로얄티가 전혀 없는 Theora포멧을 지우너하고 있습니다.(확장자는 ogg, ogv)
WebM코덱의 경우 VP8비디오 코덱과 Vorbis오디오 코덱을 이용한 포멧으로 오픈소스용 동영상 포멧입니다.
controls : 아래에 컨트롤 창 추가
autoplay : 자동 플레이
preload : 파일사이즈가 큰 동영상일 경우
| <video width="400" height="240" controls autoplay preload="auto"> <source src="DSC_2190.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'> <source src="DSC_2190.ogv" type='video/ogg; codecs="theora, vorbis"'> <source src="DSC_2190.webm" type='video/webm; codecs="vp8, vorbis"'> <p> 현재 사용하고 있는 브라우저는 비디오 태그를 지원하지 않습니다.</P> </video> |
↑ 모든 포맷을 추가한 형태.
[ audio 테그 ]
대표적인 포맷으로는 mp3와 ogg파일 포맷이 있습니다.
mp3 파일의 경우 IE와 사파리, 크롬에서는 잘 열리지만 파이어폭스, 오페라에서는 잘 열리지 않습니다.(확인결과 파이어폭스(15.0)에서 mp3는 열리지 않으며 ogg만 열리는 것으로 확인되었습니다.)
| <body> <audio controls="controls"> <source src="danosongs.com-black-box-in-the-ground.mp3"> <source src="danosongs.com-black-box-in-the-ground.ogg"> </audio> </body> |
이렇게 소스는 되어 잇지만 두가지를 혼용햇을 경우 파이어폭스에서 열리지 않았습니다. 위의 mp3쪽 라인을 지워야 했습니다.
현재 상태에서는 상단에서 브라우저 확인 후 분리하는 방법 밖에는 없어 보입니다. (HTML5가 표준이라고 해서 기대했지만 표준이 전혀 이루어져 있지 않아 불만 스럽습니다.)
[ embed테그 ]
브라우저에 설치되어 있는 플러그인이 필요한 파일을 동작시킬때 사용하는 테그.
예를들어 기존 드림위버에 플래쉬 파일 삽입을 위해 수십개 라인을 사용하던 복잡한 소스에서 간단히 <body>안에 <embed>태그를 사용하여 간단히 구성할 수 있다.
| <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>embed sample</title> </head> <body> <embed src="sample.swf" width="550" height="400" > </embed> </body> </html> |
<embed>테그는 플래시 파일 뿐만 아니라 mid등의 플러그인 파일을 재생할 때에도 사용됩니다.
mid파일 연결 : <embed src="sample.swf" width="550" height="400" > </embed>
| HTML5 와 CSS3 Study #2 (CSS) (0) | 2012.08.26 |
|---|---|
| HTML5 와 CSS3 Study #2 (구조) (0) | 2012.08.26 |
| HTML5 와 CSS3 Study #1(배경설명) (0) | 2012.08.26 |
1. CSS이해
CSS는 스타일 입니다. 예를들어 글꼴의 색이나 두께, 크기등 문서의 속성을 지정할 수 있습니다.
10페이지 정도의 작은 HTML파일은 큰 문제가 없을 수 있으나, 100페이지의 HTML페이지의 글자 속성을 수정하려면 상당한 노가다 작업이 이루어져야 합니다.
CSS를 이용하면 쉽게 모든 페이지의 문서 속성을 변경할 수도 있으며, 최근에는 많은 그래픽적 요소들을 CSS만으로 처리할 수 있습니다.
두개의 페이지는 동일한 HTML이며, CSS(Style type=)이 틀린 경우 입니다.
| |
|
|
| HTML5 와 CSS3 Study #2 (CSS 일반규칙) (0) | 2012.09.02 |
|---|---|
| HTML5 와 CSS3 Study #2 (구조) (0) | 2012.08.26 |
| HTML5 와 CSS3 Study #1(배경설명) (0) | 2012.08.26 |
1. DOCTYPE
브라우저는 DOCTYPE 선언을 확인하고 브라우저 모두를 결정합니다. 브라우저 모드에는 표준 호환모드와 비표준 호환모드가 있는데 표준 호환모드는 기술명세에 따라 표시해주며, 비표준 호환모드는 좀더 느슨하게 하위 브라우저의 호환을 고려야 화면에 표시 합니다.
사이트의 호환성 정의, 표준모드 정의, 프레임셋 정의등을 DICTYPE을 통해서 하는 방식 --> 이전버전의 호환성은 염두해 두지 않는다. (따라서 이전 버전의 웹문서가 많은 경우 모두 변환하거나 새로 만들어야 합니다.)
<!DOCTYPE html> |
2. 문서의 구조
|
<!DICTYPE html> <html> <head> <meta charset="utf-8"> <title> HTML5 문서 구조 잡기 </title> </head> <body> <header> 머리말 </header> <div id="sidemenu"> 사이드메뉴</div> <article> 본문 </article> <footer> 꼬리말 </footer> </body> </html>
|
<header>는 머리말이 들어가는 부분, <article>은 본문이라는 구조를 쉽게 파악할 수 있습니다.
|
|
|
|
HTML&CSS3 내용대로 데모 결과 입니다.
첫번째의 CSS와 3번째의HTML 페이지가 결합되어 HTML5가 생성됩니다.
그런데 이미 일반적인 대부분의 회사에서는 이미 이와 같은 방법을 쓰고 있는 사항입니다.
(물론 표준화가 안되어 있는경우는 대부분이긴 하지만요. )
| HTML5 와 CSS3 Study #2 (CSS 일반규칙) (0) | 2012.09.02 |
|---|---|
| HTML5 와 CSS3 Study #2 (CSS) (0) | 2012.08.26 |
| HTML5 와 CSS3 Study #1(배경설명) (0) | 2012.08.26 |
이 페이지는 HTML&CSS3(로드북, 양용석 지음) 책자와 추가적인 구글링을 통해 습득된 정보로 학습을 하며 정리하는중입니다.
1. 웹표준의 등장 배경.
초창기 웹은 지금처럼 복잡하지 않고 매우 간단했습니다.
택스트 형식의 웹에 이미지 몇개 올라가는 정도였습니다.
지금처럼 웹프로그램을 이용한다는 개념조차 없이 단순히 웹사이트(홈페이지)를 만들기 위한 언어로 HTML이 있었습니다.
Netscape라는 브라우저가 세계를 휍쓸던 시절이었습니다.
HTML이란 용어는 1991년 처음 사용되었고 1995년 W3C(www.w3.org 웹기술의 표준화를 담당하는 세계적 기구이며 HTML, CSS, CML등 웹에 관련된 다양한 기술이 논의되고 표준화 작업이 이루어진다)에서 정식으로 HTML2.0 표준안을 발표했었습니다.
HTML(1991)--> HTML2.0(1995) --> HTML4.0(1997) --> HTML4.01(1999) --> XTML1.0(2000) --> XHTML1.1(2001) --> XHTML2.0(2007) --> HTML5
1999년 HTML4.01 이후로 HTML을 XML형태로 사용할 수 있도록 한 XHTML이 별도로 제정되었지만 2001년 XHTML1.1이후로 표준화 되지 않았습니다.(XHTML2.0은 2007년 포기하엿습니다)
표준이 10년간 머물러 있는 동안에도 웹기술은 더욱 빠르게 발전 되었습니다.
MS에서 독자적으로 만든 ActiveX를 비롯하여 표준화 되지 않는 각종 기능으로 인하여 많은 사용자들이 불편을 격어야 했습니다. 이에 HTML5라는 새로운 표준안이 만들어지고 있습니다.
현재의 브라우저 개발사들은 모두 HTML5를 지원하고 잇습니다.
2. 웹표준의 장점
웹 표준을 지키는 사이트는 구조와 표현, 양식을 분리해서 개발하게 됩니다. 그렇기 떼ㅐ문에 사이트 용량이 에전에 비해 현저하게 작아 집니다. CSS는 HTML과 구조가 분리되어 있기 때문에 한 번 해당페이지를 불러오게 되면 부라우저의 캐시에 CSS가 저장 됩니다. 따라서 다시 불러올 필요가 없기 때문에 HTML코드가 가벼워 지는 것입니다.
물론 구조와 표현을 분리하기 때문에 사이트 개발 기간 및 유지보수에 용이 합니다.
| HTML5 와 CSS3 Study #2 (CSS 일반규칙) (0) | 2012.09.02 |
|---|---|
| HTML5 와 CSS3 Study #2 (CSS) (0) | 2012.08.26 |
| HTML5 와 CSS3 Study #2 (구조) (0) | 2012.08.26 |
안녕하세요. 엉스데브 입니다.
오늘은 .NET/C# 으로 UDF 를 만드는 여러 방법 중 Excel-DNA 라이브러리를 이용하는 방법을 알아보겠습니다.
@Excel-DNA 홈페이지 주소:
http://excel-dna.net/
@Excel-DNA 관련 문서 링크:
http://exceldna.codeplex.com/documentation
엑셀 UDF 를 만드는 방법은 여러가지가 있지만, 그 중 Excel-DNA 라이브러리를 이용하는 방법이 아래 정리한 이유들 때문에 가장 마음에 듭니다.
1. 심플하고 직관적인 방법으로 개발이 가능 하며, 디버깅도 용이하게 수행 가능합니다.
2. 함수에 대한 설명을 지정 해 줄 수 있고, 함수의 파라미터에 대한 세부 설명까지도 지정이 가능 합니다.
3. 배포에 용이한 형식(.xll 단일 파일)으로 패키징 할 수 있는 패키징 도구를 제공 합니다.
이렇게 만든 엑셀 UDF를 비주얼 스튜디오에서 디버깅 모드로 디버깅도 할 수 있습니다.
@Excel-DNA 를 이용한 엑셀 UDF 함수 디버깅 하기
개발하는 동안에는 이렇게 개발과 디버깅을 반복하면 됩니다.
개발이 완료 된 후 배포를 해야 하는데, Excel-DNA 라이브러리에서 제공하는 패키징 도구를 사용하면 깔끔하게 패키징 할 수 있습니다.
패키징을 하면 단일 .xll 파일이 하나 생기는데, 이 파일은 이름을 마음대로 변경해도 되며, 다른 .dll 파일은 필요가 없게 됩니다.
단일 .xll 파일 하나에 UDF 를 사용하기 위해 필요한 모든 라이브러리(.dll) 을 포함시킨다고 생각하시면 됩니다.
@배포용 통합 패키지 만들기
이상입니다. 감사합니다.
| C# 으로 엑셀 사용자 정의 함수(UDF) 만들기(COM Interop) (0) | 2012.08.03 |
|---|
@서론:
안녕하세요. 엉스데브 입니다.
엑셀을 사용하다 보면 가끔 엑셀의 기본 함수가 다소 아쉽게 느껴지는 경우가 있습니다.
이러이러한 함수가 있으면 참 좋을텐데.. 싶을 때가 간혹 있지요.
그래서 엑셀은 사용자가 직접 함수를 만들어서 사용 할 수 있는 기능을 지원하며,
이렇게 사용자가 직접 만든 함수는 "사용자 정의 함수(UDF, User-Defined Function)" 라고 불립니다.
사용자 정의 함수는 여러가지 다양한 방법으로 정의 할 수 있는데,
그 중 제가 가장 익숙한 .NET/C# 으로 함수를 직접 만들어 사용하는 방법을 찾아 봤습니다.
.NET/C# 으로 UDF 를 만드는 방법은 크게 3가지 정도가 있는데,
1. COM Interop 을 이용하는 방법,
2. Sharepoint Server 제품에 포함되어 제공되는 Microsoft.office.Excel.Server.Udf.dll 을 이용하는 방법,
3. Excel-DNA 라이브러리를 이용하는 방법이 있습니다.
이 중 오늘은 COM Interop 을 활용하는 방식에 대해 정리 해 보겠습니다.
@COM Interop 이란?
http://ko.wikipedia.org/wiki/COM_Interop
@COM Interop 을 이용해 엑셀 UDF 만들기 관련 링크:
http://msdn.microsoft.com/ko-kr/library/ms173189(v=vs.80).aspx
http://msdn.microsoft.com/en-us/library/ms499792.aspx
@C#.NET 으로 엑셀 UDF 만들기 (COM Interop):
* OS 환경:
Windows 7 Enterprise K (Service Pack 1) 64bit
* 사용도구:
Visual Studio 2010 Premium
Microsoft Excel 2010
단계1: 클래스 라이브러리 형식의 프로젝트 생성
비주얼 스튜디오를 켜고, 클래스 라이브러리 형식의 새 프로젝트를 만듭니다.
단계2: 엑셀 UDF 용 클래스 생성
엑셀 UDF 용으로 클래스를 만들어 줍니다.
클래스 이름을 적당히 지어주고, 엑셀에서 함수로 사용 될 메소드를 만들어 줍니다.
이번에 필요한 기능은 지정된 도메인의 연결 IP 를 가져오는 기능이기에, 다음과 같이 소스 코드를 작성 했습니다.
using System;
using System.Linq;namespace InfradevExcelUDF
{
public class DNSUtil
{
public string GetIPAddress(string domain)
{
if (string.IsNullOrEmpty(domain) == true)
{
return string.Empty;
}try
{
if (System.Net.Dns.GetHostAddresses(domain).Length > 0)
{
return System.Net.Dns.GetHostAddresses(domain).First().ToString();
}
else
{
return string.Empty;
}
}
catch (Exception)
{
return "#ERROR: 예상하지 못한 오류 입니다.";
}
}}
}
단계3: System.Runtime.InteropService 네임스페이스 추가(using)
using System;
using System.Linq;
using System.Runtime.InteropServices;namespace InfradevExcelUDF
{
public class DNSUtil
{
public string GetIPAddress(string domain)
{
if (string.IsNullOrEmpty(domain) == true)
{
return string.Empty;
}try
{
if (System.Net.Dns.GetHostAddresses(domain).Length > 0)
{
return System.Net.Dns.GetHostAddresses(domain).First().ToString();
}
else
{
return string.Empty;
}
}
catch (Exception)
{
return "#ERROR: 예상하지 못한 오류 입니다.";
}
}}
}
단계4: 클래스에 ClassInterface 속성 설정
클래스가 COM 에 노출 될 때 사용 될 인터페이스 속성을 설정 해 줍니다.
using System;
using System.Linq;
using System.Runtime.InteropServices;namespace InfradevExcelUDF
{
[ClassInterface(ClassInterfaceType.AutoDual)]
public class DNSUtil
{
public string GetIPAddress(string domain)
{
if (string.IsNullOrEmpty(domain) == true)
{
return string.Empty;
}try
{
if (System.Net.Dns.GetHostAddresses(domain).Length > 0)
{
return System.Net.Dns.GetHostAddresses(domain).First().ToString();
}
else
{
return string.Empty;
}
}
catch (Exception)
{
return "#ERROR: 예상하지 못한 오류 입니다.";
}
}}
}
단계5: COM 자동 등록/삭제 용 메소드 추가
COM 에 자동 등록/삭제 될 때 사용될 메소드를 추가 해 줍니다.
using System;
using System.Linq;
using System.Runtime.InteropServices;
using Microsoft.Win32;namespace InfradevExcelUDF
{
[ClassInterface(ClassInterfaceType.AutoDual)]
public class DNSUtil
{
public string GetIPAddress(string domain)
{
if (string.IsNullOrEmpty(domain) == true)
{
return string.Empty;
}try
{
if (System.Net.Dns.GetHostAddresses(domain).Length > 0)
{
return System.Net.Dns.GetHostAddresses(domain).First().ToString();
}
else
{
return string.Empty;
}
}
catch (Exception)
{
return "#ERROR: 예상하지 못한 오류 입니다.";
}
}[ComRegisterFunctionAttribute]
public static void RegisterFunction(System.Type type)
{
Registry.ClassesRoot.CreateSubKey(
GetSubKeyName(type, "Programmable")
);RegistryKey key = Registry.ClassesRoot.OpenSubKey(
GetSubKeyName(type, "InprocServer32"),
true
);key.SetValue(
"",
System.Environment.SystemDirectory + @"\mscoree.dll",
RegistryValueKind.String
);
}[ComUnregisterFunctionAttribute]
public static void UnregisterFunction(System.Type type)
{
Registry.ClassesRoot.DeleteSubKey(
GetSubKeyName(type, "Programmable"),
false
);
}private static string GetSubKeyName(System.Type type, string subKeyName)
{
System.Text.StringBuilder s = new System.Text.StringBuilder();s.Append(@"CLSID\{");
s.Append(type.GUID.ToString().ToUpper());
s.Append(@"}\");
s.Append(subKeyName);return s.ToString();
}
}
}
단계6: COM Interop 관련 설정.
이제 작성한 클래스를 COM Interop 에 노출시키기 위해 아래와 같이 프로젝트 속성을 설정 해 줍니다.
1. [프로젝트 속성 > 응용프로그램 > 어셈블리 정보 > 어셈블리를 COM에 노출] 옵션 체크
2. [프로젝트 속성 > 빌드 > COM Interop 등록] 옵션 체크
단계7: 빌드
클래스 라이브러리를 빌드하면 자동으로 COM Interop 에 빌드 된 어셈블리가 등록 됩니다.
COM Interop 에 등록 된 어셈블리를 엑셀에서 불러와 사용이 가능 합니다.
단계8: 엑셀에서 실제 사용 해 보기
1. [개발도구 > 추가기능 > 자동화] 버튼을 클릭하면 "자동화 서버" 창이 표시 됩니다.
2. 사용 가능한 자동화 서버 목록에서 방금 만든 라이브러리를 찾아서 선택 후 "확인" 버튼을 누릅니다.
3. 방금 찾은 라이브러리를 체크 해 주고 확인 버튼을 누릅니다.
4. 계산된 값이 입력 될 셀을 선택 하고 "함수 삽입" 버튼을 누릅니다.
5. "범주선택" 메뉴에서 방금 추가 한 라이브러리를 선택 해 줍니다.
6. 함수 목록 중 사용하고자 하는 함수를 선택 후 확인 버튼을 누릅니다.
7. 대상 값을 지정(마우스로 셀 클릭) 해 주고 확인 버튼을 누릅니다.
8. 직접 만든 UDF 로 원하는 값을 얻어냈습니다. ^^
@트러블 슈팅:
1. "올바른 추가 기능이 아닙니다" 오류
빌드까지 마친 후 엑셀에서 추가기능 메뉴를 통해 불러오려 할 때 다음의 메시지가 나오는 경우가 있습니다.
확인 결과 원인은 클래스 이름에 언더바('_') 가 들어가 있어서 인 것으로 확인 되었습니다. 언더바를 제거 해 주면 정상적으로 불러와 집니다.
이상입니다. 감사합니다.
| C# 으로 엑셀 사용자 정의 함수(UDF) 만들기 (Excel-DNA 라이브러리 사용) (0) | 2012.08.10 |
|---|
안녕하세요. 엉스데브 입니다.
이번에 회사의 중요 DB의 스키마 정리 업무를 맡게 되었습니다.
MySQL DB 인데, 제법 테이블의 갯수가 많고 복잡하게 얽혀있는 녀석입니다.
기존에는 ERwin 을 통해 관리 되고 있었으나,
라이센스 가격이 너무 비싼 관계로 다른 도구(이왕이면 무료!)를 사용해 보기로 했습니다.
검색 해 보니 위키피디아에 좋은 문서가 있네요!
이 업무를 수행하기 위해 필요한 도구의 조건을 정리 해 보니 대략 다음과 같더군요.
1. MySQL 지원
스키마를 정리하고자 하는 대상 DB 가 MySQL 입니다.
2. 리버스 엔지니어링 기능 지원
이미 존재하는 DB 로 부터 모델링 정보를 추출하는 기능입니다.
이 기능이 지원되지 않는다면 일일이 수작업을 해야 하는데, 너무 많은 비용/시간이 소모 됩니다. 필수적으로 필요합니다.
3. 논리적 모델링 기능 지원(다이어그램에 한글표기 가능)
물리적 모델링 정보(DB 테이블 및 컬럼의 실제이름 및 컬럼 데이터타입)만으로는 한눈에 어떤 정보가 어떻게 얽혀있는지 파악하기 쉽지 않습니다. 기존에 사용하던 ERwin 처럼 한글로 된 논리적 모델링이 가능해야 한눈에 파악하기가 좋기 때문입니다.
여러 무료 데이터 모델링 도구를 대상으로 비교 해 본 결과,
이번 업무에 맞는 도구로는 MySQL Workbench 가 가장 적절 해 보였습니다.
@MySQL Workbench 의 단점:
1. 논리적 모델링을 지원하지 않으며
2. 한글 지원이 완벽하지 않습니다
3. 다소 불안정한 동작을 보이는 것도 단점입니다.(잦은 다운 등)
단점들이 무료인 점을 감안하면 납득 가능 한 수준이며, 다른 적절한 대안을 찾을 수 없었기 때문에 결국 최종 선택 했습니다.
@리버스 엔지니어링을 통해 기존 DB 불러오기:
MySQL Workbench 를 이용해서 리버스 엔지니어링을 하는 방법은 매우 직관적이라, 별도의 메뉴얼이 필요 없을 정도입니다.
만약 메뉴얼이 필요하신 경우, 아래 "더보기"를 클릭 하세요.
@ERD 만들기:
리버스 엔지니어링을 통해 기존 DB 의 Object 들을 가져온 뒤,
다이어그램에 보기좋게 배치하면 물리적 모델링 ERD 가 완성 됩니다.
위에서 언급했던 MySQL Workbench 의 단점인 논리적 모델링 기능의 미지원은
아쉬운대로 다이어그램을 복사 한 뒤 각 테이블 및 컬럼명을 한글로 입력 해 주는 것으로 처리하기로 했습니다.
어차피 출력 해 두고 둘러보는 용도로 사용 할 것이니까요..
헌데 여기서 문제가 생기는 데요. 다이어 그램상에서 한글이 깨져서 보입니다. 이는 MySQL Workbench 가 기본적으로 사용하는 글꼴이 latin-1 계열의 문자만을 처리 할 수 있는 글꼴이기 때문에 발생하는 문제입니다. 이 문제의 해결은 아래 Tip #1 을 참고 하시기 바랍니다.
[Edit > Preferences > Apperance] 메뉴로 접근하면 Workbench 가 사용하는 글꼴을 변경 할 수 있습니다.
한글이 지원되는 글꼴을 지정하면 되는데, 글꼴 및 크기지정에 따라 숫자가 깨져보이거나 문자 간격이 틀어지는 등 문제가 좀 있는 편입니다. 여러 시행착오 끝에 현재는 아래와 같이 설정 해 두고 사용하고 있습니다. 이 상태가 가장 보기 좋게 표시되는 것 같더군요. 참고 하시기 바랍니다.
@한글 글꼴 설정 추천:
@정리:
MySQL Workbench 는 무료인만큼 아쉬움이 다소 많이 있는 툴이지만,
상용툴도 그다지 만족스럽지 않은 상황에서는 상당히 매력적으로 느껴지는 녀석입니다.
포럼을 뒤져보니 논리적 모델링을 추후 지원 예정이라고 하는데, 아직 확정 된 내용은 아닌것 같습니다.
만약 논리적 모델링 기능이 추가되고 한글이 좀 더 완벽히 지원 된다면 상당히 매력적인 도구가 될 것 같습니다.
MySQL 만 지원하는 만큼 ERwin 처럼 범용적인 데이터 모델링 도구로서 사용하기는 어렵겠지만,
MySQL 에 한해서는 상당히 높은 경쟁력을 가진 프로그램이라 생각합니다.