.NET 개체를 위한 풍부한 스프레드시트 셀 데이터 타입 소개 > 블로그 & Tips

본문 바로가기

Spread.NET

블로그 & Tips

.NET 개체를 위한 풍부한 스프레드시트 셀 데이터 타입 소개

페이지 정보

작성자 GrapeCity 작성일 21-04-14 10:52 조회 305회 댓글 0건

본문

Spread.NET v14 릴리스에는 사용자 정의 개체를 위한 데이터 형식 만들기를 지원하는 새로운 셀 데이터 형식 기능이 포함되어 있습니다. 이 기능을 통해 어떤 셀도 Spread 인스턴스에서 원격으로 호출할 수 있는 다양한 정형 데이터 집합을 포함할 수 있습니다. Excel과 마찬가지로 데이터 형식은 셀에 적용하거나 데이터 테이블로 적용할 수 있고 설정된 글리프 아이콘에 의해 쉽게 식별할 수 있습니다. 사용자는 아이콘을 클릭하여 데이터에 따라 필드와 이에 상응하는 값의 목록을 표시할 수 있습니다. 작업 및 확인할 수 있는 다수의 필드/값 쌍이 있을 수 있습니다.


이 기능을 사용할 때 다음과 같이 CalcFeatures를 FieldValue로 활성화해야 합니다.

// Enable CalcFeatures to FieldValue
fpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.CalcFeatures = CalcFeatures.FieldValue;


또는 다음과 같이 완전히 새로워진 계산 엔진 기능을 활성화할 수도 있습니다.

// Enable CalcFeatures to All
fpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.CalcFeatures = CalcFeatures.All;


최종 사용자는 간단한 팝업 데이터 카드가 포함된 Spread 인터페이스를 통해 사용자 정의 개체의 정보에 액세스할 수 있습니다. 팝업 데이터 카드는 사용자 정의할 수도 있습니다.


아래에서는 데이터 카드에 표시할 이미지를 URL에서 로드하여 사용자 정의하는 모습을 보여드립니다. 이를 통해 사용자는 이미지를 확인하고 Spread 인스턴스에 이미지를 추가할 수 있습니다.


또 다른 유용한 동작은 선택한 데이터를 오른쪽의 셀 또는 열로 빠르게 삽입하는 데 사용되는 삽입 버튼입니다. 개발자는 삽입 버튼 사용 시 사용할 수 있는 데이터를 정의할 수도 있습니다. 당사는 셀 데이터 형식 구현 시 이 새로운 셀 데이터 형식과 다양한 사용 사례와 함께 포함되는 기능을 구분하였습니다.


여기서 보시다시피 사용자는 글리프 아이콘을 클릭해 데이터 카드를 표시하여 구조화된 데이터 필드를 확인할 수 있습니다(1). 사용자는 삽입 버튼을 사용해 선택한 데이터 필드를 삽입할 수 있습니다(2). 데이터를 삽입하는 또 다른 방법은 데이터 카드 팝업을 사용하는 것입니다(3).


아래 gif에서는 데이터 카드를 사용해 데이터를 삽입할 때 사용자 정의 코드가 포함된 이미지 필드가 셀의 이미지 셀 유형을 표시하도록 설정됩니다. 이 사용자 정의 코드에 대해서는 이 블로그의 후반부에서 더 자세히 살펴보겠습니다.


049875a10a47a10b8eb40133a21a5415_1618364943_1615.gif
 

글리프 및 데이터 카드 사용법


사용자는 글리프를 적용해 Spread 인스턴스에서 데이터 형식을 표시할 수 있습니다. 이미지가 Embedded Resource인 클래스는 이 이미지를 스트림으로 가져오고 반환하여 Spread 인스턴스에 표시합니다.


예를 들어 아래에서는 camera.png 글리프를 추가하여 데이터 형식 셀을 표시합니다.

// Add glyph that will be used to indicate data type cells
string IMedia.ContentType => "image/png";
Stream IMedia.Data
{
get
{
  return GetType().Assembly.GetManifestResourceStream("CellDataType_Movies.Camera.png");
}
}


프로젝트의 이름은 CellDataType_Movies입니다. 바로 이 프로젝트에 camera.png 파일이 추가됩니다.

또한 포함된 글리프 파일 속성을 다음과 같이 Embedded Resource가 될 빌드 작업으로 설정해야 합니다.

.NET 개체용 셀 데이터 형식 도입


이제 Spread 인스턴스가 실행되면 글리프가 표시됩니다. 클릭하면 데이터 카드가 팝업되어 개체의 사용 가능 필드 및 값을 표시합니다. Spread는 DataTable 또는 셀의 DataView 열에서 데이터를 추출할 수 있도록 DataTable 및 DataView를 지원합니다. Spread는 DataTable 또는 셀의 DataView 열에서 데이터를 제거할 수 있게 해주는 DataTable 및/또는 DataView로 셀 데이터 형식을 설정하는 기능을 지원합니다.


데이터 형식을 DataView에 적용하고 데이터 카드 또는 삽입 버튼을 사용해 데이터를 삽입할 경우 선택한 데이터 필드는 오른쪽의 비어 있는 가장 가까운 셀로 삽입됩니다. 선택한 데이터 필드가 표시된 셀에는 관련 수식이 포함되어 있습니다(1). 데이터 형식이 DataTable에 적용되고 사용자가 데이터 카드 또는 삽입 버튼을 사용해 데이터를 삽입하는 경우 데이터의 새로운 테이블 열이 선택한 속성의 관련 값으로 채워지는 테이블의 오른쪽에 추가됩니다(2).


두 시나리오에서 데이터를 삽입하는 작업은 아래 이미지와 같습니다.

049875a10a47a10b8eb40133a21a5415_1618364967_8499.gif
 

또한 개발자는 DataCard 팝업을 사용자 정의하고, 속성이 선택될 때 이미지를 표시하고, 이 이미지를 Spread 인스턴스에 삽입할 수 있습니다.


예를 들어 아래에서는 URL에서 영화 포스터를 로드합니다.


이를 위해서는 다음과 같이 먼저 System.Drawing.Image 클래스를 사용해 이미지를 만들고 System.Net.WebClient 클래스를 사용해 새로운 WebClient 인스턴스를 만들어 이미지의 URL을 가져오고 이 URL에서 이미지를 Spread 인스턴스로 스트리밍해야 합니다.

public static Image GetPosterFromUrl(string imageUrl)
      {
          Image image = null;
          using (WebClient webClient = new WebClient())
          {
              ServicePointManager.Expect100Continue = true;
              ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
​
              byte[] data = webClient.DownloadData(imageUrl);
​
              using (MemoryStream mem = new MemoryStream(data))
              {
                  image = Image.FromStream(mem);
              }
          }
          return image;
      }


그다음에는 이미지가 될 Poster라는 새로운 클래스 멤버를 정의합니다.

public class Movie : IMedia
  {
      public Image Poster { get; set; }
      …
  }


그러면 Poster 멤버는 사용자 정의 개체를 만들 때 Movie 클래스를 사용해 이미지(GetPosterFromUrl을 사용해 URL에서 스트리밍됨)를 만듭니다.

// Create custom objects using Movie class for the top 10 highest box office movies
GrapeCity.CalcEngine.RichValue<Movie> AvengersEndgame = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/0/0d/Avengers_Endgame_poster.jpg"),
              Title = "Avengers: Endgame",
              Rank = 1,
              BoxOffice = "$2.798 billion",
              Year = 2019,
              Director = "Anthony Russo & Joe Russo",
              Producer = "Kevin Feige",
              RunTime = "181 minutes",
          });


이어서 다음과 같이 사용자 정의 함수를 만들어 ListBox를 만들고 셀의 정보를 가져와 이미지를 표시합니다.

// ListBox_Click to load display the image in a Spread cell
      private void ListBox_Click(object sender, EventArgs e)
      {
          ListBox list = sender as ListBox;
          if (list.SelectedIndex == 0)
          {
              SheetView sheet = fpSpread1.ActiveSheet;
              int row = sheet.ActiveRowIndex;
              int activeColumn = sheet.ActiveColumnIndex;
              int column;
              for (column = sheet.ActiveColumnIndex + 1; sheet.GetValue(row, column) != null; column++) ;
              ImageCellType imgCellType = new ImageCellType();
              imgCellType.Style = FarPoint.Win.RenderStyle.StretchAndScale;
              IWorksheet ws = fpSpread1.AsWorkbook().ActiveSheet;
              while (ws.Cells[row, activeColumn].Table != null)
                  sheet.Cells[row++, column].CellType = imgCellType;
          }
          list.Click -= ListBox_Click;
      }


끝으로 다음과 같이 사용자 정의 함수를 FpSpread.ResolveCusomerControl 이벤트 처리기 및 FpSpread1에 연결하는 방식으로 클릭 이벤트 수신을 추가하여 이미지를 Spread 인스턴스에 표시합니다.

private void FpSpread1_ResolveCustomControl(object sender, ResolveCustomControlEventArgs e)
      {
              e.Control = e.CreateDefaultControl();
              ListBox listBox = e.Control.Controls[0] as ListBox;
              Image img = null;
              if (listBox != null)
              {
                  RichValue<Movie> richMovie = e.Spread.ActiveSheet.ActiveCell.Value as RichValue<Movie>;
                  object value = null;
                  if (richMovie != null && richMovie.TryGetFieldValue("Poster", out value))
                  {
                      img = value as Image;
                  }
                  if (img != null)
                  {
                      //listBox.Items.RemoveAt(0);
                      listBox.Top += img.Height;
                      e.Control.Height += img.Height;
                      PictureBox pictureBox = new PictureBox();
                      e.Control.Controls.Add(pictureBox);
                      pictureBox.Image = img;
                      pictureBox.SetBounds(0, 0, img.Width, img.Height);
                      listBox.Click += ListBox_Click;
​
                    }
          }
      }


코드 논리를 적용한 후 다음과 같이 ResolveCustomControl을 참조해야 합니다.

// Attach Event Handler
this.fpSpread1.ResolveCustomControl += new System.EventHandler<FarPoint.Win.Spread.ResolveCustomControlEventArgs>(this.FpSpread1_ResolveCustomControl);


이 코드 논리를 적용하면 URL의 이미지가 데이터 팝업 카드에 표시되고, 데이터 카드에서 선택된 이미지가 다음과 같이 Spread 컨트롤에 표시됩니다.

049875a10a47a10b8eb40133a21a5415_1618365008_1834.gif
 


삽입 버튼 사용법


Spread. NET의 셀 데이터 형식 기능에는 셀(데이터 형식이 추가되어 있음)에 표시되는 삽입 버튼이 포함되어 있습니다. 최종 사용자는 이 삽입 버튼을 사용해 오른쪽의 비어 있는 가장 가까운 셀에 관련 속성을 추가할 수 있습니다.


그다음에는 선택된 데이터를 추가하고 표시하는 데 수식이 사용됩니다. 이러한 셀에 테이블을 적용하고 삽입 버튼을 사용하면 Spread는 추가된 속성의 이름이 있는 열을 추가하고 수식을 사용해 열의 관련 값을 입력합니다.


또한 사용자는 기본 제공 바로 가기 키 *Ctrl + Shift + F5*를 사용해 셀 데이터 형식에 대해 ShowCard 동작을 호출하거나 셀의 글리프를 클릭할 수 있습니다.


또한 개발자는 Spread 인스턴스에서 수식을 적용해 삽입 버튼을 사용하지 않고도 고객 .NET 데이터 개체의 속성에 액세스할 수 있습니다.


수식을 사용할 때는 반드시 B2.Property1 구문을 따르십시오.


속성의 이름에 공백이 있는 경우 B2.[The Property 1]과 같이 속성 이름을 대괄호 안에 집어넣으십시오.


다음과 같이 디자인 타임 중에 추가하고 Spread 인스턴스에 연결할 수 있는 formulaTextBox를 사용해 셀에 적용되는 수식이 표시됩니다.


049875a10a47a10b8eb40133a21a5415_1618365051_3701.gif
 


사용자는 FpSpread.ResolveCustomControlEvent를 사용해 삽입 버튼의 팝업 카드에서 이 데이터를 사용자 정의할 수 있습니다.

그런 다음, 버튼을 만들고 버튼을 클릭하면 원하는 데이터가 표시됩니다.


이 예시에서는 Spread 이벤트 내에서 데이터 카드를 사용자 정의하여 "Box Office"라는 텍스트를 표시합니다.


이 삽입 버튼을 클릭하면 오른쪽 바깥의 셀이 영화의 BoxOffice로 채워집니다.

private void FpSpread1_ResolveCustomControl(object sender, ResolveCustomControlEventArgs e)
      {
          if (e.Type == CustomControlType.RichValueInsert)
          {
              Button button = new Button();
              button.Click += (object sender1, EventArgs buttonEventArgs) =>
              {
                  e.Command.Execute("BoxOffice", e.Spread);
              };
              button.Text = "Box Office";
              e.Control = button;
          }
          else
          {
              e.Control = e.CreateDefaultControl();
              ListBox listBox = e.Control.Controls[0] as ListBox;
              Image img = null;
              if (listBox != null)
              {
                  RichValue<Movie> richMovie = e.Spread.ActiveSheet.ActiveCell.Value as RichValue<Movie>;
                  object value = null;
                  if (richMovie != null && richMovie.TryGetFieldValue("Poster", out value))
                  {
                      img = value as Image;
                  }
                  if (img != null)
                  {
                      //listBox.Items.RemoveAt(0);
                      listBox.Top += img.Height;
                      e.Control.Height += img.Height;
                      PictureBox pictureBox = new PictureBox();
                      e.Control.Controls.Add(pictureBox);
                      pictureBox.Image = img;
                      pictureBox.SetBounds(0, 0, img.Width, img.Height);
                      listBox.Click += ListBox_Click;
                  }
              }
          }
      }


반드시 이벤트 처리기를 Spread 인스턴스에 연결해야 합니다.

// Attach Event Handler
this.fpSpread1.ResolveCustomControl += new System.EventHandler<FarPoint.Win.Spread.ResolveCustomControlEventArgs>(this.FpSpread1_ResolveCustomControl);


이 사용자 정의를 적용하면 삽입 버튼이 다음과 같이 Box Office 버튼만 표시합니다.

.NET 개체용 셀 데이터 형식 도입



사용 사례: 셀 데이터 형식 구현


아래에서는 몇 가지 사용 사례를 통해 셀 데이터 형식 구현에 대해 알아보겠습니다.

이 사용 사례에는 셀 데이터 형식을 단일 셀 및 데이터 테이블로 구현하고 사용하는 방법, 배열에서 사용자 정의 개체를 Spread 인스턴스로 구현하는 방법이 포함되어 있습니다.


셀 데이터 형식을 만들 때 다음과 같은 세 가지 주요 단계를 따르십시오.

  • 셀 데이터 형식에 대한 클래스를 정의하고 해당 개체에 대해 표시하려는 속성을 지정합니다.

  • 적절한 속성으로 초기화된 클래스의 인스턴스를 만들고, RichValue < T >를 사용해 클래스 인스턴스를 사용하는 IRichValue 개체를 만듭니다.

  • 셀 수식을 사용해 셀 데이터 형식 개체 필드를 직접 참조하여 값을 가져오거나 셀 수식으로 특정 계산을 수행합니다. 이때 셀 데이터 형식 개체 및 ".[필드 이름]" 구문(예: "B2.BoxOffice")을 포함하는 셀에 대한 표준 셀 참조를 사용합니다.

  • 리플레션이 필요 없는 추가 컨트롤과 더 빠른 구현을 위해서는 셀 데이터 형식 클래스에서 직접 IRichValue를 구현하고 인터페이스를 통해 필드를 지정하십시오.



셀 데이터 형식을 단일 셀 또는 데이터 테이블에 추가


사용자는 셀 데이터 형식을 통해 새로운 데이터 형식을 셀 또는 데이터 테이블에 추가하여 사용자 정의 개체를 구현하고 사용자 정의 개체와 상호 작용할 수 있습니다.

아래 섹션에서는 데이터 형식을 만들어 셀에, 데이터 테이블로 추가하는 방법을 자세히 설명합니다.


이를 위해서는 다음 단계를 따르십시오.

  1. 클래스 정의

  2. 사용자 정의 개체를 만들어 셀에 추가

  3. 셀을 데이터 테이블에 추가



1단계: 클래스 정의

C#:

// 1.) Defining a class: Movie class
// Create class with member variables: Rank, Title, BoxOffice, Year, Director, Producer, RunTime, Post
// Set the default class member to be Title
[System.Reflection.DefaultMember("Title")]
public class Movie : IMedia
{
    public Image Poster { get; set; }
    public string Title { get; set; }
    public int Rank { get; set; }
    public string BoxOffice { get; set; }
    public int Year { get; set; }
    public string Director { get; set; }
    public string Producer { get; set; }
    public string RunTime { get; set; }
​
    // Add glyph that will be used to indicate data type cells
    string IMedia.ContentType => "image/png";
    Stream IMedia.Data
    {
        get
        {
            return GetType().Assembly.GetManifestResourceStream("CellDataType_Movies.Camera.png");
        }
​
    }
}


2단계: 사용자 정의 개체를 만들어 셀에 추가

C#:

private void Form1_Load(object sender, EventArgs e)
      {
          // Enable CalcFeatures to All
          fpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.CalcFeatures = CalcFeatures.All;
          fpSpread1.ActiveSheet.Columns[1, 10].Width = 120;
          // 2.) Create custom objects using Movie class for the top 10 highest box office movies
          GrapeCity.CalcEngine.RichValue<Movie> AvengersEndgame = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/0/0d/Avengers_Endgame_poster.jpg"),
              Title = "Avengers: Endgame",
              Rank = 1,
              BoxOffice = "$2.798 billion",
              Year = 2019,
              Director = "Anthony Russo & Joe Russo",
              Producer = "Kevin Feige",
              RunTime = "181 minutes",
          });
          GrapeCity.CalcEngine.RichValue<Movie> Avatar = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/thumb/b/b0/Avatar-Teaser-Poster.jpg/220px-Avatar-Teaser-Poster.jpg"),
              Title = "Avatar",
              Rank = 2,
              BoxOffice = "$2.79 billion",
              Year = 2009,
              Director = "James Cameron",
              Producer = "James Cameron",
              RunTime = "162 minutes",
          });
          GrapeCity.CalcEngine.RichValue<Movie> Titanic = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/1/19/Titanic_%28Official_Film_Poster%29.png"),
              Title = "Titanic",
              Rank = 3,
              BoxOffice = "$2.195 billion",
              Year = 1997,
              Director = "James Cameron",
              Producer = "James Cameron & Jon Landau",
              RunTime = "162 minutes",
          });
          GrapeCity.CalcEngine.RichValue<Movie> StarWars_TheForceAwakens = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/a/a2/Star_Wars_The_Force_Awakens_Theatrical_Poster.jpg"),
              Title = "Star Wars: The Force Awakens",
              Rank = 4,
              BoxOffice = "$2.068 billion",
              Year = 2015,
              Director = "J. J. Abrams",
              Producer = "Kathleen Kennedy, J.J.Abrams, & Bryan Burk",
              RunTime = "135 minutes",
          });
          GrapeCity.CalcEngine.RichValue<Movie> Avengers_InfinityWars = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/4/4d/Avengers_Infinity_War_poster.jpg"),
              Title = "Avengers: Infinity Wars",
              Rank = 5,
              BoxOffice = "$2.048 billion",
              Year = 2018,
              Director = "Anthony Russo & Joe Russo",
              Producer = "Kevin Feige",
              RunTime = "149 minutes",
          });
          GrapeCity.CalcEngine.RichValue<Movie> JurassicWorld = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/thumb/6/6e/Jurassic_World_poster.jpg/220px-Jurassic_World_poster.jpg"),
              Title = "Jurassic World",
              Rank = 6,
              BoxOffice = "$1.670 billion",
              Year = 2015,
              Director = "Colin Trevorrow",
              Producer = "Frank Marshall & Patrick Crowley",
              RunTime = "124 minutes",
          });
          GrapeCity.CalcEngine.RichValue<Movie> TheLionKing = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/9/9d/Disney_The_Lion_King_2019.jpg"),
              Title = "The Lion King",
              Rank = 7,
              BoxOffice = "$1.657 billion",
              Year = 2019,
              Director = "Jon Favreau",
              Producer = "Jon Favreau, Jeffrey Silver & Karen Gilchrist",
              RunTime = "118 minutes",
          });
          GrapeCity.CalcEngine.RichValue<Movie> TheAvengers = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/8/8a/The_Avengers_%282012_film%29_poster.jpg"),
              Title = "The Avengers",
              Rank = 8,
              BoxOffice = "$1.519 billion",
              Year = 2012,
              Director = "Joss Whedon",
              Producer = "Kevin Feige",
              RunTime = "143 minutes",
          });
          GrapeCity.CalcEngine.RichValue<Movie> Furious7 = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/thumb/b/b8/Furious_7_poster.jpg/220px-Furious_7_poster.jpg"),
              Title = "Furious 7",
              Rank = 9,
              BoxOffice = "$1.516 billion",
              Year = 2015,
              Director = "James Wan",
              Producer = "Neal H. Moritz, Vin Diesel & Michael Fottrell",
              RunTime = "137 minutes",
          });
          GrapeCity.CalcEngine.RichValue<Movie> FrozenII = new GrapeCity.CalcEngine.RichValue<Movie>(new Movie()
          {
              Poster = Movie.GetPosterFromUrl("https://upload.wikimedia.org/wikipedia/en/thumb/4/4f/Frozen_2_poster.jpg/220px-Frozen_2_poster.jpg"),
              Title = "Frozen II",
              Rank = 10,
              BoxOffice = "$1.450 billion",
              Year = 2019,
              Director = "Chris Buck & Jennifer Lee",
              Producer = "Peter Del Vecho",
              RunTime = "103 minutes",
          });
          // 2b.) Set formulas to apply Movies value
          fpSpread1.AsWorkbook().ActiveSheet.Cells["A2"].Formula = "B2.Rank";
          fpSpread1.AsWorkbook().ActiveSheet.Cells["A3"].Formula = "B3.Rank";
          fpSpread1.AsWorkbook().ActiveSheet.Cells["A4"].Formula = "B4.Rank";
          fpSpread1.AsWorkbook().ActiveSheet.Cells["A5"].Formula = "B5.Rank";
          fpSpread1.AsWorkbook().ActiveSheet.Cells["A6"].Formula = "B6.Rank";
          fpSpread1.AsWorkbook().ActiveSheet.Cells["A7"].Formula = "B7.Rank";
          fpSpread1.AsWorkbook().ActiveSheet.Cells["A8"].Formula = "B8.Rank";
          fpSpread1.AsWorkbook().ActiveSheet.Cells["A9"].Formula = "B9.Rank";
          fpSpread1.AsWorkbook().ActiveSheet.Cells["A10"].Formula = "B10.Rank";
          fpSpread1.AsWorkbook().ActiveSheet.Cells["A11"].Formula = "B11.Rank";
          // 2b.) Set the Movie object in the cells
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B2"].Value = AvengersEndgame;
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B3"].Value = Avatar;
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B4"].Value = Titanic;
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B5"].Value = StarWars_TheForceAwakens;
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B6"].Value = Avengers_InfinityWars;
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B7"].Value = JurassicWorld;
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B8"].Value = TheLionKing;
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B9"].Value = TheAvengers;
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B10"].Value = Furious7;
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B11"].Value = FrozenII;
      }


결과: 데이터 형식이 셀에 추가됨

이 코드 논리를 적용하면 Spread 컨트롤이 영화 멤버의 값을 B 열에 표시하고 수식을 사용해 순위 속성을 참조하여 영화의 순위를 A 열에 표시합니다. 최종 사용자는 수식을 수동으로 입력하거나 Spread의 UI 삽입 버튼 또는 데이터 카드를 사용해 이 수식을 삽입함으로써 데이터를 새로운 셀에 삽입할 수 있습니다.


049875a10a47a10b8eb40133a21a5415_1618365092_6363.gif
 


3단계: 셀을 데이터 테이블에 추가

C#:

// 2b.) Set the Movie object in the cells
fpSpread1.AsWorkbook().ActiveSheet.Cells["B2"].Value = AvengersEndgame;
fpSpread1.AsWorkbook().ActiveSheet.Cells["B3"].Value = Avatar;
fpSpread1.AsWorkbook().ActiveSheet.Cells["B4"].Value = Titanic;
fpSpread1.AsWorkbook().ActiveSheet.Cells["B5"].Value = StarWars_TheForceAwakens;
fpSpread1.AsWorkbook().ActiveSheet.Cells["B6"].Value = Avengers_InfinityWars;
fpSpread1.AsWorkbook().ActiveSheet.Cells["B7"].Value = JurassicWorld;
fpSpread1.AsWorkbook().ActiveSheet.Cells["B8"].Value = TheLionKing;
fpSpread1.AsWorkbook().ActiveSheet.Cells["B9"].Value = TheAvengers;
fpSpread1.AsWorkbook().ActiveSheet.Cells["B10"].Value = Furious7;
fpSpread1.AsWorkbook().ActiveSheet.Cells["B11"].Value = FrozenII;
​
// 3.) Add cells to DataTable
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 0, "Rank");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 1, "Title");
fpSpread1.AsWorkbook().ActiveSheet.Columns["A:B"].AutoFit();
fpSpread1.AsWorkbook().ActiveSheet.Tables.Add("A1:B11", YesNoGuess.Yes);


결과: 삽입된 열이 있는 데이터 테이블

이 코드 논리를 적용하면 샘플이 데이터 테이블과 함께 표시됩니다. 따라서 최종 사용자는 삽입 버튼 및 바로 가기 키(Ctrl + Shift + F5)를 사용해 선택한 데이터의 열을 삽입할 수 있습니다. 선택한 데이터를 삽입하는 경우 테이블은 다음과 같이 새로운 테이블 열을 삽입하고 테이블 열의 수식을 설정하여 선택한 속성을 참조합니다.

.NET 개체용 셀 데이터 형식 도입



IRichValue가 포함된 배열 사용하기


셀 데이터 형식은 IRichValue 또는 RichValue가 포함된 배열을 사용하는 사용자가 더 많은 정보에 액세스하고 더 많은 방식으로 데이터를 적용하고 상호 작용할 수 있도록 지원합니다.


이를 위해서는 다음 단계를 따르십시오.

  1. 국가 및 구/군/시 클래스 정의

  2. 국가 및 클래스 개체 생성

  3. 셀에서 직접 IRichValue 구현


1단계: 국가 및 구/군/시 클래스 정의

C#:

// 1a.) Defining a class: Country class
[System.Reflection.DefaultMember("Name")]
public class Country : IMedia
{
  [DisplayName("Name of Country")]
  public string Name { get; set; }
  public string Capital { get; set; }
  public int Population { get; set; }
  public string TimeZones { get; set; }
  public RichValue<City>[] Cities { get; set; }
  public string[,] CityPopulations { get; set; }
​
  [DisplayName("National Language")]
  public string NationalLanguage { get; set; }
  [DisplayName("Calling Code")]
  public string CallingCode { get; set; }
  public string ContentType => "image/png";
  public Stream Data
  {
      get
      {
          return typeof(FpSpread).Assembly.GetManifestResourceStream("FarPoint.Win.Spread.SpreadResources.EditShape.png");
      }
  }
}
// 1a.) Defining a class: City class
[System.Reflection.DefaultMember("Name")]
public class City
{
  public string Name { get; set; }
  public int Population { get; set; }
​
  public City(string name)
  {
      Name = name;
  }
}


2단계: 국가, 구/군/시, CityPopulations 클래스 개체 만들기

C#:

private void Form1_Load(object sender, EventArgs e)
      {
          // Enable CalcFeatures to All
          fpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.CalcFeatures = CalcFeatures.All;
          fpSpread1.ActiveSheet.Columns[1, 10].Width = 120;
​
          // 2.) Create the IRich Value object using the class instances
          // 2a.) Create a Country object and add the data type to cell B2 to display with glyph con
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B2"].Value = new RichValue<Country>(new Country()
          {
              Name = "Viet Nam",
              Capital = "Ha Noi",
              Population = 90000000,
              TimeZones = "GMT+7",
              // 2b.) Create an IRich City array and store a list of city names
              Cities = new RichValue<City>[]
                  {
                    new RichValue<City>(new City("Ha Noi")),
                    new RichValue<City>(new City("Ho Chi Minh")),
                    new RichValue<City>(new City("Da Nang")),
                    new RichValue<City>(new City("Hai Phong")),
                    new RichValue<City>(new City("Quang Ninh")),
                    new RichValue<City>(new City("Nha Trang")),
                    new RichValue<City>(new City("Da Lat"))
                  },
              // 2c.) Create a CityPopulations array to store the city names and populations
              // You do not need to make this a RichValue
              CityPopulations = new string[,]
                  {
                      { "Ha Noi", "8.054 million" },
                      { "Ho Chi Minh", "8.993 million" },
                      { "Da Nang", "1.134 milion" },
                      { "Hai Phong", "2.029 million" },
                      { "Quang Ninh", "938.4 thousand" },
                      { "Nha Trang", "535.0 thousand" },
                      { "Da Lat", "410.55 thousand" },
                  }
          }); ;
          // 3.) Implement the IRichValue on a cell directly
          // 3a.) Add the Cities
          fpSpread1.AsWorkbook().ActiveSheet.Cells["D2"].Formula2 = "B2.Cities";
          // 3b.) Add the City Populations, this will display the cities in column F and the associated populations in column G
          fpSpread1.AsWorkbook().ActiveSheet.Cells["F2"].Formula2 = "B2.CityPopulations";
​
      }


3단계: 셀에서 직접 IRichValue 구현

C#:

private void Form1_Load(object sender, EventArgs e)
      {
          // Enable CalcFeatures to All
          fpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.CalcFeatures = CalcFeatures.All;
          fpSpread1.ActiveSheet.Columns[1, 10].Width = 120;
​
          // 2.) Create the IRich Value object using the class instances
          // 2a.) Create a Country object and add the data type to cell B2 to display with glyph con
          fpSpread1.AsWorkbook().ActiveSheet.Cells["B2"].Value = new RichValue<Country>(new Country()
          {
              Name = "Viet Nam",
              Capital = "Ha Noi",
              Population = 90000000,
              TimeZones = "GMT+7",
              // 2b.) Create an IRich City array and store a list of city names
              Cities = new RichValue<City>[]
                  {
                    new RichValue<City>(new City("Ha Noi")),
                    new RichValue<City>(new City("Ho Chi Minh")),
                    new RichValue<City>(new City("Da Nang")),
                    new RichValue<City>(new City("Hai Phong")),
                    new RichValue<City>(new City("Quang Ninh")),
                    new RichValue<City>(new City("Nha Trang")),
                    new RichValue<City>(new City("Da Lat"))
                  },
              // 2c.) Create a CityPopulations array to store the city names and populations
              // You do not need to make this a RichValue
              CityPopulations = new string[,]
                  {
                      { "Ha Noi", "8.054 million" },
                      { "Ho Chi Minh", "8.993 million" },
                      { "Da Nang", "1.134 milion" },
                      { "Hai Phong", "2.029 million" },
                      { "Quang Ninh", "938.4 thousand" },
                      { "Nha Trang", "535.0 thousand" },
                      { "Da Lat", "410.55 thousand" },
                  }
          }); ;
          // 3.) Implement the IRichValue on a cell directly
          // 3a.) Add the Cities
          fpSpread1.AsWorkbook().ActiveSheet.Cells["D2"].Formula2 = "B2.Cities";
          // 3b.) Add the City Populations, this will display the cities in column F and the associated populations in column G
          fpSpread1.AsWorkbook().ActiveSheet.Cells["F2"].Formula2 = "B2.CityPopulations";
​
      }


결과: 국가 개체 표시

이 코드 논리를 적용하면 다음과 같이 Spread 인스턴스가 B2 셀에 국가 개체를, D열에 구/군/시 배열의 목록을, F열에 구/군/시 이름 및 구/군/시 인구의 배열을 표시하고, 나머지 배열 데이터는 G열에 표시합니다.

.NET 개체용 셀 데이터 형식 도입


Spread NET V14의 이 새 기능은 강력하며 다양한 방식으로 사용해 사용자 데이터 개체를 표시하고 사용자 데이터 개체와 상호 작용할 수 있습니다.

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

댓글목록

등록된 댓글이 없습니다.

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

태그

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