Kotlin

Apache POI sheet.autoSizeColumn() Speed Up

RxCats 2023. 8. 8. 09:01

문제

Ajax 를 이용하여 300건 정도의 데이터를 Apache POI 를 이용하여 엑셀 파일 생성 중 Ajax timeout 을 10초로 해 두었는데 timeout 이 발생하여 원인을 확인한 결과 sheet.autoSizeColumn() 함수 처리에 시간이 오래 걸리는 현상을 발견

 

해결방법

row 마다 컬럼의 문자열 길이를 이용하여 너비를 가중치를 이용하여 늘려주는 방식

문자열 길이 최대 70 까지만 적용되도록 함 ( 문자열 길이가 너무 길어지면 너비가 너무 커짐 방지 )

    fun setColumnSize(sheet: XSSFSheet, index: Int, value: String) {
        val defaultColumnWidth = 2048
        val maxLength = 70
        val characterWidth = 256
        val lengthWeight = 1.14388
        val len = if (value.length >= maxLength) maxLength else value.length
        val adjust = ((len * lengthWeight).toInt() * characterWidth) + defaultColumnWidth

        val columnWidth = sheet.getColumnWidth(index)
        if (columnWidth > adjust) return

        try {
            sheet.setColumnWidth(index, adjust)
        } catch (e: Exception) {
            // ignore
        }
    }