Notice
Recent Posts
Archives
Today
Total
«   2024/09   »
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
Recent Comments
관리 메뉴

우당탕탕 개발일지

[JAVA] POI 를 이용하여 .xlsx 관리하기 - Read 본문

Java

[JAVA] POI 를 이용하여 .xlsx 관리하기 - Read

devchop 2023. 7. 5. 00:10

2023/07/05

아파치 소프트웨어에서 엑셀파일을 다룰 수 있도록 만든 라이브러리 이다. 우선 라이브러리를 다운로드 (bin 으로 다운받아야함)

링크 ; https://poi.apache.org/devel/

 

Apache POI - How To Build

<!--+ |breadtrail +--> <!--+ |start Menu, mainarea +--> <!--+ |start Menu +--> <!--+ |end Menu +--> <!--+ |start content +--> Apache POI - How To Build JDK Version POI 4.0 and later require JDK version 1.8 or later. POI 3.11 and later 3.x versions require

poi.apache.org

프로젝트 마우스 우클릭 > Build Path > Configure build path > Libraries > Add External JARs 를 클릭한뒤  다운받았던(압축해제는 당연히.) jar파일을 넣어준다. 여기서 jar의 위치는 classPath 여야하며, 밖에나와있는 jar 뿐만 아니라 ooxml-lib폴더, lib 폴더 안에 있는 jar 까지 모두 임포트해준다.

 

POI 에서 제공하는 workbook의 버전은 총 3가지이다.

1. HSSF : excel 2007 하위버전 파일 포맷을 사용할때

2. XSSF : excel 2007 파일 포맷을 사용할때 . 읽을때 엑셀 전체를 메모리에 올리기 때문에 대용량 파일을 XSSF로 로드하려 하면 out of memory exception 이 발생할 수 있음. 읽기/ 쓰기 모두 가능

3. SXSSF : 대용량 엑셀파일을 사용할때 . 쓰기만 가능

 

나의 경우 현재 몇십만 개의 데이터는 사용하지 않을 것이므로 xssf를 활용하도록 한다.

 

에러발생..

.org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]

이 에러는 엑셀파일이 손상되었거나 잠겨있을 경우에 이렇게 된다고 한다 . 구글링을 해보니 .xlsx 의 경우 XSSF를 , .xls 일 경우에는 HSSF를 사용해야 한다고 한다.

 

수정본 )

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
package taxaide;
import java.io.FileInputStream;
import java.io.IOException;
 
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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 XlsxReader
{
    
    public static void ReadXlsx(String filePath ) 
    {
        try 
        {
            
            var fs = new FileInputStream(filePath); 
            if (filePath.endsWith("xlsx")) ParseXSSF(fs);
            else if (filePath.endsWith("xls")) ParseHSSF(fs);
                
        }
        catch (Exception e) {
            System.out.println("exception ."+e.getMessage());
        }
    }
    
 
    static void ParseXSSF(FileInputStream fs) throws IOException
    {
        var workbook = new XSSFWorkbook(fs);
    }
    
    static void ParseHSSF(FileInputStream fs) throws IOException
    {
        var workbook = new HSSFWorkbook(fs);
    }
        
}
 
cs

다음과 같이 받은 파일의 확장자명을 확인해서 다르게 처리해주어야한다.