.NET WinForms에서 Excel과 유사한 수식 입력줄 만들기 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

.NET WinForms에서 Excel과 유사한 수식 입력줄 만들기

페이지 정보

작성자 GrapeCity 작성일 21-04-12 11:27 조회 3,780회 댓글 0건

본문

첨부파일

ComponentOne 계산 엔진인 “C1CalcEngine”은 식/수식 구문 분석 및 계산을 지원하는 .NET Standard 라이브러리로서 모든 ComponentOne .NET 플랫폼에 제공되며 수식 계산을 용이하게 하는 데 사용할 수 있습니다.

이 라이브러리는 비즈니스 개체에 대한 광범위한 계산 지원, Microsoft Excel 형식을 따르는 텍스트 식 구문 분석을 위한 즉각적으로 사용 가능한 식 구문 분석기와 같은 여러 가지 고급 기능을 갖추고 있습니다.

Excel과 유사 위 이미지는 Excel 스타일의 식을 FlexGrid를 따라 Excel과 유사한 수식 입력줄에 표시한 것입니다.

이러한 고급 기능 중 하나는 워크시트 간 참조입니다. 이 포스팅에서는 .NET WinForms 응용 프로그램에서 이 기능을 사용해 Excel과 유사한 수식 입력줄을 구성하는 방법을 안내합니다.


워크시트 간 셀 참조란?

셀 참조는 워크시트에서 셀/셀 범위 위치를 지정하는 좌표의 집합입니다. 수식의 셀 참조는 해당 셀에 포함된 데이터를 가져오고 처리하는 데 사용됩니다. 참조를 사용함으로써 얻을 수 있는 이점 중 하나는 이 셀의 값이 변경될 때마다 수식의 결과가 자동으로 업데이트된다는 것입니다.

이 외에도 데이터가 여러 시트에 분산되어 있는 시나리오가 있습니다. 이러한 상황에서는 셀이 다른 워크시트에 있는 셀을 참조할 수 있습니다. 이 경우 C1CalcEngine 워크시트 간 참조 기능이 유용합니다.

다른 워크시트의 셀을 참조하려면 대상 셀/셀 범위를 식별하는 것이 필요하지만 셀이 있는 시트를 식별해야 합니다. 이를 위해 Excel처럼 느낌표(!)로 구분된 셀/셀 범위 참조 앞에 대상 워크시트 이름이 정의됩니다.

=Sum(sheet1!A1:B2) + Max(sheet2!A1:C7)

여기에서는 식이 두 개의 시트, 즉 “sheet1” 및 “sheet2”를 사용하고 각각 “Sum”과 “Max”라는 수학적 함수를 적용합니다. 


Excel과 유사한 수식 입력줄을 만드는 방법

Excel에서 수식 입력줄은 최종 사용자가 워크시트 셀에 포함된 데이터 값과 수식을 편집할 수 있게 해주는 시각적 요소입니다.

수식 입력줄

위 이미지는 MS Excel에서 수식 입력줄 컴포넌트를 표시한 것입니다.

C1CalcEngine을 사용하면 .NET 응용 프로그램에서 Excel과 유사한 수식 입력줄 동작을 쉽게 추가할 수 있습니다. 어떻게 하는지 살펴보겠습니다.


단계 

UI 컴포넌트가 아닌 C1CalcEngine은 폼에 표시할 시각적 컴포넌트를 제공하지 않습니다. 따라서 WinForms 응용 프로그램에서 수식 입력줄 동작을 강화하고 Excel과 유사한 수식을 정의하려면 자체 수식 입력줄을 구성해야 합니다.

Excel과 유사한 수식 입력줄을 구성하려면 TextBox 및 Button 컨트롤을 사용해 식을 표시/입력하고 C1CalcEngine을 사용해 이러한 계산용 식을 구문 분석하면 됩니다. 아래에서 .NET WinForms 응용 프로그램에서 Excel과 유사한 수식 입력줄을 추가하는 방법을 설명하도록 하겠습니다.

전체 구현을 다음과 같이 나눠 진행하겠습니다.

  • 응용 프로그램 설정

  • 라이브러리에 참조 추가

  • DataSource 만들기

  • C1CalcEngine을 DataSource에 바인딩

  • Excel 스타일 식 지정

  • C1CalcEngine을 사용해 식 평가


응용 프로그램 설정

  1. 새로운 Windows Forms 응용 프로그램을 만들어 CalcEngine_CrossShee__t라는 이름을 지정합니다.

  2. TextBox 컨트롤을 추가하여 식을 표시합니다.

  3. Button 컨트롤을 추가하여 식의 구문 분석을 트리거하고 식의 “Text” 속성을 ‘Evaluate’로 설정합니다.

  4. Label 컨트롤을 폼에 추가하고 폼의 “Text” 속성을 'Result'로 설정합니다.

  5. 다른 TextBox 컨트롤을 추가하여 식 평가 결과를 표시합니다.

  6. 설명을 돕기 위해 두 개의 FlexGrid 컨트롤을 폼에 추가하여 상호 참조를 포함하는 두 개의 Excel 워크시트를 표시합니다.

완료 후 폼

이 단계를 완료한 후 폼은 위 이미지와 비슷해야 합니다.


참조 추가

  1. NuGet 패키지 관리자를 사용해 C1CalcEngine NuGet 패키지를 설치합니다.

  2. 코드 보기로 전환하여 다음 네임스페이스를 추가합니다.

    using C1.CalcEngine;
    using C1.CalcEngine.ExcelEngine;
    using C1.Win.C1FlexGrid;

     

데이터 소스 만들기

시트 간 참조를 사용하려면 참조되는 모든 워크시트를 C1CalcEngine에 대한 데이터 소스로 전달해야 합니다. 그러면 목록의 각 요소가 C1CalcEngine을 위한 시트의 역할을 하게 됩니다. C1CalcEngine이 평가하는 식은 이 시트와 시트 이름을 사용해 시트 간 참조를 구현합니다.

따라서 FlexGrid의 DataSource로 사용될 IDataSheet 인터페이스를 구현하는 사용자 정의 DataTable을 만들어 보겠습니다. 이렇게 하면 바인딩된 FlexGrid 컨트롤이 생성되어 C1CalcEngine을 위한 DataSource로 사용됩니다.

//Custom DataTable implementing IDataSheet
public class SheetTable : DataTable, IDataSheet
{
  public string Name
  {
      get => TableName;
      set => TableName = value;
  }
  public object GetValue(int col, int row)
  {
      return Rows[row][col];
  }
}


CalcEngine을 데이터 소스에 바인딩하기

다음 코드를 사용해 C1CalcEngine과 문자열 변수를 전역적으로 정의합니다.

private C1CalcEngine _calcEngine;
private const string ColumnNames = "ABCDEF";


다음 메서드를 추가해 C1FlexGrid의 DataSource로 사용될 SheetTable 클래스를 초기화합니다.

//Generate DataTable to be used as FlexGrid's DataSource
public SheetTable GetDataTable(string sheetName)
{
  var table = new SheetTable();
  table.Name = sheetName;
  foreach (var col in ColumnNames)
      table.Columns.Add(col.ToString(), typeof(int));
  for (int i = 0; i < 80; i++)
      table.Rows.Add(new object[] { i * 2, i * 3, i * 4, i * 5, i * 6, i * 7 });
  return table;
}


위에 정의된 메서드를 사용해 FlexGrids의 DataSource를 생성하고 시트를 C1CalcEngine의 DataSource로 사용합니다.

var sheet1 = GetDataTable("Sheet1");
var sheet2 = GetDataTable("Sheet2");
c1FlexGrid1.DataSource = sheet1;
c1FlexGrid2.DataSource = sheet2;
​
_calcEngine.DataSource = new List<IDataSheet> { sheet1, sheet2 };


식 지정

워크시트(FlexGrid)에서 선택이 변경됨에 따라 수식 입력줄(식 텍스트 상자)을 업데이트하려면 FlexGrid 컨트롤용 SelChange 이벤트를 처리하십시오. 이벤트 처리기를 다음과 같이 정의하여 FlexGrid 인스턴스의 현재 선택에 따라 C1CalcEngine 식을 생성합니다.

//Get grid selection and create Excel expression
private void grid_SelChange(object sender, System.EventArgs e)
{    
  tbExpression.Text = string.Format("=Sum(sheet1!{0}) + Sum(sheet2!{1})", GetMark(c1FlexGrid1), GetMark(sheet2));
}


다음 메서드를 정의해 C1CalcEngine에 의해 평가되도록 FlexGrid 선택을 Excel 식 표기법으로 변환합니다.

private string GetMark(C1FlexGrid grid)
{
  var sel = grid.Selection;
  return string.Format("{0}{1}:{2}{3}", ColumnNames[sel.LeftCol - 1], sel.TopRow, ColumnNames[sel.RightCol - 1], sel.BottomRow);
}


수식 샘플 입력줄

위 이미지에서는 샘플 식이 포함된 수식 입력줄을 보여줍니다.


결과 평가

만든 Excel 스타일 식을 평가하려면 C1CalcEngine 클래스의 TryEvaluate 메서드를 사용하십시오. 이를 위해서 버튼의 클릭 이벤트를 처리하고 여기에 다음 코드를 추가합니다.

//Evaluate the created Excel expression
private void btnEvaluate_Click(object sender, EventArgs e)
{
  _calcEngine.Expression = tbExpression.Text;
  if (_calcEngine.TryEvaluate(out object result))        
      tbResult.Text = (result ?? "").ToString();
  else        
      tbResult.Text = _calcEngine.GetErrors().FirstOrDefault()?.FullMessage ?? "";
}


수식 입력줄

반드시 첨부 파일을 통해 샘플 응용프로그램을 다운로드하여 사용 사례 시나리오에서 사용해 보세요.


  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그

인기글

더보기
  • 인기 게시물이 없습니다.
그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@grapecity.com | 전화 : 1670-0583 | 경기도 안양시 동안구 시민대로 230, B-703(관양동, 아크로타워) 그레이프시티(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 Copyright ⓒ 2022 GrapeCity inc.