'witstudio'에 해당되는 글 49건

  1. 2010.02.27 Simple Excel Provider Using OLEDB (3)
  2. 2010.02.27 wit studio를 소개합니다.
  3. 2010.02.27 RadioButtons and Data Binding
  4. 2010.02.27 Custom Gridline in WPF Grid Control (1)
TAG : C#, Excel, OleDb, Wit, witstudio

Introduction

일반적으로 엑셀 파일을 조작하기 위해서 Microsoft.Office.Interop.Excel 를 이용하지만, 이를 이용하기 위해서는 반드시 사용자의 컴퓨터에 엑셀이 설치되어 있어야 하며, 속도가 매우 느리다는 단점이 있습니다. 이번 강좌에서 소개할 내용은 OLEDB를 이용해 간단하게 엑셀파일을 읽고 쓰는 방법에 대해서 소개합니다.

Excel Interop VS Excel OLEDB

본격적인 설명에 앞서 Interop을 이용한 엑셀 파일 조작과, OLEDB를 이용한 엑셀파일 조작의 차이에 대해 알아 보겠습니다.

Excel Interop

Excel Interop은 COM Interop을 이용해 엑셀 프로그램을 외부에서 제어하는 방식으로 동작합니다. Excel Introp 방식은 외부에서 직접 엑셀 프로그램을 제어하기 때문에 엑셀 프로그램에서 제공하는 대부분의 기능(스타일 지정 등)을 제어 할 수 있다는 장점이 있지만, 사용자 컴퓨터에 엑셀 프로그램이 설치되어 있어야 하며 속도가 느리다는 단점이 있습니다.

Excel OLEDB

Excel OLEDB는 OLEDB(Object Linking and Embedding Database)를 이용해 엑셀 파일에 접근하는 방식으로 SQL데이터 베이스를 조작하는 방법과 유사하게 동작합니다. Excel OLEDB는 Microsoft.Jet.OLEDB에 포함되어 있으며 이는 운영체제 설치시 자동으로 설치 됩니다. Excel OLEDB는 빠른속도로 엑셀에 저장된 내용을 읽거나 쓸 수 있지만, 단순히 데이터를 읽고 쓰는 기능만을 제공하기 때문에 셀의 스타일을 지정할 수는 없습니다.
이처럼 복잡한 컨텐츠 조작이 필요한 경우라면 Excel Interop을 이용해햐 하지만, 단순히 내용을 읽거나, 쓰는 용도만 필요할 경우 Excel OLEDB를 이용하면 간단하게 해결할 수 있습니다.

Simple Excel Provider

Excel OLEDB를 이용하기 위해서는 가장먼저 엑셀 파일에 대한 Connection을 생성해 줘야 하는데 OleDbConnection를 이용해서 Connection을 생성할 수 있습니다. 아래는 OleDbConnection을 생성하기 위한 코드입니다.

공급자로 Microsoft.Jet.OLEDB.4.0을 지정하고, 데이터소스를 입력받은 엑셀파일의 경로로 지정합니다. 그리고 데이터소스를 인식할 수 있도록 Extend Properties에 Excel의 버전 정보를 입력합니다. 이렇게 엑셀 파일에 연결 되는 Connection이 생성되면 OleDbCommand과 SQL문법을 이용해 엑셀 파일을 조작할 수 있습니다. 아래는 엑셀 파일에 저장된 특정 시트의 모든 내용을 DataTable로 가져오는 코드입니다.

여기서 주의 할점은 Excel OLEDB를 이용하게 되면 SQL의 테이블은 시트가 되고 각 시트의 첫번째 Row는 Column정보로 사용됩니다. 그리고 테이블명을 지정해 줄때 위 코드와 같이 "[시트명 + $(범위)]" 형식으로 이름을 지정해 줘야 합니다. 그리고 아래는 DataTable에 있는 내용을 엑셀 파일로 저장하는 코드입니다.
위 코드에서 사용된 CreateTableQuery 메서드는 입력받은 DataTable의 구조와 동일한 테이블을 생성하는 쿼리를 생성하는 메서드고, CreateInsertQuery 메서드는 DataTable에 저장된 내용을 엑셀 파일에 Insert하기 위한 쿼리를 생성하는 메서드입니다. 두 메서드는 첨부된 소스코드를 확인하시기 바랍니다.

샘플 코드에는 엑셀로 저장된 우편번호 데이터를 불러오고 이를 다시 엑셀파일로 저장하는 기능이 구현되어 있습니다.

신고
TAG : Wit, witstudio

안녕하세요.
크리에이티브 그룹 wit입니다.
상상만 하던 아이디어를 실현하기 위해 wit studio를 개설하였습니다.
즐겁고 의미있는 놀이를 원하시는 모든분들을 환영합니다.




※ wit studio는 팀블로그 형태로 운영됩니다.
※ 건의 및 문의사항 -
wit@witstudio.net

신고

Introduction

이번 강좌는 WPF를 이용해 위 그림과 같이 RadioButton 컨트롤 목록을 구하고 데이터 바인딩을 구성하는 과정에서 발생할 수 있는 이슈와 이를 해결하는 방법에 대해 소개합니다. 일반적으로 RadioButton으로 목록을 구현하고자 할때 가장먼저 떠오르는 방법은 StackPanel을 이용해 구현하는 방법입니다.


Some Problems

한눈에 보기에는 별로 문제가 없어 보이지만, 위 코드에 특정 속성에 대하여 RadioButton의 체크 상태에 데이터 바인딩을 구성하고자 한다면 약간의 이슈가 발생 합니다. 대상 속성에 저장된 값은 하나지만, 비교 대상이 다수 이기 때문에 이를 위해 ValueConverter를 구현 해야합니다. ValueConverter를 적용한 코드는 아래와 같습니다.


위 코드를 통해 해결은 가능하지만 항목이 동적으로 추가가된다거나, 반대로 현재 선택된 값을 가져오고자 한다면 또 다시 아래와 같은 코드를 이용해 현재 선택된 값을 가져오는 과정이 필요합니다. 


이제 생각해볼 문제는 어떻게 하면 더 간단하고 명확하게 위와 같은 RadioButton 목록을 구현하는가에 대한 내용입니다.

Using ListBox Template

WPF에서 목록하면 가장먼저 떠오르는 컨트롤인 ListBox를 이용해 RadioButton목록을 구현하는 방법에 대해 소개합니다. ListBox는 어떤 타입이든지 목록으로 표현이 가능하고 아이템에 대한 템플릿을 정의 할 수 있기 때문에 보다 효과적으로 RadioButton 목록을 구현 할 수 있습니다. 아래는 RadioButton목록을 구현하기 위한 ListBox의 ItemContainerStyle입니다.



ListBoxItem Template을 RadioButton으로 정의 하고 RadioButton의 IsChecked속성을 ListBox의 IsSelected속성에 바인딩 합니다. 그리고 RadioButton의 Content속성에는 ListBox에 항목이 출력되도록 ContentPresenter를 추가합니다. RadioButton의 Focusable과 IsHitTestVisible 속성을 False로 지정한 이유는 RadioButton이 ListBox에서의 Selected여부에 따라서만 동작하도록 하기 위함입니다. 이제 위 스타일을 이용해 RadioButton 목록을 구현하면 아래와 같이 사용할 수 있습니다.


SelectedValue에는 바인딩 대상이 되는 속성을 입력하고, SelectedValuePath를 Content로 지정하게 되면 그림과 같이 아이템의 Content속성과 SelectedValue와 일치하는 항목이 체크되는것을 확인 하실 수 있습니다. 반대로 ListBox의 SelectedValue속성을 이용하면, 현재 선택된 RadioButton의 값을 가져올수 있습니다.


신고

Introduction

WPF에서 제공되는 Grid컨트롤에는 ShowGridLine속성을 통해 현재 Grid에 정의된 Column과 Row를 확인 할 수 있습니다. 하지만, ShowGridLine을 사용 했을 경우 아래 그림과 같이 점선으로 표현되고, ColumnSapn 또는 RowSpan이 적용되지 않는것을 확인 하실 수 있습니다. 이번 강좌에서는 Grid에 정의된 Column과 Row에 해당하는 Gridline을 그리는 방법과, ColumnSpan, RowSpan이 적용된 Gridline을 그리는 방법에 대해 소개합니다.

Basic Grid Line

먼저 Grid에 정의된 ColumnDefinition과 RowDefinitions에 맞게 Grid Line을 그리기 위해 Grid를 상속받는 CustomGrid객체를 생성합니다. 그리고 Grid의 OnRender메서드를 아래와 같이 재정의 하면 간단하게 아래와 같은 모양의 결과를 얻을 수 있습니다.



Basic Grid Line Result


결과를 확인해보면, ColumDefinitions와 RowDefinitions에 정의된 값에만 의존하여 Line을 그렸기때문에 ColumnSpan과 RowSpan이 고려되지 않고 모든 Cell에 Line이 적용된것을 확인 하실 수 있습니다. ColumnSpan과 RowSpan은 Grid에 포함된 자식 컨트롤에서 결정되기 때문에 만약 ColumnSpan과 RowSpan을 반영하여 Gridline을 적용하고자 한다면 아래와 같이 자식 컨트롤로부터 Span 정보를 불러와 이에 맞게 처리 해줄 수 있는 코드가 필요합니다.

Extension Grid Line

Extension Grid Line Result

 

Development TIP

만약 달력 컨트롤과 같이 많은 Column과 Row를 포함하는 컨트롤을 개발할 때 GridLine을 적용하면 보다 편리하게 구현 하실수 있습니다. 이번 강좌에서 설명한 GridLine에 대한 예제(달력 컨트롤)는 Sample 페이지에서 확인 하실 수 있습니다.
신고