티스토리 뷰

들어가며

  • 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] Apache poi 사용시 "Zip bomb detected.." 에러 발생시 해결법

들어가며 Apache poi를 사용하여 Exel write 기능을 구현하는데 아래와 같은 에러가 발생하면서 실패하였다. Zip bomb detected! The file would exceed the max. ratio of compressed file size to the size of t..

jinseongsoft.tistory.com

 

JAVA 엑셀 파일 불러오기

Java 엑셀 파일 불러오기  이번 시간에는 Java 에서 엑셀 파일을 불러와 데이터를 가져오는 방법에 대해서 알아보겠습니다. 우선 엑셀파일을 준비하시구요  저는 이 파일을 사용하겠습니다.  우�

jinseongsoft.tistory.com

 

반응형
댓글