반응형
아파치 POI(Apache POI)는 아파치 소프트웨어 재단에서 만든 라이브러리로서 마이크로소프트 오피스 파일 포맷을 순수 자바 언어로서 읽고 쓰는 기능을 제공한다. 주로 워드, 엑셀, 파워포인트와 파일을 지원하며 최근의 오피스 포맷인 Office Open XML File Formats [1] (OOXML, 즉 xml 기반의 *.docx, *.xlsx, *.pptx 등) 이나 아웃룩, 비지오, 퍼블리셔 등으로 지원 파일 포맷을 늘려가고 있다.
-> 위키 백과
마이크로소프트 오피스 파일 포맷을 순수 자바 언어로서 읽고 쓰는 기능을 제공
사용법
- 먼저 라이브러리를 사용하기 위해서는 maven dependency 를 pom.xml 에 추가해줘야한다.
<!— xls 엑셀 제어 —> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <!— xlsx 엑셀 제어 —> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> |
- 만약 gradle이라면 아래와 같다.
dependencies { // xls 엑셀 파일 읽기 쓰기 implementation 'org.apache.poi:poi:4.1.2' // xlsx 엑셀 파일 읽기 쓰기 implementation 'org.apache.poi:poi-oomxl:4.1.2' } |
- apache POI 의 주요 클래스들은 주로 HSSF, XSSF 로 시작한다. 차이점은 아래와 같다.
HSSF - Excel 97(-2007) 파일 포맷을 사용할 때 사용 , ex) HSSFWorkbook, HSSFSheet XSSF - Excel 2007 OOXML (.xlsx) 파일 포맷을 사용할 때 사용 , ex) XSSFWorkbook, XSSFSheet |
- Workbook, Sheet, Row, Cell
Workbook은 하나의 엑셀 파일을 의미 Sheet는 엑셀파일(= Workbook)의 시트를 의미 Row, Cell 은 Sheet 안에 있는 행과 열을 의미 |
사용 되는 예제 코드는 다음과 같다.
파일 생성
// 빈 Workbook 생성 XSSFWorkbook workbook = new XSSFWorkbook(); // 빈 Sheet를 생성 XSSFSheet sheet = workbook.createSheet("employee data"); // Sheet를 채우기 위한 데이터들을 Map에 저장 Map<String, Object[]> data = new TreeMap<>(); data.put("1", new Object[]{"ID", "NAME", "PHONE_NUMBER"}); data.put("2", new Object[]{"1", "cookie", "010-1111-1111"}); data.put("3", new Object[]{"2", "sickBBang", "010-2222-2222"}); data.put("4", new Object[]{"3", "workingAnt", "010-3333-3333"}); data.put("5", new Object[]{"4", "wow", "010-4444-4444"}); // data에서 keySet를 가져온다. 이 Set 값들을 조회하면서 데이터들을 sheet에 입력한다. Set<String> keyset = data.keySet(); int rownum = 0; // 알아야할 점, TreeMap을 통해 생성된 keySet는 for를 조회시, 키값이 오름차순으로 조회된다. 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 { FileOutputStream out = new FileOutputStream(new File(filePath, fileNm)); workbook.write(out); out.close(); } catch (IOException e) { e.printStackTrace(); } |
파일 읽기
try { FileInputStream file = new FileInputStream(new File(filePath, fileNm)); // 엑셀 파일로 Workbook instance를 생성한다. XSSFWorkbook workbook = new XSSFWorkbook(file); // workbook의 첫번째 sheet를 가저온다. XSSFSheet sheet = workbook.getSheetAt(0); // 만약 특정 이름의 시트를 찾는다면 workbook.getSheet("찾는 시트의 이름"); // 만약 모든 시트를 순회하고 싶으면 // for(Integer sheetNum : workbook.getNumberOfSheets()) { // XSSFSheet sheet = workbook.getSheetAt(i); // } // 아니면 Iterator<Sheet> s = workbook.iterator() 를 사용해서 조회해도 좋다. // 모든 행(row)들을 조회한다. Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); // 각각의 행에 존재하는 모든 열(cell)을 순회한다. Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); // cell의 타입을 하고, 값을 가져온다. switch (cell.getCellType()) { case NUMERIC: System.out.print((int) cell.getNumericCellValue() + "\t"); //getNumericCellValue 메서드는 기본으로 double형 반환 break; case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; } } System.out.println(); } file.close(); } catch (IOException e) { e.printStackTrace(); } |
반응형
'IT > Java' 카테고리의 다른 글
JPA 로그 설정 관련 (25) | 2022.11.24 |
---|---|
Java File 존재여부 체크 (30) | 2022.11.23 |
Spring AOT 란? (38) | 2022.11.21 |
Spring 6.0 / SpringBoot3.0 에 대해 (29) | 2022.11.20 |
공백 제거 trim() / strip() (32) | 2022.11.19 |
댓글