Java 엑셀 파일 읽고 쓰는 라이브러리 Apache POI

앞으로 자바에서 쓰이는 라이브러리들을 알아가는 대로 예제를 보면서 작성할 예정이다.

그 첫번째로 apache 오픈소스 라이브러리인 apache POI 이다.

아파치 POI(Apache POI)는 아파치 소프트웨어 재단에서 만든 라이브러리로서 마이크로소프트 오피스 파일 포맷을 순수 자바) 언어로서 읽고 쓰는 기능을 제공한다. 주로 워드, 엑셀, 파워포인트와 파일을 지원하며 최근의 오피스 포맷인 Office Open XML File Formats [1] (OOXML, 즉 xml 기반의 .docx, .xlsx, *.pptx 등) 이나 아웃룩, 비지오, 퍼블리셔 등으로 지원 파일 포맷을 늘려가고 있다.

위키백과

공식사이트 는 여기이고 들어가보면 왼쪽 메뉴에 Component API 를 들어가서 Quick Guide 부분을 살펴보면 굉장히 설명이 잘 되어있다.

필요한 부분을 찾아서 사용하면 될 것 같다. 물론 영어긴 한데 천천히 하면 되지 않을까…싶다.

예제를 작성하기 전에 라이브러리를 다운 받아야 한다. 다운로드 주소

maven repository

위 화면에서 2개가 있는데 첫번째 꺼는 엑셀 2007 이전 버전일 때 사용하고 다음 꺼는 엑셀 2007버전 이후를 read나 write할때 사용된다.

(2007 버전 전후로 확장자가 xls, xlsx 로 바뀌었다. xlsx가 2007 이후 버전이다.)

직접 프로젝트에 라이브러리를 다운 받아서 넣어줘도되고 maven을 사용한다면 dependency를 추가해주면 된다. 나는 maven에 추가했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>

</dependencies>

엑셀 Write

바로 예제를 들어가보면 첫번째로 특정위치에 엑셀 파일을 생성하는 예제이다. 웹으로 생각해보면 어떤 그리드 화면에서 데이터를 입력하고 저장을 누르거나 완료 버튼을 누르면 엑셀 파일로 저장되는 부분이라고 생각(?)하면 될 것 같다. 응용해서 만들어보면 될 것 같다. 이 예제에서는 Java코드에서 바로 데이터를 넣어주었다.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class ApachePOIExcelWrite {

private static final String FILE_NAME = "/Users/sskim/Downloads/POI_Excel_Example.xlsx";

public static void main(String[] args) {


XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Datatypes in Java"); //sheet생성

Object[][] datatypes = { //엑셀 셀 데이터
{"Datatype", "Type", "Size(in bytes)"},
{"int", "Primitive", 2},
{"float", "Primitive", 4},
{"double", "Primitive", 8},
{"char", "Primitive", 1},
{"String", "Non-Primitive", "No fixed size"}
};

int rowNum = 0; //열
System.out.println("Creating excel");

for (Object[] datatype : datatypes) {
Row row = sheet.createRow(rowNum++); //열 생성
int colNum = 0; //행
for (Object field : datatype) {
Cell cell = row.createCell(colNum++); //Cell은 데이터 넣는 엑셀의 셀 부분을 생각하면된다.
if (field instanceof String) {
cell.setCellValue((String) field);
} else if (field instanceof Integer) {
cell.setCellValue((Integer) field);

}
}
}

try {
FileOutputStream outputStream = new FileOutputStream(FILE_NAME);
workbook.write(outputStream);
workbook.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

System.out.println("Done");
}
}

결과화면

엑셀 Read

엑셀 Write와 비슷하게 웹에서 생각해보면 엑셀 업로드 기능같은게 있을 때 활용할 수 있을 것 같다.

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
34
35
36
37
38
39
40
41
42
public class ApachePOIExcelRead {

private static final String FILE_NAME = "/Users/sskim/Downloads/POI_Excel_Example.xlsx";

public static void main(String[] args) {

try {
//엑셀파일 위치 읽어들임
FileInputStream excelFile = new FileInputStream(new File(FILE_NAME));
//엑셀파일을 위치 넣어줌
Workbook workbook = new XSSFWorkbook(excelFile);
//0번째 sheet를 불러옴
Sheet datatypeSheet = workbook.getSheetAt(0);
//열 반복자 생성
Iterator<Row> rowIterator = datatypeSheet.iterator();

while (rowIterator.hasNext()) {

//열이 hasNext() 끝날때까지 반복하면서 현재 열을 얻음.
Row currentRow = rowIterator.next();
//현재 열의 Cell 즉 엑셀 시트의 데이터 입력 부분 셀을 얻음.
Iterator<Cell> cellIterator = currentRow.iterator();

while (cellIterator.hasNext()) {
//해당 셀을 반복
Cell currentCell = cellIterator.next();
if (currentCell.getCellTypeEnum() == CellType.STRING) {
System.out.print(currentCell.getStringCellValue()+"\t\t\t\t");
} else if (currentCell.getCellTypeEnum() == CellType.NUMERIC) {
System.out.print(currentCell.getNumericCellValue()+"\t\t\t\t");
}
}
System.out.println();
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

출처

Share