엑셀 파일을 생성 편리한 라이브러리 비교 (Apache POI (Java), openpyxl (Python), SheetJS(JS)

seheo·2024년 12월 3일
0

회사에서 새로운 요구 사항으로 대시보의 내용을 엑셀 보고서 형식으로 보고싶은 요구사항을 구현하기 위해

어떤 언어와 라이브러리를 사용할지 고민하게 되었다.

우리 팀은 java언어 외 개발 경험을 해본 분이 잘없어서 특별한 이유가 없으면 Java와 POI라이브러리를 사용해 구현 할 것 같지만 다른 언어와 라이브러리를 경험해보고 결정하기로 했다.

아래는 동일한 데이터를 사용해 Apache POI (Java), openpyxl (Python), SheetJS (JavaScript)로 엑셀 파일을 생성하는 예제 코드입니다. 각 라이브러리의 특징과 사용법을 비교하기 위해 동일한 구조와 데이터를 사용합니다.

공통 데이터

Sheet Name: "Sample Sheet"
Headers: ["ID", "Name", "Score"]
Data:
1, Alice, 85
2, Bob, 90
3, Charlie, 78
1. Apache POI (Java)

1. Apache POI (Java)

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelWriter {
    public static void main(String[] args) {
        String[] headers = {"ID", "Name", "Score"};
        Object[][] data = {
            {1, "Alice", 85},
            {2, "Bob", 90},
            {3, "Charlie", 78}
        };

        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Sample Sheet");

        // 헤더 로우 생성
        Row headerRow = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
        }

        // 데이터 로우 생성
        for (int i = 0; i < data.length; i++) {
            Row row = sheet.createRow(i + 1);
            for (int j = 0; j < data[i].length; j++) {
                Cell cell = row.createCell(j);
                if (data[i][j] instanceof String) {
                    cell.setCellValue((String) data[i][j]);
                } else if (data[i][j] instanceof Integer) {
                    cell.setCellValue((Integer) data[i][j]);
                }
            }
        }

        try (FileOutputStream fileOut = new FileOutputStream("Sample.xlsx")) {
            workbook.write(fileOut);
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("Excel file created: Sample.xlsx");
    }
}

특징

  • 강력한 기능을 제공하지만, 상대적으로 코드가 장황.
  • 데이터 타입에 따라 셀 값을 명시적으로 설정해야 함.
  • 스타일, 차트, 수식 등을 세밀하게 설정 가능.

2. openpyxl (Python)

from openpyxl import Workbook

# Initialize Workbook
workbook = Workbook()
sheet = workbook.active
sheet.title = "Sample Sheet"

# Headers and Data
headers = ["ID", "Name", "Score"]
data = [
    [1, "Alice", 85],
    [2, "Bob", 90],
    [3, "Charlie", 78],
]

# Add Headers
sheet.append(headers)

# Add Data Rows
for row in data:
    sheet.append(row)

# Save File
workbook.save("Sample.xlsx")
print("Excel file created: Sample.xlsx")

특징

  • 코드가 간결.
  • append() 메서드를 활용해 데이터를 손쉽게 추가 가능.
  • 상대적으로 적은 코드로 엑셀 파일을 생성할 수 있음.
  • 추가 기능(스타일, 차트 등)은 필요할 때 명시적으로 설정.

3. SheetJS (JavaScript)

const XLSX = require("xlsx");

// Headers and Data
const headers = ["ID", "Name", "Score"];
const data = [
    [1, "Alice", 85],
    [2, "Bob", 90],
    [3, "Charlie", 78],
];

// Create Worksheet
const wsData = [headers, ...data];
const ws = XLSX.utils.aoa_to_sheet(wsData);

// Create Workbook
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "Sample Sheet");

// Write File
XLSX.writeFile(wb, "Sample.xlsx");
console.log("Excel file created: Sample.xlsx");

특징

간결한 API로 빠르게 엑셀 작업 가능.
aoa_to_sheet 메서드를 사용해 2D 배열을 쉽게 워크시트로 변환.
스타일이나 복잡한 설정 작업은 제한적이지만, 기본적인 데이터 처리에 적합.

비교 요약

특징Apache POI (Java)openpyxl (Python)SheetJS (JavaScript)
코드 복잡성상대적으로 복잡, 명시적으로 셀 설정 필요간결, Python의 간단한 문법 활용매우 간결, 배열과 객체 활용
성능대용량 데이터 처리에 강점중소규모 데이터 처리에 적합중소규모 데이터 처리에 적합
스타일링/차트세밀한 스타일링 및 차트 기능 제공스타일링 가능하지만 코드 추가 필요스타일링은 제한적
사용 용도엔터프라이즈급 애플리케이션데이터 분석 및 간단한 데이터 처리에 적합웹 기반 간단한 엑셀 처리에 적합
출력 형식 지원.xls, .xlsx.xlsx.xls, .xlsx, CSV, JSON
학습 곡선높은 편낮음

결론

  • POI와 openpyxl를 비교
  • 일단 초기 프로토타입은 스타일링 없이 데이터를 그대로 저장하는 요구조건만 있지만 분명 고도화하면서 스타일링 관련 요구사항도 분명 나올 것 같아 SheetJS는 제외한다.

0개의 댓글