본문 바로가기
IT/Java

Java 에서의 Apache POI

by 성준하이 2022. 11. 22.
반응형

아파치 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

댓글