Apache POI 튜토리얼

Apache POI 자습서에 오신 것을 환영합니다. 때로는 Microsoft Excel 파일에서 데이터를 읽어야 하거나 비즈니스나 금융 목적으로 주로 엑셀 형식으로 보고서를 생성해야 할 때가 있습니다. 자바는 엑셀 파일을 다루기 위한 내장 지원을 제공하지 않기 때문에 작업을 위해 오픈 소스 API를 찾아야 합니다. 자바용 엑셀 API를 찾아보면 대부분의 사람들이 JExcel이나 Apache POI를 추천합니다. 추가적인 연구를 통해 Apache POI가 주요한 이유로 선택되었음을 알게 되었습니다. 고급 기능과 관련된 몇 가지 다른 이유도 있지만 그에 대해서는 자세히 다루지 않겠습니다.

  • Apache 재단의 지원.
  • JExcel은 xlsx 형식을 지원하지 않지만 POI는 xls와 xlsx 형식을 모두 지원합니다.
  • Apache POI는 대용량 파일에 적합하며 적은 메모리를 사용하는 스트림 기반 처리를 제공합니다.

Apache POI

Apache POI는 Microsoft Excel 문서를 다루는데 탁월한 지원을 제공합니다. Apache POI는 XLS와 XLSX 형식의 스프레드시트를 모두 처리할 수 있습니다. Apache POI API에 대한 몇 가지 중요한 포인트는 다음과 같습니다:

  1. Apache POI에는 Excel ’97(-2007) 파일 형식인 XLS의 HSSF 구현이 포함되어 있습니다.
  2. Excel 2007 OOXML (.xlsx) 파일 형식에는 Apache POI XSSF 구현을 사용해야 합니다.
  3. Apache POI HSSF 및 XSSF API는 엑셀 스프레드시트를 읽거나 쓰거나 수정하는 메커니즘을 제공합니다.
  4. Apache POI는 매우 큰 엑셀 시트와 함께 작업하기 위한 XSSF의 확장 인 SXSSF API도 제공합니다. SXSSF API는 적은 메모리를 필요로 하며 힙 메모리가 제한적인 경우에 적합합니다.
  5. 두 가지 모델을 선택할 수 있습니다 – 이벤트 모델과 사용자 모델. 이벤트 모델은 엑셀 파일을 토큰으로 읽고 처리해야 하기 때문에 메모리를 적게 사용합니다. 사용자 모델은 객체 지향적이고 사용하기 쉽습니다. 이 예제에서는 사용자 모델을 사용할 것입니다.
  6. Apache POI는 수식 작업, 셀 스타일 생성(색상 및 테두리 채우기, 글꼴, 헤더 및 푸터), 데이터 유효성 검사, 이미지, 하이퍼링크 등과 같은 추가적인 엑셀 기능을 훌륭하게 지원합니다.

Apache POI Maven 종속성

만약 Maven을 사용하고 있다면, 아래의 Apache POI 종속성을 추가하세요.

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.10-FINAL</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>3.10-FINAL</version>
</dependency>

현재 버전은 Apache POI 3.10-FINAL입니다. 독립 실행형 Java 애플리케이션을 사용하는 경우, 아래 이미지에서 JAR 파일을 포함하세요.

Apache POI 예제 – 엑셀 파일 읽기

우리는 “Sample.xlsx”라는 엑셀 파일이 두 개의 시트를 가지고 있고 아래 이미지와 같은 데이터가 있다고 가정해 봅시다. 우리는 엑셀 파일을 읽고 국가 목록을 생성하고 싶습니다. Sheet1에는 무시할 추가 데이터가 있습니다. 국가 자바 빈 코드는 다음과 같습니다: Country.java

package com.journaldev.excel.read;

public class Country {

	private String name;
	private String shortCode;
	
	public Country(String n, String c){
		this.name=n;
		this.shortCode=c;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getShortCode() {
		return shortCode;
	}
	public void setShortCode(String shortCode) {
		this.shortCode = shortCode;
	}
	
	@Override
	public String toString(){
		return name + "::" + shortCode;
	}
	
}

엑셀 파일을 국가 목록으로 읽는 Apache POI 예제 프로그램은 다음과 같습니다. ReadExcelFileToList.java

package com.journaldev.excel.read;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadExcelFileToList {

	public static List readExcelData(String fileName) {
		List countriesList = new ArrayList();
		
		try {
			//xlsx/xls 파일에서 입력 스트림 생성
			FileInputStream fis = new FileInputStream(fileName);
			
			//xlsx/xls 파일 입력 스트림에 대한 Workbook 인스턴스 생성
			Workbook workbook = null;
			if(fileName.toLowerCase().endsWith("xlsx")){
				workbook = new XSSFWorkbook(fis);
			}else if(fileName.toLowerCase().endsWith("xls")){
				workbook = new HSSFWorkbook(fis);
			}
			
			//xlsx 파일의 시트 수 가져오기
			int numberOfSheets = workbook.getNumberOfSheets();
			
			//각 시트를 반복하며
			for(int i=0; i < numberOfSheets; i++){
				
				//Workbook에서 n번째 시트 가져오기
				Sheet sheet = workbook.getSheetAt(i);
				
				//각 시트에는 행이 있으므로, 행을 반복하며
				Iterator rowIterator = sheet.iterator();
				while (rowIterator.hasNext()) 
		        {
					String name = "";
					String shortCode = "";
					
					//행 객체 가져오기
					Row row = rowIterator.next();
					
					//각 행에는 열이 있으므로, 열 반복자를 가져와서 반복하며
					Iterator cellIterator = row.cellIterator();
		             
		            while (cellIterator.hasNext()) 
		            {
		            	//셀 객체 가져오기
		            	Cell cell = cellIterator.next();
		            	
		            	//셀 유형을 확인하고 해당 처리 수행
		            	switch(cell.getCellType()){
		            	case Cell.CELL_TYPE_STRING:
		            		if(shortCode.equalsIgnoreCase("")){
		            			shortCode = cell.getStringCellValue().trim();
		            		}else if(name.equalsIgnoreCase("")){
		            			//2번째 열
		            			name = cell.getStringCellValue().trim();
		            		}else{
		            			//무작위 데이터, 무시
		            			System.out.println("Random data::"+cell.getStringCellValue());
		            		}
		            		break;
		            	case Cell.CELL_TYPE_NUMERIC:
		            		System.out.println("Random data::"+cell.getNumericCellValue());
		            	}
		            } //end of cell iterator
		            Country c = new Country(name, shortCode);
		            countriesList.add(c);
		        } //end of rows iterator
				
				
			} //end of sheets for loop
			
			//파일 입력 스트림 닫기
			fis.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return countriesList;
	}

	public static void main(String args[]){
		List list = readExcelData("Sample.xlsx");
		System.out.println("Country List\n"+list);
	}

}

프로그램은 이해하기 매우 쉽고 다음 단계를 포함합니다:

  1. 파일 유형에 기반한 Workbook 인스턴스를 만듭니다. xlsx 형식의 경우 XSSFWorkbook을 사용하고 xls 형식의 경우 HSSFWorkbook을 사용합니다. 파일 이름을 기반으로 Workbook 인스턴스를 가져오기 위해 팩토리 패턴을 사용한 래퍼 클래스를 만들 수도 있다는 점에 유의하세요.
  2. getNumberOfSheets()를 사용하여 시트의 개수를 가져오고 for 루프를 사용하여 각 시트를 파싱합니다. getSheetAt(int i) 메서드를 사용하여 Sheet 인스턴스를 가져옵니다.
  3. Row 이터레이터를 가져와서 Cell 이터레이터를 가져와 Cell 객체를 얻습니다. Apache POI는 여기서 이터레이터 패턴을 사용합니다.
  4. Cell의 유형을 읽고 그에 따라 처리하기 위해 switch-case를 사용합니다.

이제 위의 Apache POI 예제 프로그램을 실행하면 콘솔에 다음과 같은 출력이 생성됩니다.

Random data::1.0
Random data::2.0
Random data::3.0
Random data::4.0
Country List
[India::IND, Afghanistan::AFG, United States of America::USA, Anguilla::AIA, 
Denmark ::DNK, Dominican Republic ::DOM, Algeria ::DZA, Ecuador ::ECU]

Apache POI 예제 – Excel 파일 쓰기

아파치 POI에서 엑셀 파일을 작성하는 방법은 읽는 것과 유사합니다. 다만, 여기서는 먼저 워크북을 생성합니다. 그런 다음 시트, 행 및 셀 값을 설정하고 FileOutputStream을 사용하여 파일에 기록합니다. 위의 방법에서 국가 목록을 사용하여 다른 파일의 단일 시트에 저장하는 간단한 아파치 POI 예제를 작성해 봅시다. WriteListToExcelFile.java

package com.journaldev.excel.read;

import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class WriteListToExcelFile {

	public static void writeCountryListToFile(String fileName, List countryList) throws Exception{
		Workbook workbook = null;
		
		if(fileName.endsWith("xlsx")){
			workbook = new XSSFWorkbook();
		}else if(fileName.endsWith("xls")){
			workbook = new HSSFWorkbook();
		}else{
			throw new Exception("invalid file name, should be xls or xlsx");
		}
		
		Sheet sheet = workbook.createSheet("Countries");
		
		Iterator iterator = countryList.iterator();
		
		int rowIndex = 0;
		while(iterator.hasNext()){
			Country country = iterator.next();
			Row row = sheet.createRow(rowIndex++);
			Cell cell0 = row.createCell(0);
			cell0.setCellValue(country.getName());
			Cell cell1 = row.createCell(1);
			cell1.setCellValue(country.getShortCode());
		}
		
		 이제 엑셀 데이터를 파일에 쓰는 것을 해봅시다. 
		FileOutputStream fos = new FileOutputStream(fileName);
		workbook.write(fos);
		fos.close();
		System.out.println(fileName + " written successfully");
	}
	
	public static void main(String args[]) throws Exception{
		List list = ReadExcelFileToList.readExcelData("Sample.xlsx");
		WriteListToExcelFile.writeCountryListToFile("Countries.xls", list);
	}
}

위의 아파치 POI 예제 프로그램을 실행하면 생성된 엑셀 파일은 다음 이미지와 같습니다.

아파치 POI 예제 – 엑셀 수식 읽기

가끔은 수식이 포함된 복잡한 엑셀 파일을 다루어야 할 때도 있습니다. 간단한 아파치 POI 예제를 통해 셀의 수식과 값을 읽어 보겠습니다. ReadExcelFormula.java

package com.journaldev.excel.read;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadExcelFormula {

	public static void readExcelFormula(String fileName) throws IOException{
		
		FileInputStream fis = new FileInputStream(fileName);
		
		// xlsx 파일을 가정합니다.
		Workbook workbook = new XSSFWorkbook(fis);
		Sheet sheet = workbook.getSheetAt(0);
		Iterator rowIterator = sheet.iterator();
		while (rowIterator.hasNext()) 
        {
			Row row = rowIterator.next();
			Iterator cellIterator = row.cellIterator();
            
            while (cellIterator.hasNext()) 
            {
            	Cell cell = cellIterator.next();
            	switch(cell.getCellType()){
            	case Cell.CELL_TYPE_NUMERIC:
            		System.out.println(cell.getNumericCellValue());
            		break;
            	case Cell.CELL_TYPE_FORMULA:
            		System.out.println("Cell Formula="+cell.getCellFormula());
            		System.out.println("Cell Formula Result Type="+cell.getCachedFormulaResultType());
            		if(cell.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC){
            			System.out.println("Formula Value="+cell.getNumericCellValue());
            		}
            	}
            }
        }
	}
	
	public static void main(String args[]) throws IOException {
		readExcelFormula("FormulaMultiply.xlsx");
	}
}

위의 아파치 POI 예제 프로그램을 실행하면 다음과 같은 출력을 얻을 수 있습니다.

1.0
2.0
3.0
4.0
Cell Formula=A1*A2*A3*A4
Cell Formula Result Type=0
Formula Value=24.0

Apache POI 예제 – Excel 수식 작성

가끔은 계산을 해야하고 그 다음에 셀 값들을 작성해야 할 때가 있습니다. 우리는 엑셀 수식을 사용하여 이 계산을 수행할 수 있으며, 계산에 사용되는 셀 값들이 변경된다면 값들도 변경되기 때문에 더 정확해집니다. 아파치 POI API를 사용하여 수식을 포함한 엑셀 파일을 작성하는 간단한 예제를 살펴보겠습니다. WriteExcelWithFormula.java

package com.journaldev.excel.read;

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class WriteExcelWithFormula {

	public static void writeExcelWithFormula(String fileName) throws IOException{
		Workbook workbook = new XSSFWorkbook();
		Sheet sheet = workbook.createSheet("Numbers");
		Row row = sheet.createRow(0);
		row.createCell(0).setCellValue(10);
		row.createCell(1).setCellValue(20);
		row.createCell(2).setCellValue(30);
		//수식 셀 설정
		row.createCell(3).setCellFormula("A1*B1*C1");
		
		//파일로 작성해 봅시다
		FileOutputStream fos = new FileOutputStream(fileName);
		workbook.write(fos);
		fos.close();
		System.out.println(fileName + " written successfully");
	}
	
	public static void main(String[] args) throws IOException {
		writeExcelWithFormula("Formulas.xlsx");
	}
}

위의 아파치 POI API 예제 프로그램을 사용하여 생성된 엑셀 파일은 아래 이미지와 같습니다. 이것으로 엑셀 파일과 작업하는 Apache POI 튜토리얼은 모두 끝났습니다. 더 많은 기능을 알아보려면 Apache POI 클래스의 메소드를 확인하십시오. 참고: Apache POI 개발자 가이드

Source:
https://www.digitalocean.com/community/tutorials/apache-poi-tutorial