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 코드가 보여지게 됩니다 .
형식 적용
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 함수를 통한 결과물을 대해서 첫 번째 셀은 시각화를 보여주고 두 번째 셀은 스타일을 보여줍니다.
사용자 지정 시각 함수가 IsShowCell에 대해 False를 반환하므로, 셀 C3에 적용된 셀 스타일은 표시되지 않습니다. 셀이 편집되었을 때, 수식을 편집하는 동안 스타일이 표시됩니다.
셀 A1에 오류값을 입력하면 시각 함수 셀이 업데이트합니다.
샘플
QR 코드 시각화 프로그램의 샘플 코드는 평가판 다운로드에 포함된 v13 컨트롤 탐색기 데모에 포함되어 있습니다.
댓글목록
등록된 댓글이 없습니다.