! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

Spread.NET의 데이터 시각화 함수 > 블로그 & Tips

본문 바로가기

Spread.NET

블로그 & Tips

Spread.NET의 데이터 시각화 함수

페이지 정보

작성자 최고관리자 작성일 2020-01-08 00:00 조회 1,430회 댓글 0건

본문

Spread.NET 13 WinForms는 셀에 사용자 지정 데이터 시각화를 그리거나 셀에 형식을 적용하는 사용자 지정 함수 시각화를 정의할 새로운 기능을 도입했습니다. 이 기능은 사용자 지정 스파크 라인과 비슷하지만 사용자 지정 함수의 인자를 받아 새로운 계산 엔진을 사용하여 더 쉽게 구현할 수 있도록 하였습니다.


이 글에서 다루는 주제는 다음과 같습니다.


  • 데이터 시각화 함수 생성
  • 데이터 시각화 함수 사용
  • QR 코드 데이터 시각화 함수 생성
  • 형식 적용
  • 샘플

데이터 시각화 기능 생성


이 기능을 사용하기 위해서는 GrapeCity.Spreadsheet.FunctionVisualizer에서 상속되는 사용자 지정 데이터 시각화 클래스를 구현해야합니다 .


QRCodeFunctionVisualizer

public class QRCodeFunctionVisualizer : FunctionVisualizer
{
    protected override void PaintCell(Graphics graphics, Rectangle rect, object cellValue, ref StyleFormat styleFormat, IWorksheet worksheet)
    {
        ECCLevel eccLevel = ECCLevel.L;
        bool forceUtf8 = false;
        bool utf8BOM = false;
        EciMode eciMode = 0;
        int requestedVersion = -1;
        if (cellValue is VisualizationData visualizationData)
        {
            IEvaluationContext context = worksheet.Workbook.WorkbookSet.CalculationEngine.EvaluationContext;
            string level = visualizationData.Parameters[0].GetText(context);
            eccLevel = (QRCodeGenerator.ECCLevel)(level == "L" ? 0 : level == "M" ? 1 : level == "Q" ? 2 : 3);

            using (QRCodeGenerator qrGenerator = new QRCodeGenerator())
            {
                using (QRCodeData qrCodeData = qrGenerator.CreateQrCode(visualizationData.Value.GetText(context), eccLevel, forceUtf8, utf8BOM, (EciMode)eciMode, requestedVersion))
                {
                    using (QRCode qrCode = new QRCode(qrCodeData))
                    {
                        using (Bitmap image = qrCode.GetGraphic(20, System.Drawing.Color.Black, System.Drawing.Color.White, null, rect.Width))
                        {
                            graphics.DrawImage(image, rect);
                        }
                    }
                }
            }
        }
    }
}


위의 코드는 FunctionVisualizer가 cellValue 함수에 전달된 VisualizationData에 접근하고 CalculationEngine의 EvaluationContext 를 사용하여 VisualizationData.Parameter에서 함수 인자를 가져 오는 방법을 보여줍니다 .


다음 코드는 QRCodeFunctionVisualizer를 폼(form)의 FpSpread 컨트롤에 적용합니다 .


Form_Load

fpSpread1.AddCustomFunction(new VisualFunction("QRCode", 1, 2, FunctionAttributes.Variant, new QRCodeFunctionVisualizer()));
var worksheet = fpSpread1.AsWorkbook().ActiveSheet;
worksheet.Cells["B1"].Value = "https://www.grapecity.com/spread";
worksheet.Cells["C1"].Value = "L";
worksheet.Cells["A1"].Formula = "VF.QRCode(B1, C1)";
worksheet.Columns[0].ColumnWidth = 200;
worksheet.Rows[0].RowHeight = 200;


결과적으로 셀 A1에서 QR 코드가 보여지게 됩니다 .


그림 1 : QRCodeFunctionVisualizer 작동


형식 적용


VisualFunction는 시각화를 그리는 대신 셀에 서식을 적용 할 수 있게 합니다. 다음 예제는 두 가지를 모두 수행 할 수 있는 사용자 지정 FunctionVisualizer를 보여줍니다 .


CustomFunctionVisualizer

public class CustomFunctionVisualizer : FunctionVisualizer
{
    bool _IsVisual = true;
    bool _IsShowCell = true;
    public CustomFunctionVisualizer(bool isVisual = true)
    {
        _IsVisual = isVisual;
        if (_IsVisual)
        {
            _IsShowCell = false;
        }
    }

    protected override void PaintCell(Graphics graphics, Rectangle rect, object cellValue, ref StyleFormat styleFormat, IWorksheet worksheet)
    {
        rect.Width--;
        rect.Height--;

        if (cellValue is double)
        {
            graphics.DrawRectangle(System.Drawing.Pens.Blue, rect);
            if ((double)cellValue > 0)
            {
                graphics.DrawString("Positive", new System.Drawing.Font("Arial", 10f), Brushes.Blue, new PointF(rect.X, rect.Y));
            }
            else if ((double)cellValue < 0)
            {
                graphics.DrawString("Negative", new System.Drawing.Font("Arial", 10f), Brushes.Blue, new PointF(rect.X, rect.Y));
            }
            else
            {
                graphics.DrawString("Zero", new System.Drawing.Font("Arial", 10f), Brushes.Blue, new PointF(rect.X, rect.Y));
            }
        }
        else if (cellValue is GrapeCity.CalcEngine.CalcError)
        {
            graphics.DrawRectangle(System.Drawing.Pens.Red, rect);
            graphics.DrawString("Error", new System.Drawing.Font("Arial", 10f), Brushes.Blue, new PointF(rect.X, rect.Y));
        }
    }

    public override bool IsShowCell(object cellValue)
    {
        return _IsShowCell;
    }

    public override bool IsVisual
    {
        get
        {
            return _IsVisual;
        }
    }

    public override void ApplyFormat(object cellValue, ref StyleFormat styleFormat)
    {
        if (cellValue is GrapeCity.CalcEngine.CalcError)
        {
            styleFormat.Fill = new Fill(GrapeCity.Spreadsheet.Color.FromKnownColor(GrapeCity.Core.KnownColor.Yellow));
            base.ApplyFormat(cellValue, ref styleFormat);
        }
    }
}


의 CustomFunctionVisualizer는 시각적으로 작동하여 셀에서 사용자 지정 데이터 시각화를 그리거나 비시각적인 것 대신에 셀 값이 CalcError(계산오류)인 경우 노란색 채우기를 적용 할 수 있습니다.


CustomFuctionVisualizer은 사용자 지정 SUMVisualFunction과 함께 사용됩니다. :



SUMVisual 기능

public class SUMVisualFunction : VisualFunction
{
    public SUMVisualFunction(string visualizerName, int minArgs, int maxArgs, FunctionAttributes attributes, IFunctionVisualizer visualizer)
        : base(visualizerName, minArgs, maxArgs, attributes, visualizer)
    {
    }

    protected override bool Evaluate(IArguments arguments, IValue result)
    {
        IEvaluationContext context = arguments.EvaluationContext;
        int count = arguments.Count;
        double sum = 0;

        for (int i = 0; i < count; i++)
        {
            IValue argValue = arguments[i];
            switch (argValue.ValueType)
            {
                case GrapeCity.CalcEngine.ValueType.Error:
                    result.SetValue(argValue.GetError(context));
                    return true;
                case GrapeCity.CalcEngine.ValueType.Reference:
                case GrapeCity.CalcEngine.ValueType.AdjustableReference:
                    RangeReference range = argValue.GetReference(context, 0);
                    Sum(context, range, argValue.GetReferenceSource(context), ref sum, ref result);
                    if (result.ValueType == GrapeCity.CalcEngine.ValueType.Error)
                        return true;
                    break;
                case GrapeCity.CalcEngine.ValueType.MultiReference:
                    int refCount = argValue.ReferenceCount;
                    var sheet = argValue.GetReferenceSource(context);
                    for (int refIndex = 0; refIndex < refCount; refIndex++)
                    {
                        Sum(context, argValue.GetReference(context, refIndex), argValue.GetReferenceSource(context), ref sum, ref result);
                        if (result.ValueType == GrapeCity.CalcEngine.ValueType.Error)
                            return true;
                    }
                    break;
                case GrapeCity.CalcEngine.ValueType.Reference3D:
                    result.SetValue(CalcError.Value);
                    return true;
                case GrapeCity.CalcEngine.ValueType.ValuesArray:
                    sum += Sum(context, argValue.GetValuesArray());
                    break;
                default:
                    sum += argValue.GetNumber(context);
                    break;
            }
        }

        result.SetValue(sum);
        return true;
    }

    private double Sum(IEvaluationContext context, IValuesArray valuesArray)
    {
        double sum = 0.0;
        for (int i = 0; i < valuesArray.RowCount; i++)
        {
            for (int j = 0; j < valuesArray.ColumnCount; j++)
            {
                IPrimitiveValue value = valuesArray[i, j];
                switch (value.ValueType)
                {
                    case PrimitiveValueType.Error:
                        context.Error = value.GetError(context);
                        return 0.0;
                    default:
                        sum += value.GetNumber(context);
                        break;
                }
            }
        }
        return sum;
    }

    private void Sum(IEvaluationContext context, RangeReference range, IReferenceSource sheet, ref double sum, ref IValue result)
    {
        for (int row = range.Row; row <= range.Row2; row++)
        {
            for (int col = range.Column; col <= range.Column2; col++)
            {
                CellValue value = CellValue.Invalid;
                sheet.GetValue(context, row, col, ref value);
                if (value.Type2 == GrapeCity.CalcEngine.ValueType.Error)
                {
                    result.SetValue(value.Error);
                    return;
                }
                sum += value.Number;
            }
        }
        result.SetValue(context, sum);
    }
}


Form_Load에서 코드 이벤트는 사용자 지정 SUMVisualFunction를  초기화해줍니다.:



Form_Load

fpSpread1.AddCustomFunction(new SUMVisualFunction("SUM1", 1, 3, FunctionAttributes.Variant, new CustomFunctionVisualizer()));
fpSpread1.AddCustomFunction(new SUMVisualFunction("SUM2", 1, 3, FunctionAttributes.Variant, new CustomFunctionVisualizer(false)));
IWorksheet sheet = fpSpread1.AsWorkbook().ActiveSheet;
sheet.Cells["A1"].Value = 10;
sheet.Cells["A3"].Value = 20;
sheet.Cells["C3"].Formula = "VF.SUM1(A:A (1:1,3:3))";
sheet.Cells["D4"].Formula = "VF.SUM2(A1,2)";
sheet.Cells["C3"].Interior.Color = GrapeCity.Spreadsheet.Color.FromKnownColor(GrapeCity.Core.KnownColor.Orange);
sheet.Cells["D4"].Interior.Color = GrapeCity.Spreadsheet.Color.FromKnownColor(GrapeCity.Core.KnownColor.Orange);


셀 C3 D4는 SUM1 SUM2 함수를 통한 결과물을 대해서 첫 번째 셀은 시각화를 보여주고 두 번째 셀은 스타일을 보여줍니다.


그림 2 : SUMVisualFunction 작동 


사용자 지정 시각 함수가 IsShowCell에 대해 False를 반환하므로, 셀 C3에 적용된 셀 스타일은 표시되지 않습니다. 셀이 편집되었을 때, 수식을 편집하는 동안 스타일이 표시됩니다. 


그림 3 : 시각 함수 셀을 편집하는 동안 셀 스타일 표시 


셀 A1에 오류값을 입력하면 시각 함수 셀이 업데이트합니다.


그림 4 : 사용자 정의 데이터 시각화 및 스타일을 보여주는 오류 값


샘플


QR 코드 시각화 프로그램의 샘플 코드는 평가판 다운로드에 포함된 v13 컨트롤 탐색기 데모에 포함되어 있습니다.

  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.