본문 바로가기

Backend/Utils

POI 사용법

반응형
  • Apache POI란?
    Apache POI는 Excel 파일과 관련된 내용을 처리하기 위해 다른 많은 오픈 소스 라이브러리 중에서 신뢰할 수 있는 라이브러리로 Apache POI 라이브러리를 사용하여 MS Word 및 MS PowerPoint 파일을 읽고 쓸 수 있음
  • POI 라이브러리의 중요 클래스
    1) HSSF, XSSF 및 SXSSF 클래스
    HSSF: Excel 97(-2007) 파일 형식의 POI 프로젝트 Java 구현이다. 예: HSSFWorkbook, HSSFSheet.
    XSSF: Excel 2007 OOXML(.xlsx) 파일 형식의 POI 프로젝트 Java 구현이다. 예: XSSFWorkbook, XSSFSheet.
    SXSSF (3.8-beta3부터): 거대한 스프레드시트를 생성해야 하고 힙 공간이 제한되어 있을 때 사용되는 XSSF의 API 호환 스트리밍 확장이다. 예: SXSSFWorkbook, SXSSFSheet. SXSSF는 슬라이딩 윈도우 내의 행에 대한 액세스를 제한하여 메모리 사용량을 줄임 = 읽기만 가능 /  XSSF는 문서의 모든 행에 대한 액세스 가능 = 읽기/쓰기 가능

    2) 행 및 셀
    위의 클래스와 별도로 Row 및 Cell은 Excel 시트의 특정 행 및 특정 셀과 상호 작용한다.

    3) 스타일링 관련 클래스
    CellStyle, BuiltinFormats, ComparisonOperator, ConditionalFormattingRule, FontFormatting, IndexedColors, PatternFormatting, SheetConditionalFormatting 등과 같은 다양한 클래스는 주로 일부 규칙을 기반으로 시트에 서식을 추가해야 할 때 사용된다.

    4) FormulaEvaluator
    FormulaEvaluator는 Excel 시트의 수식 셀을 평가하는데 사용된다.
  • Maven Dependency(pom.xml)
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>
  • Excel 파일 읽기
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

public class ReadExcel {
	public static void main(String[] args) {
		try {
			FileInputStream file = new FileInputStream("c:/temp/excel_demo.xlsx");
			IOUtils.setByteArrayMaxOverride(Integer.MAX_VALUE);

			//Create Workbook instance holding reference to .xlsx file
			XSSFWorkbook workbook = new XSSFWorkbook(file);

			//Get first/desired sheet from the workbook
			XSSFSheet sheet = workbook.getSheetAt(0);

			//Iterate through each rows one by one
			Iterator<Row> rowIterator = sheet.iterator();
			while (rowIterator.hasNext()) {
				Row row = rowIterator.next();
				//For each row, iterate through all the columns
				Iterator<Cell> cellIterator = row.cellIterator();

				while (cellIterator.hasNext()) {
					Cell cell = cellIterator.next();
					//Check the cell type and format accordingly
					switch (cell.getCellType()) {
					case NUMERIC:
						System.out.print(cell.getNumericCellValue() + "\t");
						break;
					case STRING:
						System.out.print(cell.getStringCellValue() + "\t");
						break;
					default:
						throw new IllegalStateException("Unexpected value: " + cell.getCellType());
					}
				}
				System.out.println("");
			}
			file.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • Excel 파일 쓰기
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.net.URL;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class WriteExcel {
	public static void main(String[] args) {
		//Blank workbook
		XSSFWorkbook workbook = new XSSFWorkbook();

		//Create a blank sheet
		XSSFSheet sheet = workbook.createSheet("Employee Data");

		//This data needs to be written (Object[])
		Map<String, Object[]> data = new TreeMap<String, Object[]>();
		data.put("1", new Object[]{"ID", "NAME", "LASTNAME"});
		data.put("2", new Object[]{1, "Amit", "Shukla"});
		data.put("3", new Object[]{2, "Lokesh", "Gupta"});
		data.put("4", new Object[]{3, "John", "Adwards"});
		data.put("5", new Object[]{4, "Brian", "Schultz"});

		//Iterate over data and write to sheet
		Set<String> keyset = data.keySet();
		int rownum = 0;
		for (String key : keyset) {
			Row row = sheet.createRow(rownum++);
			Object[] objArr = data.get(key);
			int cellnum = 0;
			for (Object obj : objArr) {
				Cell cell = row.createCell(cellnum++);
				if (obj instanceof String)
					cell.setCellValue((String) obj);
				else if (obj instanceof Integer)
					cell.setCellValue((Integer) obj);
			}
		}
		try {
			//Write the workbook in file system
			URL url = ReadExcel.class.getClassLoader().getResource("excel_demo.xlsx");
			FileOutputStream out = new FileOutputStream(url.getFile());
			workbook.write(out);
			out.close();

			System.out.println("excel_demo.xlsx written successfully on disk.");

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
반응형