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

NPOI Apache POI의 대안 - GcExcel .NET > 블로그 & Tips

본문 바로가기

.NET API

블로그 & Tips

NPOI Apache POI의 대안 - GcExcel .NET

페이지 정보

작성자 GrapeCity 작성일 2021-08-24 09:33 조회 4,064회 댓글 0건

본문

NPOI Apache POI와 GcExcel.NET 비교


Apache POI Java API의 .NET 버전인 NPOI는 xls, doc 및 ppt 파일을 읽거나 쓸 수 있는 오픈 소스 API입니다.

GrapeCity Documents for Excel(GcExcel)은 Excel에 의존하지 않는 스프레드시트 API로, 속도가 빠르고 메모리 소비량이 적습니다.


완벽한 .NET 5 지원을 바탕으로 .NET Framework, .NET Core, Mono, Xamarin에서 스프레드시트를 생성, 로드, 수정, 변환할 수 있습니다. 이 스프레드시트 API를 사용하는 응용 프로그램을 클라우드, Windows, Mac 또는 Linux에 배포할 수 있습니다. 강력한 계산 엔진과 다양한 기능을 통해 설계나 요구사항을 절충할 필요가 없습니다.


이 블로그는 Excel 파일을 읽고 쓸 때 두 제품의 성능을 이중, 문자열, 날짜 값, 수식으로 비교합니다 또한 성능 테스트에서는 대용량 Excel 파일에서의 열기, 계산 및 저장 작업을 측정합니다. 두 제품에서 지원되는 Excel 기능도 비교합니다.


아래에 설명된 대로 철저한 성능 테스트 및 기능 비교를 통해 GcExcel이 NPOI의 대안을 모색하거나 현재 응용 프로그램의 성능 및 기능 세트를 개선하는 데 도움이 될 것으로 확신합니다.


기능 비교

다음은 NPOI가 아니라 GcExcel을 사용해야 하는 12가지 주된 이유입니다.

  1. GcExcel훨씬 더 빠르고 훨씬 더 적은 메모리를 사용합니다. 여러 플랫폼에서 성능을 비교한 결과, GcExcel .NET이 NPOI보다 평균 190배 빠르고 22배 더 효율적인 것으로 나타났습니다(아래의 성능 결과 참조). 큰 범위에 대한 수식 설정과 같은 일부 작업은 100배 이상 더 빨랐습니다.

  2. GcExcel은 셀 수식에 452개의 계산 함수를 지원하는 반면, NPOI는 다양한 최신 함수를 지원하지 않아 157~280개의 계산 함수만 사용할 수 있으며 그 밖의 함수는 개발자가 구현해야 합니다.

  3. GcExcel페이지 설정 옵션 제어를 위한 완벽한 지원, PDF 보안 옵션문서 속성에 대한 기본 제공 지원 등 PDF로 내보내기를 지원하는 반면, NPOI는 PDF로 내보내기를 지원하지 않고 예시도 제공하지 않습니다.

  4. GcExcel아이콘 집합, 평균 이상, 발생 날짜, 위쪽/아래쪽, 중복/고유 등 Excel VSTO API와 호환되는 조건부 서식 규칙을 지원하는 반면, NPOI는 조건부 서식을 지원하지 않으므로 내부용으로 표시된 하위 수준 클래스를 사용해야 합니다.

  5. GcExcel상자 수염, 깔때기형, 히스토그램, 파레토, 선버스트, 트리맵, 폭포 등 모든 최신 차트 유형을 포함하여 Excel VSTO API와 호환되는 53가지 차트 유형을 지원하는 반면, NPOI는 가로 막대형, 세로 막대형, 꺾은선형, 방사형, 분산형 차트만 지원합니다.

  6. GcExcel은 셀 안에 직접 작은 차트를 넣어 셀에서 바로 데이터를 시각화할 수 있는 스파크라인스파크라인 그룹을 지원하는 반면, NPOI는 스파크라인을 지원하지 않습니다.

  7. GcExcel셰이프 및 사진에 대한 잘라내기/복사/붙여넣기를 지원하는 반면, NPOI는 셰이프 또는 사진에 대한 클립보드 작업을 지원하지 않습니다.

  8. GcExcel숫자, 텍스트, , 아이콘고급 필터 적용을 지원하는 반면, NPOI는 기본 AutoFilter만 매우 제한적으로 지원합니다.

  9. GcExcel값 기준, 여러 값 기준, 사용자 정의 정렬, 내부 기준, 글꼴 색 기준, 아이콘 기준정렬 기능을 지원하는 반면, NPOI는 정렬에 대한 기본 제공 지원이 없습니다.

  10. GcExcel기본 제공 슬라이서 스타일 및 사용자 정의 슬라이서 스타일 적용, 잘라내기/복사, 중복, 필터 작업 수행표가 포함된 슬라이서피벗 테이블이 포함된 슬라이서를 지원하는 반면, NPOI는 이러한 기능을 지원하지 않습니다.

  11. GcExcel CSV 가져오기 및 내보내기를 쉽게 지원하지만 NPOI는 이 기능을 지원하지 않습니다.

  12. GcExcel그라데이션 채우기를 지원하지만 NPOI에서는 이 기능을 지원하지 않습니다. 그라데이션 채우기는 셀, 셰이프, 차트 계열을 눈에 잘 띄게 표시하는 데 유용합니다.

아래 표에는 NPOI가 아니라 GcExcel을 사용해야 하는 다른 여러 가지 이유가 정리되어 있습니다.


GcExcel .NET vs. NPOI - 상세 비교 표


성능 비교

테스트 시스템 구성

  • Linux: CPU: 4코어 Intel(R) Xeon(R) CPU E5-2683 v3, 2.00GHz, 4GB

  • MacOS: Intel i9, 2.3GHz/MacOS Catalina v10.15.6

  • Windows: Intel(R) Core(TM) i7-8700 CPU, 3.20GHz 3.19 GHz, x64 기반 프로세서, Windows 10 Pro 20H2 Build 19042.1052.


비교에 사용한 빌드

이 비교에서는 다음 GcExcel 및 NPOI 빌드 버전을 참조합니다.


테스트 샘플

여기서 샘플을 다운로드하십시오.


테스트 데이터

처음 3개 테스트에서는 이중, 문자열, 날짜 유형의 값을 100,000개 행 x 30개 열에 채워 값 설정, 값 가져오기, XLSX로 저장, 사용된 메모리 합계(언제든지 가비지 수집이 발생할 수 있으므로 정확하게 측정하기 어려움) 등의 성능을 측정합니다.


이러한 테스트는 다음과 같습니다(문자열 테스트에서는 하드코딩된 문자열 값 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"를 사용하고 날짜 테스트에서는 new Date() 개체를 생성하며, 그 외에는 동일).


GcExcel 이중 성능 테스트

public static void TestSetRangeValues_Double(int rowCount, int columnCount, ref double setTime, ref double getTime, ref double saveTime, ref double usedMem)
      {
​
          Console.WriteLine();
          Console.WriteLine(string.Format("GcExcel benchmark for double values with {0} rows and {1} columns", rowCount, columnCount));
​
          IWorkbook workbook = new Workbook();
          IWorksheet worksheet = workbook.Worksheets[0];
​
          DateTime start = DateTime.Now;
          double[,] values =new double[rowCount, columnCount];
​
          for (int i = 0; i < rowCount; i++)
          {
              for (int j = 0; j < columnCount; j++)
              {
                  values[i,j] = i + j;
              }
          }
​
          worksheet.Range[0, 0, rowCount, columnCount].Value = values;
          DateTime end = DateTime.Now;
​
          setTime = (end - start).TotalSeconds;
          Console.WriteLine(string.Format("GcExcel set double values: {0:N3} s", setTime));
​
          start = DateTime.Now;
          object tmpValues = worksheet.Range[0, 0, rowCount, columnCount].Value;
          end = DateTime.Now;
​
          getTime = (end - start).TotalSeconds;;
          Console.WriteLine(string.Format("GcExcel get double values: {0:N3} s", getTime));
​
          start = DateTime.Now;
          workbook.Save("../../output/gcexcel-saved-doubles.xlsx");
          end = DateTime.Now;
          saveTime = (end - start).TotalSeconds;;
          Console.WriteLine(string.Format("GcExcel save doubles to Excel: {0:N3} s", saveTime));
​
​
      }


마지막 2개 테스트에서는 계산 성능에 더 집중합니다.


다음 테스트에서는 100,000개 행 x 2개 열에 이중 값을 채운 다음 처음 2개 열에 인접해 있고 해당 열의 이중 값을 참조하는 100,000개 행 x 30개 열 범위에 수식을 설정하여 수식 설정, 계산, XLSX로 저장, 사용된 메모리 합계 등의 성능을 측정합니다.


이 테스트는 다음과 같습니다.


GcExcel 개방형 대규모 XLSX 성능 테스트

public static void TestBigExcelFile(int rowCount, int columnCount, ref double openTime, ref double calcTime, ref double saveTime, ref double usedMem)
      {
​
          Console.WriteLine();
          Console.WriteLine(string.Format("GcExcel benchmark for test-performance.xlsx which is 20.5MB with a lot of values, formulas and styles"));
​
          IWorkbook workbook = new Workbook();
​
          DateTime start = DateTime.Now;
          workbook.Open("../../files/test-performance.xlsx");
          DateTime end = DateTime.Now;
​
          openTime = (end - start).TotalSeconds;;
          Console.WriteLine(string.Format("GcExcel open big Excel: {0:N3} s", openTime));
​
          start = DateTime.Now;
          workbook.Dirty();
          workbook.Calculate();
          end = DateTime.Now;
​
          calcTime = (end - start).TotalSeconds;;
          Console.WriteLine(string.Format("GcExcel calculate formulas for big Excel: {0:N3} s", calcTime));
​
          start = DateTime.Now;
          workbook.Save("../../output/gcexcel-saved-test-performance.xlsx");
          end = DateTime.Now;
          saveTime = (end - start).TotalSeconds;;
          Console.WriteLine(string.Format("GcExcel save back to big Excel: {0:N3} s", saveTime));
​
      }


이 통합 문서는 워크시트가 계산될 때마다 재계산해야 하는 휘발성 함수를 사용하는 여러 수식이 포함된 대규모 XLSX를 로드하고 파일 열기, 계산, XLSX로 저장, 사용된 메모리 합계 등의 성능을 측정합니다.


이 테스트는 다음과 같습니다.


GcExcel 수식 성능 테스트

public static void TestSetRangeFormulas(int rowCount, int columnCount, ref double setTime, ref double calcTime, ref double saveTime, ref double usedMem)
      {
          Console.WriteLine(string.Format("GcExcel benchmark for double values with {0} rows and {1} columns", rowCount, columnCount));
​
          IWorkbook workbook = new Workbook();
          workbook.ReferenceStyle = ReferenceStyle.R1C1;
          IWorksheet worksheet = workbook.Worksheets[0];
​
          double[,] values = new double[ rowCount, 2];
​
          for (int i = 0; i < rowCount; i++)
          {
              for (int j = 0; j < 2; j++)
              {
                  values[i,j] = i + j;
              }
          }
          worksheet.Range[0, 0, rowCount, 2].Value = values;
​
          DateTime start = DateTime.Now;
          worksheet.Range[0, 2, rowCount-2, columnCount].Formula = "=SUM(RC[-2],RC[-1])";
          DateTime end = DateTime.Now;
​
          setTime = (end - start).TotalSeconds;;
          Console.WriteLine(string.Format("GcExcel set formulas: {0:N3} s", setTime));
​
          start = DateTime.Now;
          workbook.Calculate();
          end = DateTime.Now;
​
          calcTime = (end - start).TotalSeconds;;
          Console.WriteLine(string.Format("GcExcel calculates formula: {0:N3} s", calcTime));
​
          workbook.ReferenceStyle = ReferenceStyle.A1;
​
          start = DateTime.Now;
          workbook.Save("../../output/gcexcel-saved-formulas.xlsx");
          end = DateTime.Now;
          saveTime = (end - start).TotalSeconds;;
          Console.WriteLine(string.Format("GcExcel save formulas to Excel: {0:N3} s", saveTime));
​
      }


성능 결과


다음은 전체 성능 세부 정보입니다.


GcExcel은 Excel 파일을 로드, 수정 및 저장하는 다양한 작업에서 NPOI보다 성능이 우수합니다. 아래 수치를 확인해 보십시오.

Excel


소요 시간(초):

Windows

MacOS

Linux


메모리 사용량(MB)

MemoryConsumption


참고: 특정 시스템 구성에서 얻은 결과입니다. 다른 구성에서 테스트하는 경우 GrapeCity에서 수집한 결과와 값이 정확히 일치하지 않을 수 있습니다. 전반적인 성능상 불일치가 관찰되는 경우 아래에 의견을 남겨 주시기 바랍니다.


전반적으로 GcExcel이 더 빠르고 메모리 사용량이 더 적습니다. 직접 확인해 보십시오.


샘플 다운로드


릴리스마다 GcExcel의 성능을 지속적으로 모니터링하고 개선해 나갈 것입니다. 다음 릴리스를 기대해 주세요!




지금 바로 GcExcel .NET Core를 다운로드하여 직접 테스트해보세요!

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

댓글목록

등록된 댓글이 없습니다.

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

태그1

인기글

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