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

.NET 응용 프로그램에서 Excel API와 함께 사용자 정의 함수 사용하기 > 블로그 & Tips

본문 바로가기

.NET API

블로그 & Tips

.NET 응용 프로그램에서 Excel API와 함께 사용자 정의 함수 사용하기

페이지 정보

작성자 GrapeCity 작성일 2022-03-08 15:37 조회 1,779회 댓글 0건

본문

Excel 계산에 사용자 정의 함수를 사용하면 스프레드시트 내 확장성이 더 향상됩니다. 예를 들어, 여러 단계로 중첩된 수식, 재무 팀의 회사 고유 수식 또는 표준 함수의 조합을 사용해 계산해야 하는 경우가 있습니다.

물론 기본 제공 함수를 사용해 셀 두 개를 추가해도 되지만, 만일 두 셀의 문자열 값을 연결하고 싶다면 어떻게 해야 할까요? 또한 일정 범위에 있는 셀의 합계를 계산해야 할 수도 있습니다. 이러한 상황에서는 기본 제공되는 표준 함수로 계산을 처리할 수 없고 사용자 정의 함수를 작성해야 합니다.

 

사용자 정의 함수의 이점

  • 모든 Excel 플랫폼(Win, Mac, 모바일, Office Online)에서 실행됩니다.
  • 속도가 빠릅니다.
  • 모양과 느낌이 네이티브 Excel 함수와 유사합니다(예: 수식 팁).
  • 웹 서비스 호출을 할 수 있습니다.
  • 웹에 의존하지 않는 경우 오프라인에서 실행할 수 있습니다.
  • 통합 문서가 실행되지 않을 때도 이 함수를 실행할 수 있습니다.

기본 제공 함수가 메모리 사용 측면에서 더 빠르고 효율적일 수 있지만 사용자 정의 함수를 이용하면 Excel 시트에서 데이터 계산의 확장성을 높일 수 있습니다.

 

GcExcel의 사용자 정의 함수

GcExcel은 .NET 6 대상 응용 프로그램에서 스프레드시트에 대한 사용자 정의 함수를 지원합니다.

사용자 정의 함수 시작하기:

.NET 사용자 정의 함수 도움말 | Java 사용자 정의 함수 도움말

이 자습서에서는 사용자 정의 함수를 사용하는 것이 더 유리한 사용 사례를 다룹니다. 이 문서에서는 .NET Core 응용 프로그램에서 문제를 해결하는 단계를 안내합니다.

 

사용자 정의 함수의 사용 사례

이 예에서는 한 가족의 월수입과 월 지출을 비교해 봅니다. 이 스프레드시트에서는 가계 지출로 소비되는 소득의 비율을 계산합니다. 다음 달에는 해당 월의 정보로 대체하여 이 계산을 매달 반복합니다.

가족 지출 목록이 길거나 데이터가 여러 시트에 걸쳐 있는 경우 데이터를 분석하기가 어려울 수 있습니다. 행 전체를 검색하여 최고 지출액을 찾기가 어려울 수도 있습니다.

어떤 사람이 월별 지출을 분석하여 최고 지출액을 알아보려 한다고 가정합시다. 이 경우 표준 함수를 사용하면 쉽게 해결됩니다. =MAX(B11:B23) 함수를 사용하면 월 최고 지출액이 이 나옵니다.

데이터를 더 분석하여 현재의 지출을 줄일 방법을 알아보려 한다고 가정합시다. 해당 월의 최고 지출액 두 가지를 파악해야 합니다. 이것은 기본 제공되는 표준 함수를 조합하여 계산할 수 있습니다. 하지만 두 번째로 큰 값을 계산하려면 코딩을 약간 해야 합니다. 이렇게 되면 사용자 정의 함수로 계산하는 편이 더 쉽습니다.


C# .NET 및 Java 응용 프로그램에서
사용자 정의 함수를 스프레드시트에 추가하여
월 최고 지출액 두 가지를 계산하는 방법


1단계:

월수입 및 월 지출 데이터를 추가하려면 .NETJava에서 시작하기 단계에 따라 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를 다운로드하여 직접 테스트해보세요!

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

댓글목록

등록된 댓글이 없습니다.

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

태그1

인기글

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