sgcSpreadsheet: Delphi와 .NET을 위한 Excel 스타일 스프레드시트

· 컴포넌트
sgcSpreadsheet: Delphi와 .NET을 위한 Excel 스타일 스프레드시트 | eSeGeCe 블로그
✦  sgcUI · sgcSpreadsheet

스프레드시트를.
내 애플리케이션 안에.

sgcSpreadsheet는 sgcUI의 새로운 Excel 스타일 스프레드시트 컨트롤입니다. 사용자는 값과 수식을 입력하고, 여러 시트를 오가며 작업하고, 셀에서 바로 차트를 그립니다. 코드에서는 통합 문서를 채우고, 자체 함수를 추가하고, Excel에서 열리는 XLSX 파일을 읽고 쓸 수 있습니다.

  • VCL
  • FireMonkey
  • C++ Builder
  • WinForms
  • WPF
  • Avalonia
판매 표와 셀 범위로 그린 막대, 꺾은선, 원형 차트가 있는 sgcSpreadsheet
211워크시트 함수
7차트 유형
5UI 프레임워크
XLSX불러오기와 저장

업무용 애플리케이션이라면 언젠가는 시트가 필요해집니다. 사용자는 예산을 세우고, 견적 가격을 매기고, 비용을 계산하고, 고객이 Excel 파일로 보낸 숫자를 확인하며, 그 과정에서 수식, 여러 시트, 차트를 기대합니다. 단순한 그리드로는 어느 것도 해결할 수 없습니다.

sgcSpreadsheet 는 sgcGrid와 sgcUICore에 공유된 수식 엔진을 기반으로 만든 Excel 스타일 스프레드시트 컨트롤입니다. 시트, 정의된 이름, 동적 배열을 갖춘 실제 통합 문서를 유지하고, 변경의 영향을 받는 셀만 다시 계산하며, XLSX를 불러오고 저장합니다. 같은 엔진이 Delphi와 C++ Builder용 VCL 및 FireMonkey 컨트롤과 .NET용 WinForms, WPF, Avalonia 컨트롤을 구동합니다.

sgcSpreadsheet 실행 모습

수식, 스필 배열, 여러 시트, 실시간 차트, XLSX 파일을 모든 플랫폼에서 보여 줍니다. YouTube에서도 볼 수 있습니다.

사용자에게 이미 익숙한 수식

숫자를 다루는 사람들은 Excel 수식으로 생각합니다. sgcSpreadsheet에서는 =로 시작하는 텍스트가 수식이며, 엔진은 수학, 통계, 텍스트, 날짜와 시간, 조회, 논리, 정보, 동적 배열 함수까지 211개의 워크시트 함수를 계산합니다. 엔진이 sgcUICore에 있으므로 sgcGrid 수식도 같은 결과를 냅니다.

=SUM(B2:B13)
211개 함수SUM과 AVERAGE부터 TEXT와 날짜, 시간 함수까지, 모든 플랫폼에 하나의 엔진을 씁니다.
=XLOOKUP(C2,…)
XLOOKUP 포함사용자가 가장 먼저 찾는 조회 함수를 제공하며, =Sheet2!A1처럼 다른 시트를 참조할 수 있습니다.
=SORT(A2:A20)↓
스필되는 배열SEQUENCE, SORT, FILTER, UNIQUE가 아래 셀을 채우며, #SPILL!과 A1# 참조를 지원합니다.
B2 → B14 → D3
증분 재계산의존성 그래프가 어떤 셀이 어떤 셀을 읽는지 알고 있으므로, 변경하면 그에 의존하는 셀만 다시 계산합니다.
=SUM(Sales)*(1+Rate)
정의된 이름수식에서 셀 주소 대신 의미 있는 이름을 사용하며, 통합 문서 범위와 시트 범위를 지원합니다.
'007
강제 텍스트앞에 작은따옴표를 붙이면 입력한 그대로 텍스트로 저장되므로, 007 같은 코드도 텍스트로 유지됩니다.
수학 수식과 그 결과를 보여 주는 Functions 데모, 범주마다 시트 하나
Functions 데모: 범주마다 시트 하나, 각 수식 옆에 결과 표시

시트, 이름, 스필 배열

스프레드시트는 시트가 하나 이상 있는 통합 문서입니다. 그리드 아래의 탭으로 시트를 전환하고 + 탭으로 시트를 추가하며, 시트 이름을 바꾸면 그 시트를 참조하는 모든 수식에서도 이름이 바뀝니다. 코드에서는 AddSheet, ActiveSheet, SheetCount로 시트를 관리하고, Grid.Sheets.Names가 통합 문서의 정의된 이름을 보관합니다.

아래 메서드는 가격 목록을 채우고, 범위에 이름을 붙이고, 그 목록을 읽는 요약 시트를 만듭니다. SORT는 제품 전체 목록을 반환하여 아래 셀로 스필되고, A1#은 목록이 아무리 길어져도 그 스필 범위를 가리킵니다. XLOOKUP이 가격을 찾고 VAT 이름이 세금을 더합니다.

uses
  sgcSpreadsheet_VCL;

procedure TForm1.BuildPriceList;
var
  vSummary: Integer;
begin
  // Sheet1: a price list, row and column are 0-based, (0, 0) is A1
  sgcVCLSpreadsheet1.SetCellInput(0, 0, 'Product');
  sgcVCLSpreadsheet1.SetCellInput(0, 1, 'Price');
  sgcVCLSpreadsheet1.SetCellInput(1, 0, 'Monitor');
  sgcVCLSpreadsheet1.SetCellInput(1, 1, '219');
  sgcVCLSpreadsheet1.SetCellInput(2, 0, 'Keyboard');
  sgcVCLSpreadsheet1.SetCellInput(2, 1, '49');
  sgcVCLSpreadsheet1.SetCellInput(3, 0, 'Mouse');
  sgcVCLSpreadsheet1.SetCellInput(3, 1, '25');
  // defined names: formulas use them instead of cell addresses
  sgcVCLSpreadsheet1.Grid.Sheets.Names.Add('Products', '=Sheet1!$A$2:$A$4');
  sgcVCLSpreadsheet1.Grid.Sheets.Names.Add('Prices', '=Sheet1!$B$2:$B$4');
  sgcVCLSpreadsheet1.Grid.Sheets.Names.Add('VAT', '0.21');
  // a second sheet that reads the first one
  vSummary := sgcVCLSpreadsheet1.AddSheet('Summary');
  sgcVCLSpreadsheet1.ActiveSheet := vSummary;
  // a dynamic array: the sorted names spill into A1:A3
  sgcVCLSpreadsheet1.SetCellInput(0, 0, '=SORT(Products)');
  // A1# is the whole spilled range, however long the list grows
  sgcVCLSpreadsheet1.SetCellInput(0, 2, 'Items');
  sgcVCLSpreadsheet1.SetCellInput(0, 3, '=ROWS(A1#)');
  // XLOOKUP finds the price of a product, VAT included
  sgcVCLSpreadsheet1.SetCellInput(1, 2, 'Monitor');
  sgcVCLSpreadsheet1.SetCellInput(1, 3, '=XLOOKUP(C2,Products,Prices)*(1+VAT)');
  // every sheet, formula and name goes to a file that Excel opens
  sgcVCLSpreadsheet1.SaveToXLSX('prices.xlsx');
end;

요약 시트에는 세 제품이 순서대로 표시되고, 항목 수는 3, 모니터 가격은 264.99입니다. 첫 번째 시트에서 가격을 바꾸면 그에 의존하는 셀만 다시 계산됩니다. FreezePanes(1, 0)은 나머지 시트가 스크롤되는 동안 머리글 행을 고정하며, 수식 입력줄 TsgcVCLSpreadsheetFormulaBar와 TsgcFMXSpreadsheetFormulaBar는 사용자에게 이름 상자와 현재 셀의 수식을 보여 줍니다.

나만의 함수

엔지니어링, 금융, 실험실 애플리케이션에는 고유한 계산이 필요합니다. 수식 엔진에는 함수 레지스트리가 있으며, 여기에 등록한 함수는 내장 함수와 똑같이 스프레드시트, sgcGrid, TsgcCalcEvaluator의 모든 수식에서 동작합니다. 핸들러는 일반 함수이며 유닛의 initialization 섹션에서 등록합니다.

unit MyFunctions;

interface

implementation

uses
  sgcUICore_Calc;

{ =MARKUP(price, [rate]): the price plus a margin, 20% by default }
function DoMarkup(aCall: TsgcCalcCall): Variant;
var
  vPrice, vRate: Double;
  vError: string;
begin
  vError := aCall.Number(0, vPrice);
  vRate := 0.2;
  if (vError = '') and (aCall.Count > 1) then
    vError := aCall.Number(1, vRate);
  if vError <> '' then
    Result := vError
  else
    Result := vPrice * (1 + vRate);
end;

initialization
  // MARKUP takes 1 or 2 arguments
  sgcCalcRegisterFunction('MARKUP', DoMarkup, 1, 2);

end.

유닛을 프로젝트에 추가하면 사용자가 =MARKUP(B2)를 입력할 수 있습니다. 동적 배열에서는 엔진이 배열 인수의 각 요소마다 함수를 호출하므로, =MARKUP(B2:B4, 0.3)은 가격마다 결과 하나씩 스필하고 =SUM(MARKUP(B2:B4))도 추가 코드 없이 동작합니다. 범위의 셀이 필요한 함수는 cfRanges 플래그로 등록하고 반복자로 셀을 순회합니다.

셀 범위로 만드는 차트

차트는 셀 범위의 값을 보여 주며, Excel의 차트처럼 시트 위에 떠 있습니다. sgcCharts가 그리고, 범위의 셀이 바뀌거나 범위의 수식이 새 값을 내면 차트도 따라서 바뀝니다. 사용자는 마우스로 차트를 옮기고 크기를 조정할 수 있으며, 시트마다 고유한 차트를 가집니다.

XLSX 입력, XLSX 출력

고객은 XLSX 파일을 보내고 XLSX 파일로 돌려받기를 기대합니다. LoadFromXLSX는 통합 문서의 모든 시트를 읽고 SaveToXLSX는 모든 시트를 파일 이름이나 스트림으로 저장하므로, 파일이 애플리케이션과 Excel 사이를 왕복할 수 있습니다.

VCL, FireMonkey, .NET

Delphi와 C++ Builder에서는 VCL용 TsgcVCLSpreadsheet와 FireMonkey용 TsgcFMXSpreadsheet를 사용할 수 있으며, 각각 수식 입력줄이 있습니다. .NET에는 TsgcWinFormsSpreadsheet, TsgcWpfSpreadsheet, TsgcAvaloniaSpreadsheet가 있고 역시 수식 입력줄을 갖추었으며, NuGet 패키지 esegece.sgcSpreadsheet, esegece.sgcSpreadsheet.WinForms, esegece.sgcSpreadsheet.Wpf, esegece.sgcSpreadsheet.Avalonia로 제공됩니다. .NET 컨트롤은 Delphi 컨트롤과 같은 이름을 사용하며, 사용자 지정 함수는 람다로 작성할 수 있습니다.

using esegece.sgcSpreadsheet;
using esegece.sgcUICore;

// once at startup, before the first formula is parsed
sgcUICore_Calc.sgcCalcRegisterFunction("MARKUP", aCall =>
{
    double vPrice;
    double vRate = 0.2;
    string vError = aCall.Number(0, out vPrice);
    if ((vError.Length == 0) && (aCall.Count > 1))
        vError = aCall.Number(1, out vRate);
    if (vError.Length > 0)
        return vError;
    return vPrice * (1 + vRate);
}, 1, 2);

// sheet is a TsgcWinFormsSpreadsheet: open a workbook made in Excel
sheet.LoadFromXLSX("prices.xlsx");
sheet.ActiveSheet = 0;
// the custom function spills over the whole price column
sheet.SetCellInput(0, 2, "=MARKUP(B2:B4, 0.3)");
// a column chart of the range, drawn by sgcCharts
TsgcSpreadsheetChart chart = sheet.AddChart(TsgcSpreadsheetChartType.sctColumn, "A1:B4");
chart.Title = "Prices";
sheet.SaveToXLSX("prices-markup.xlsx");

데모 실행하기

Delphi와 C++ Builder 데모는 sgcUI 체험판과 함께 설치되고, .NET 데모는 Registered .NET 다운로드에 포함되어 있습니다.

판매 통합 문서와 수식 입력줄이 있는 VCL Basic 데모
Basic: 요약 시트, 고정된 머리글 행, 수식 입력줄을 갖춘 판매 통합 문서

sgcSpreadsheet가 포함된 에디션

sgcSpreadsheet는 sgcUI Enterprise와 All-Access 번들에 포함되어 있으며, Delphi와 C++ Builder용, .NET용 단일 패키지로도 따로 판매됩니다. sgcSpreadsheet를 설치하면 sgcGrid와 sgcCharts도 함께 설치되므로 그리드와 차트가 항상 동작합니다. 무료 Community 에디션은 없습니다. 자세한 내용은 가격 페이지를 참고하세요.

사용자에게 스프레드시트를 선물하세요

sgcSpreadsheet는 Delphi와 C++ Builder의 VCL 및 FireMonkey용, 그리고 .NET의 WinForms, WPF, Avalonia용 sgcUI에 포함되어 있습니다.

질문이나 의견이 있으신가요? 문의해 주세요. 코드를 직접 작성한 사람들이 답변해 드립니다.