아주 심플하게, 회사에서 해당 문서규격(xls/xlsx/doc/docx)에 대해 텍스트를 추출하는것이 필요했다. 일전에는 잠깐 해보았는데, 정리된 적이 없었고 이번을 계기로 좀 알게된 몇가지 사실들이 있기에 간단하게 기록해본다.
일단 메이븐에서 다음과 같이 라이브러리를 잡아준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
|
cs |
1. 워드 (doc/docx) 텍스트 추출
워드 2003 이전버전인 doc 와 이후 버전인 docx 를 추출하기 위해서는 두 가지만 기억하면 된다.
HWPFDocument 클래스는 Horrible Word Process Format 의 약자라는 점이며, poi 라이브러리만 상속받는것이 아닌 poi-scratchpad 라이브러리를 같이 상속받아야 한다. 즉, poi dependency만 잡아놓으면 HWPFDocument가 import 되지 않는다!
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
|
/*
* Word 2003 doc File Text Extraction Example
*/
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
// 중략
try {
POIFSFileSystem poiFS = new POIFSFileSystem(
new FileInputStream("/Users/kimfish/DEV/java_workspace/"+"/test.doc"));
HWPFDocument hwp = new HWPFDocument(poiFS);
WordExtractor we = new WordExtractor(hwp);
String[] paragraphs = we.getParagraphText();
System.out.println("===== doc text extractor ======");
for (int i = 0; i < paragraphs.length; i++) {
System.out.println(paragraphs[i]);
}
} catch (Exception e) {
System.out.println(e);
}
|
cs |
docx 파일은 XWPFDocument를 import 받으며, docx의 text추출을 위해서는 poi 및 poi-ooxml 라이브러리에 대한 dependency가 필요하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/*
* Word 2007 docx File Text Extraction Example
*/
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
// 중략
try(
FileInputStream fis = new FileInputStream
("/Users/kimfish/DEV/py_workspace/"+"/test.docx")) {
XWPFDocument file = new XWPFDocument(OPCPackage.open(fis));
XWPFWordExtractor ext = new XWPFWordExtractor(file);
System.out.println("===== docx text extractor ======");
System.out.println(ext.getText());
}catch(Exception e) {
System.out.println(e);
}
|
cs |
2. 엑셀 (xls/xlsx) 텍스트 추출
엑셀은 고려할 점이 상당히 많은데 각 셀/로우 별 텍스트 및 쉬트도 있는데다가 수식까지 가지고 있다. 현재는 샘플 토이 프로젝트라 수식이나 셀/로우 구분없이 텍스트만 가져오기를 수행해보았는데 일단 첫 쉬트에서는 잘 가져오고 있는듯. 좀 더 정교한 작업이 필요할 경우엔 공식 document 가 필요할것으로 보인다.
엑셀 2003 이전버전인 xls 같은 경우에는 poi Dependency 하나로도 잘 작동한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/*
* Excel 2003 xls File Text Extraction Example
*/
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
// 중략
try (
FileInputStream fis = new FileInputStream("/Users/kimfish/DEV/java_workspace/"+"/test.xls")) {
String result = "";
HSSFWorkbook wb = new HSSFWorkbook(fis);
ExcelExtractor ee = new ExcelExtractor(wb);
result = ee.getText();
System.out.println("===== xls text extractor =====");
System.out.println(result);
} catch (Exception e) {
//TODO: handle exception
}
|
cs |
하지만 엑셀 2007 버전인 xlsx 같은 경우에는 워드2007과 마찬가지로 poi / poi-ooxml dependency 둘 다 필요하다.
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
|
/*
* Excel 2007 xlsx File Text Extraction Example
*/
import org.apache.poi.xssf.extractor.XSSFExcelExtractor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
// 중략
try (
FileInputStream fis = new FileInputStream("/Users/kimfish/DEV/py_workspace/"+"/test.xlsx")) {
// Workbook
XSSFWorkbook wb = new XSSFWorkbook(fis);
// Text Extraction
XSSFExcelExtractor extractor = new XSSFExcelExtractor(wb);
extractor.setFormulasNotResults(true);
extractor.setIncludeSheetNames(false);
System.out.println("===== xlsx text extractor =====");
System.out.println( extractor.getText() );
} catch (Exception e) {
//TODO: handle exception
}
|
cs |
일단은 이렇게 해서 정상적으로 출력되는것을 확인함. 어휴 poi 하나로 다 해놓든가 의존성을 걸어두던가. 왜 poi / poi-ooxml / poi-scratchpad 이렇게 세 개가 죄다 쪼개져있는지원;;
정리
xlsx - poi / poi-ooxml
xls - poi
docx - poi / poi-ooxml
doc - poi / poi-scratchpad
'어장 Develop > 어장 JAVA' 카테고리의 다른 글
[hwplib] hwplib을 이용한 한글파일 텍스트 추출 (1) | 2022.07.06 |
---|---|
[PDFBox] pdf 텍스트 추출 (0) | 2022.07.05 |
[Tomcat 9.x] JNDI설정 (0) | 2022.02.21 |
[PDFBox] java Image to PDF (0) | 2021.08.24 |
[xml] RestAPI XML Return (2) (0) | 2021.07.06 |