본문 바로가기

개발/자바

[Java] 자바 엑셀 파일 (.xlsx) 읽기 (poi 라이브러리)

poi 라이브러리

아파치 poi 라이브러리를 사용하면 자바에서 간단한 코드로 엑셀 파일을 읽을 수 있습니다. 

poi-4.1.2 버전으로 다운로드 후 프로젝트에 라이브러리를 추가해 줬습니다. 

다운로드 경로 : https://archive.apache.org/dist/poi/release/bin/

기본 코드는 .xlsx을 읽어오는 xssf를 사용하는 버전으로 작성되었고 예전 버전인. xls을 읽어야 한다면 하단의 블로그 글을 참고하시면 될 것 같습니다. 

 

[Java] 엑셀 파일(.xls) 읽기

자바에서 엑셀 파일(.xls)을 읽어오는 방법입니다. 이클립스에서 poi 라이브러리 다운로드 및 추가 방법은 아래 글을 참고해주세요 https://yangsosolife.tistory.com/7 [Java] POI 라이브러리 다운로드 자바에

yangsosolife.tistory.com

 

자바 엑셀 데이터 읽기

엑셀 데이터를 읽어오는 것은 간단하지만 파일 업로드를 통해 데이터를 받아오기 때문에 엑셀에서 사용한 서식으로 인해 문제가 많이 생깁니다. 아래에 getValue와 같이 데이터 타입별로 값을 가져오고 넘버포맷을 지정해 줘야 숫자를 가져올 때 문제가 안 생깁니다. 그리고 가능하면 샘플 파일을 제공하고 서식설정을 해두어 이상한 형식으로 데이터를 받아오는 것을 막고 자바 단에서도 예상 범위 외의 데이터는 받지 않도록 예외처리를 꼼꼼하게 해 줄 필요가 있습니다. 

import java.io.FileInputStream;
import java.io.IOException;
import java.text.NumberFormat;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class DownloadExcel {
    public static void main(String[] args) throws IOException {
        String path = "/";	//파일 경로 설정
        String filename = "test.xlsx";	//파일명 설정
        readExcel(path,filename);
    }
    
    public static void readExcel(String path,String filename) throws IOException {
        FileInputStream file = new FileInputStream(path + filename);
        XSSFWorkbook workbook = new XSSFWorkbook(file);
        
        //시트 갯수
        int sheetNum = workbook.getNumberOfSheets();

        for (int s = 0; s < sheetNum; s++) {
            XSSFSheet sheet = workbook.getSheetAt(s);
            System.out.println(filename+"의 "+(s+1)+"번째 시트에서 읽어온 내용");

            //행 갯수
            int rows = sheet.getPhysicalNumberOfRows();

            for (int r = 0; r < rows; r++) {
                XSSFRow row = sheet.getRow(r);

                int cells = row.getPhysicalNumberOfCells();

                System.out.print("|	" + (r+1) + "	|");
                
                for (int c = 0; c < cells; c++) {
                    XSSFCell cell = row.getCell(c);

                    String value = getValue(cell);
                    System.out.print("		" + value + "		|");
                }
                System.out.println();
            }
        }
    }
    
    public static String getValue(XSSFCell cell){
        NumberFormat f = NumberFormat.getInstance();
        f.setGroupingUsed(false);    //지수로 안나오게 설정
        String value = "";

        if (cell != null) {
            //타입 체크
            switch (cell.getCellType()) {
                case STRING:
                    value = cell.getStringCellValue();
                    break;
                case NUMERIC:
                    value = f.format(cell.getNumericCellValue()) + "";
                    break;
                case BLANK:
                    value = cell.getBooleanCellValue() + "";
                    break;
                case ERROR:
                    value = cell.getErrorCellValue() + "";
                    break;
            }
        }
        return value;
    }
}

 

입출력 예제

test.xlsx
0.01MB
입력 예제(서식 지정)
출력 예제

각각 텍스트, 숫자로 서식 지정한 후 테스트를 진행했다. 

관련 에러 해결

 

[에러 해결] NoClassDefFoundError: org/apache/xmlbeans/XmlException 해결

문제 상황 자바에서 poi 라이브러리로 엑셀 파일을 읽어오려다가 발생한 에러이다. 에러 문구대로 아파치에서 제공하는 xmlbeans 클래스가 정의되어있지 않아서 생긴 에러로 poi 라이브러리 중 xmlbe

logdotd.tistory.com

 

[에러 해결] The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Of

문제 상황 The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF) 문제 및 해결 Java에

logdotd.tistory.com