.NET 응용 프로그램에서 Excel API와 함께 사용자 정의 함수 사용하기
페이지 정보
작성자 GrapeCity 작성일 2022-03-08 15:37 조회 1,843회 댓글 0건본문
관련링크
Excel 계산에 사용자 정의 함수를 사용하면 스프레드시트 내 확장성이 더 향상됩니다. 예를 들어, 여러 단계로 중첩된 수식, 재무 팀의 회사 고유 수식 또는 표준 함수의 조합을 사용해 계산해야 하는 경우가 있습니다.
물론 기본 제공 함수를 사용해 셀 두 개를 추가해도 되지만, 만일 두 셀의 문자열 값을 연결하고 싶다면 어떻게 해야 할까요? 또한 일정 범위에 있는 셀의 합계를 계산해야 할 수도 있습니다. 이러한 상황에서는 기본 제공되는 표준 함수로 계산을 처리할 수 없고 사용자 정의 함수를 작성해야 합니다.
사용자 정의 함수의 이점
- 모든 Excel 플랫폼(Win, Mac, 모바일, Office Online)에서 실행됩니다.
- 속도가 빠릅니다.
- 모양과 느낌이 네이티브 Excel 함수와 유사합니다(예: 수식 팁).
- 웹 서비스 호출을 할 수 있습니다.
- 웹에 의존하지 않는 경우 오프라인에서 실행할 수 있습니다.
- 통합 문서가 실행되지 않을 때도 이 함수를 실행할 수 있습니다.
기본 제공 함수가 메모리 사용 측면에서 더 빠르고 효율적일 수 있지만 사용자 정의 함수를 이용하면 Excel 시트에서 데이터 계산의 확장성을 높일 수 있습니다.
GcExcel의 사용자 정의 함수
GcExcel은 .NET 6 대상 응용 프로그램에서 스프레드시트에 대한 사용자 정의 함수를 지원합니다.
사용자 정의 함수 시작하기:
.NET 사용자 정의 함수 도움말 | Java 사용자 정의 함수 도움말
이 자습서에서는 사용자 정의 함수를 사용하는 것이 더 유리한 사용 사례를 다룹니다. 이 문서에서는 .NET Core 응용 프로그램에서 문제를 해결하는 단계를 안내합니다.
사용자 정의 함수의 사용 사례
이 예에서는 한 가족의 월수입과 월 지출을 비교해 봅니다. 이 스프레드시트에서는 가계 지출로 소비되는 소득의 비율을 계산합니다. 다음 달에는 해당 월의 정보로 대체하여 이 계산을 매달 반복합니다.
가족 지출 목록이 길거나 데이터가 여러 시트에 걸쳐 있는 경우 데이터를 분석하기가 어려울 수 있습니다. 행 전체를 검색하여 최고 지출액을 찾기가 어려울 수도 있습니다.
어떤 사람이 월별 지출을 분석하여 최고 지출액을 알아보려 한다고 가정합시다. 이 경우 표준 함수를 사용하면 쉽게 해결됩니다. =MAX(B11:B23) 함수를 사용하면 월 최고 지출액이 이 나옵니다.
데이터를 더 분석하여 현재의 지출을 줄일 방법을 알아보려 한다고 가정합시다. 해당 월의 최고 지출액 두 가지를 파악해야 합니다. 이것은 기본 제공되는 표준 함수를 조합하여 계산할 수 있습니다. 하지만 두 번째로 큰 값을 계산하려면 코딩을 약간 해야 합니다. 이렇게 되면 사용자 정의 함수로 계산하는 편이 더 쉽습니다.
C# .NET 및 Java 응용 프로그램에서
사용자 정의 함수를 스프레드시트에 추가하여
월 최고 지출액 두 가지를 계산하는 방법
1단계:
월수입 및 월 지출 데이터를 추가하려면 .NET 및 Java에서 시작하기 단계에 따라 GcExcel로 기본적인 스프레드시트를 만드십시오. 블로그의 맨 아래에서 스프레드시트는 다음과 같은 모양이 됩니다.
2단계:
CustomFunction 클래스에서 파생 클래스를 만듭니다.
C#
public class HighestValues : CustomFunction { }
Java
public class HighestValues extends CustomFunction { }
3단계:
클래스 내에서 사용자 정의 함수의 인스턴스를 함수의 이름, 반환 유형, 사용자 정의 함수의 매개 변수와 함께 초기화합니다.
C#
public HighestValues(): base("HighestValues", FunctionValueType.Text, new Parameter[] { new Parameter(FunctionValueType.Object), new Parameter(FunctionValueType.Number), new Parameter(FunctionValueType.Number) }) { }
Java
public HighestValues() { super("HighestValues", FunctionValueType.Text, new Parameter[]{new Parameter(FunctionValueType.Object), new Parameter(FunctionValueType.Number), new Parameter(FunctionValueType.Number)}); }
여기서 사용자 정의 함수의 이름은 Highest Values입니다. 함수의 반환 유형은 지출 항목의 이름 목록이므로 반환 유형은 Text value입니다. 이 함수는 최고값 두 개를 계산하기 위한 매개 변수 값을 받습니다.
4단계:
최고값 두 개를 찾기 위한 Evaluate 함수를 정의합니다. 이 함수는 수신되는 배열의 길이와 그 안의 행 값 및 열 값 등 몇 가지 유효성 검사를 수행합니다. 그런 다음 주어진 배열을 Temp objects(셀 범위의 텍스트 및 숫자 값을 담은 클래스) 목록에 추가합니다. 이 목록은 배열을 정렬하고 가장 큰 숫자 두 개를 반환합니다.
C#
public override object Evaluate(object[] arguments, ICalcContext context) { if (arguments.Length < 3) { return CalcError.Value; } var values = arguments[0]; if (values is IEnumerable<object>) { values = (values as IEnumerable<object>).FirstOrDefault(); } object[,] array = values as object[,]; if (array == null) { return CalcError.Value; } int rowCount = array.GetLength(0); int colCount = array.GetLength(1); if (rowCount <= 0 || colCount <= 0) { return CalcError.Value; } int resultCol = (int)(double)arguments[1] - 1; if (resultCol < 0 || resultCol >= colCount) { return CalcError.Num; } int numberCol = (int)(double)arguments[2] - 1; if (numberCol < 0 || resultCol >= colCount) { return CalcError.Num; } List<temp> list = new List<temp>(); for (int i = 0; i < rowCount; i++) { string text = array[i, resultCol]?.ToString(); double number = array[i, numberCol] is double ? (double)array[i, numberCol] : 0; list.Add(new temp(text, number)); } list.Sort((x, y) => { if (x.Number > y.Number) { return -1; } else if (x.Number == y.Number) { return 0; } else { return 1; } }); string result = null; int count = Math.Min(list.Count, 2); for (int i = 0; i < count; i++) { if (result != null) { result += ","; } result += list[i].Text; } return result; } private class temp { public string Text; public double Number; public temp(string text, double number) { this.Text = text; this.Number = number; } }
Java
public Object evaluate(Object[] arguments, ICalcContext context) { if (arguments.length < 3) { return CalcError.Value; } else { Object values = arguments[0]; if (values instanceof Iterable) { Iterator var4 = ((Iterable)((Iterable)values)).iterator(); if (var4.hasNext()) { Object x = var4.next(); values = x; } } Object[][] array = values instanceof Object[][] ? (Object[][])((Object[][])values) : (Object[][])null; if (array == null) { return CalcError.Value; } else { int rowCount = array.length; int colCount = array.length == 0 ? 0 : array[0].length; if (rowCount > 0 && colCount > 0) { int resultCol = ((Double)((Double)arguments[1])).intValue() - 1; if (resultCol >= 0 && resultCol < colCount) { int numberCol = ((Double)((Double)arguments[2])).intValue() - 1; if (numberCol >= 0 && resultCol < colCount) { ArrayList<HighestValues.temp> list = new ArrayList(); for(int i = 0; i < rowCount; ++i) { String text = array[i][resultCol] == null ? null : array[i][resultCol].toString(); double number = array[i][numberCol] instanceof Double ? (Double)array[i][numberCol] : 0.0D; list.add(new HighestValues.temp(text, number)); } Collections.sort(list, (xx, y) -> { if (xx.Number > y.Number) { return -1; } else { return xx.Number == y.Number ? 0 : 1; } }); String result = null; int count = Math.min(list.size(), 2); for(int i = 0; i < count; ++i) { if (result != null) { result = result + ","; } else { result = ""; } result = result + ((HighestValues.temp)list.get(i)).Text; } return result; } else { return CalcError.Num; } } else { return CalcError.Num; } } else { return CalcError.Value; } } }
5단계:
static void Main[] 함수에서 AddCustomFunction() 메서드를 호출합니다. 새로운 GcExcel 통합 문서를 만들고 이 통합 문서에서 Excel 스프레드시트를 엽니다.
C#
Workbook.AddCustomFunction(new HighestValues()); var workbook = new Workbook(); workbook.Open("SimpleBudget.xlsx");
Java
Workbook.AddCustomFunction(new HighestValues()); Workbook workbook = new Workbook(); workbook.open("SimpleBudget.xlsx");
6단계:
HighestValues 사용자 정의 함수를 호출하고 가장 큰 값이 나와야 하는 셀 범위를 전달합니다. 그런 다음 변수에서 결과를 수집하고 이 결과를 셀에 설정합니다.
C#
workbook.Worksheets[0].Range["B25"].Formula = "HighestValues(B11:C23, 1, 2)"; var result = workbook.Worksheets[0].Range["B25"].Value; int rowIndex, columnIndex; GrapeCity.Documents.Excel.CellInfo.CellNameToIndex("C25", out rowIndex, out columnIndex); workbook.Worksheets[0].Range[rowIndex, columnIndex].Value = result;
Java
Object result = workbook.getWorksheets().get(0).getRange("B25").getValue(); int rowIndex, columnIndex; int[] index = com.grapecity.documents.excel.CellInfo.CellNameToIndex("C25"); columnIndex = index[1]; rowIndex = index[0]; workbook.getWorksheets().get(0).getRange(rowIndex, columnIndex).setValue(result);
7단계:
통합 문서를 저장합니다.
C#
workbook.Save("SimpleBudget.xlsx");
Java
workbook.save("SimpleBudget.xlsx");
응용 프로그램을 실행하면 사용자 정의 함수가 수집한 최고 지출액이 C25 셀에 표시됩니다.
참고: MS Excel에서는 GCExcel의 사용자 정의 함수를 인식하지 못하므로 Excel에 저장하면 수식이 포함된 셀(B25)에 #NAME 오류가 표시됩니다.
전체 샘플 다운로드 .NET
전체 샘플 다운로드 Java
지금 바로 GcExcel .NET Core를 다운로드하여 직접 테스트해보세요!
지금 바로 GcExcel Java를 다운로드하여 직접 테스트해보세요!
댓글목록
등록된 댓글이 없습니다.