티스토리 뷰

안녕하세요 박스여우입니다.

최근 학교의 잔류조사 시스템 개발을 마무리 하고 있는데요, 사감선생님의 편의를 위해 조사된 결과를 엑셀 파일 형태로 출력해야 했습니다.


그래서 오늘은 Java에서 엑셀 파일(xls, xlsx)을 읽고 쓰는 방법을 소개해 드리려고 합니다.



Apache POI

우선 엑셀파일을 텍스트 파일처럼 읽고 쓸수는 없습니다. 때문에 Java에서 엑셀파일을 다루기 위해 Apache POI 라이브러리를 사용해야 합니다.


Apache POI 라이브러리를 다운받기 위해서는 https://poi.apache.org/download.html 요 주소로접속한 뒤에 스크롤을 내리다 보면

위와같이 Binary Distribution 항목이 있습니다. 여기에서 빨간색 부분(poi-bin-3.15-beta2-...)을 클릭!


그 다음 스크롤을 또 내리다 보면 HTTP 항목이 나오게 됩니다. 위 링크를 통해 라이브러리를 다운받아 주세요. 네 가지 링크 모두 같은 링크이니 아무거나 선택하셔도 됩니다.


다운받은 압축파일을 열어보면 위와 같이 .jar확장자로 된 라이브러리 들이 있는데요, 빨간색 네모 안에 있는 라이브러리들은 무조건 적용 해 주셔야 합니다.


만약 xlsx를 다루고 싶으시다면 초록색 네모로 된 ooxml-lib 폴더의 라이브러리도 적용해 주시면 됩니다.




 본격적인 엑셀 다루기

엑셀을 파싱하기 먼저 아래 사진을 통해 엑셀의 구조(용어)를 익히고 가면 좋을 것 같습니다. 저 같은 경우 엑셀의 용어를 잘 몰라 햇갈리는 부분이 많이 발생했거든요. 하지만 사진보다는 직접 엑셀을 다뤄보신다면 더할나위 없이 좋을것 같습니다.



엑셀 파일의 셀 값 출력하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        try {
            FileInputStream fis = new FileInputStream("불러올 파일 경로/이름.xlsx");
            HSSFWorkbook workbook = new HSSFWorkbook(fis);
            HSSFSheet sheet = workbook.getSheetAt(0); // 해당 엑셀파일의 시트(Sheet) 수
            int rows = sheet.getPhysicalNumberOfRows(); // 해당 시트의 행의 개수
            for (int rowIndex = 1; rowIndex < rows; rowIndex++) {
                HSSFRow row = sheet.getRow(rowIndex); // 각 행을 읽어온다
                if (row != null) {
                    int cells = row.getPhysicalNumberOfCells();
                    for (int columnIndex = 0; columnIndex <= cells; columnIndex++) {
                        HSSFCell cell = row.getCell(columnIndex); // 셀에 담겨있는 값을 읽는다.
                        String value = "";
                        switch (cell.getCellType()) { // 각 셀에 담겨있는 데이터의 타입을 체크하고 해당 타입에 맞게 가져온다.
                        case HSSFCell.CELL_TYPE_NUMERIC:
                            value = cell.getNumericCellValue() + "";
                            break;
                        case HSSFCell.CELL_TYPE_STRING:
                            value = cell.getStringCellValue() + "";
                            break;
                        case HSSFCell.CELL_TYPE_BLANK:
                            value = cell.getBooleanCellValue() + "";
                            break;
                        case HSSFCell.CELL_TYPE_ERROR:
                            value = cell.getErrorCellValue() + "";
                            break;
                        }
                        System.out.println(value);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
cs


엑셀 파일을 생성하여 셀에 값 삽입하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
        HSSFWorkbook workbook = new HSSFWorkbook(); // 새 엑셀 생성
        HSSFSheet sheet = workbook.createSheet("시트명"); // 새 시트(Sheet) 생성
        HSSFRow row = sheet.createRow(0); // 엑셀의 행은 0번부터 시작
        HSSFCell cell = row.createCell(0); // 행의 셀은 0번부터 시작
        cell.setCellValue("테스트 데이터"); //생성한 셀에 데이터 삽입
        try {
            FileOutputStream fileoutputstream = new FileOutputStream("저장할 경로/이름.xlsx");
            workbook.write(fileoutputstream);
            fileoutputstream.close();
            System.out.println("엑셀파일생성성공");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("엑셀파일생성실패");
        }
cs


위 두 가지를 잘 응용하시면 기존에 있던 엑셀파일을 수정하시거나 새로운 엑셀파일을 생성할 수 있습니다.

아마 2차원 배열을 많이 다뤄보셨다면 엑셀을 다루시는데 큰 어려움은 없으실 것 같습니다.



댓글
  • 프로필사진 후니후니훙 잘보구 가여~ 혹시 서버에 양식을 저장하고 특정 이벤트가 있으면 양식을 가져와서 원하는 데이터를 넣어주고 저장하려고하는데.... 흠.. 방법이 있을까요? 2016.11.24 17:13
  • 프로필사진 박스여우 서버가 어떤서버인지 알 수 있을까요? 보통적으로 서버의 로컬 저장소에 엑셀파일을 저장해 두고 사용하시면 될것 같습니다. 2016.11.24 17:14 신고
  • 프로필사진 고니 TestCase엑셀을 Background에서 불러와서 Pass Fail을 입력하는 동작을하고 싶은데요 혹시방법이있나요~? 2017.01.04 11:33
  • 프로필사진 박스여우 안드로이드에서 말씀하시는건가요? 2017.01.04 18:42 신고
  • 프로필사진 엑셀 소중한 자료 감사합니다~! 2019.04.10 15:15
  • 프로필사진 좋은하루보내세요 잘 보고 갑니다! 혹시 java.lang.module.ResolutionException: Module poi.examples contains package org.apache.poi.xslf.usermodel, module poi.ooxml exports package org.apache.poi.xslf.usermodel to poi.examples 이런 에러는 어떻게 해결하는지 아시나요? 2020.07.29 18:42
댓글쓰기 폼
Total
498,440
Today
22
Yesterday
452
링크
«   2020/10   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함