티스토리 뷰
프로그래밍/JAVA
(Java)Apache Poi 사용시 "The maximum number of Cell Styles was exceeded.." 이슈 해결법
rlawlstjd007 2020. 8. 8. 10:24들어가며
- Apache Poi를 사용하여 Exel Write 기능을 구현하는 중에 아래와 같은 에러가 발생했다.
- 대충 상황을 살펴보니 cell styling 기능을 사용하는데 이때 Style을 적용하는 Cell이 너무 많다는 의미인 것 같았다.
The maximum number of Cell Styles was exceeded. You can define up to 64000 style in a .xlsx Workbook
java.lang.IllegalStateException: The maximum number of Cell Styles was exceeded. You can define up to 64000 style in a .xlsx Workbook
at org.apache.poi.xssf.model.StylesTable.createCellStyle(StylesTable.java:831)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.createCellStyle(XSSFWorkbook.java:754)
at com.jinseong.soft.util.FileIOUtil.writeExcelFile(FileIOUtil.java:62)
at com.jinseong.soft.service.MainService.start(MainService.java:123)
at com.jinseong.soft.Application.main(Application.java:24)
원인
- 검색을 통해서 보니 workbook으로 부터 생성하는 CellStyle 인스턴스가 너무 많아지는 상황에서 라이브러리 자체에서 에러를 발생시키는 것 같았다.
- 실제로 코드를 보면 아래와 같이 setStyle 메서드를 호출 할때마다 workBook에서 CellStyle 인스턴스를 생성하고 있었다.
- 결과적으로 64000개 이상의 Cell에 대해서 해당 작업이 일어나고 있었다.
private void createCell() {
XSSFWorkbook workbook = new XSSFWorkbook();
Cell cell;
//Cell 하나당 CellStyle 객체 하나
setStyle(cell, workbook.createCellStyle());
}
private void setStyle(Cell cell, XSSFCellStyle style) {
style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setCellStyle(style);
}
해결방법
- 해결된 코드는 아래와 같다. 어차피 적용되는 CellStyle은 한정적이다. (예제에서는 하나의 스타일만 생성함)
- 그렇기 때문에 CellStyle을 미리 생성해두고 해당 인스턴스를 재사용하는 방법으로 해결하였다.
- 예제가 적절하지 않을 수도 있을 것 같다.
- 그렇기 때문에 여기서 중요한 건 CellStyle 객체를 재사용한다는 것이다.
private void createCell() {
XSSFWorkbook workbook = new XSSFWorkbook();
//CellStyle을 미리 생성
XSSFCellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
Cell cell;
setStyle(cell, style);
}
private void setStyle(Cell cell, XSSFCellStyle style) {
cell.setCellStyle(style);
}
관련글
반응형
'프로그래밍 > JAVA' 카테고리의 다른 글
(Java) Key, Mouse Hooking(리스너) 기능 구현 방법 (0) | 2020.08.10 |
---|---|
[Java] Video URL 다운로드 시에 전체 다운로드 되지 않는 경우 해결방법 (0) | 2020.08.09 |
[Java] PNG 파일에 Meta 데이터 추가하는 방법 (0) | 2020.08.07 |
[Java] URL로 부터 File Download 하는 방법 (0) | 2020.08.05 |
[Java] 스트림 슬라이싱 (0) | 2020.08.04 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- springboot
- 자바
- 이펙티브자바
- 방통대 과제물
- 이펙티브
- Java UI
- 스프링부트
- JavaFX 테이블뷰
- 일본 여행
- intelij
- JavaFX
- windows
- 이펙티브 자바
- JavaFX Table View
- JavaFX 종료
- 일본 자전거 여행
- 인텔리제이
- git
- java
- 일본여행
- TableView
- effective java
- JavaFX Window Close
- 텐트
- 자전거 여행
- 일본 배낭여행
- 배낭 여행
- effectivejava
- 배낭여행
- 자전거
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함