How to speed up autosizing columns in apache POI?

前端 未结 2 1938
温柔的废话
温柔的废话 2020-12-25 12:51

I use the following code in order to autosize columns in my spreadsheet:

for (int i = 0; i < columns.size(); i++) {
   sheet.autoSizeColumn(i, true);
   s         


        
相关标签:
2条回答
  • 2020-12-25 13:20

    The autoSizeColumn function itself works not perfect and some columns width not exactly fit the data inside. So, I found some solution that works for me.

    1. To avoid crazy calculations let give that to autoSizeColumn() function:
       sheet.autoSizeColumn(<columnIndex>);
    
    1. Now, our column autosized by library but we wont to add a little bit more to the current column width to make table looks fine:
       // get autosized column width
       int currentColumnWidth = sheet.getColumnWidth(<columnIndex>);
    
       // add custom value to the current width and apply it to column
       sheet.setColumnWidth(<columnIndex>, (currentColumnWidth + 2500));
    
    1. The full function could looks like:
       public void autoSizeColumns(Workbook workbook) {
            int numberOfSheets = workbook.getNumberOfSheets();
            for (int i = 0; i < numberOfSheets; i++) {
                Sheet sheet = workbook.getSheetAt(i);
                if (sheet.getPhysicalNumberOfRows() > 0) {
                    Row row = sheet.getRow(sheet.getFirstRowNum());
                    Iterator<Cell> cellIterator = row.cellIterator();
                    while (cellIterator.hasNext()) {
                        Cell cell = cellIterator.next();
                        int columnIndex = cell.getColumnIndex();
                        sheet.autoSizeColumn(columnIndex);
                        int currentColumnWidth = sheet.getColumnWidth(columnIndex);
                        sheet.setColumnWidth(columnIndex, (currentColumnWidth + 2500));
                    }
                }
            }
        }
    

    P.S. Thanks Ondrej Kvasnovsky for the function https://stackoverflow.com/a/35324693/13087091

    0 讨论(0)
  • 2020-12-25 13:35

    Solution which worked for me:

    It was possible to avoid merged regions, so I could iterate through the other cells and finally autosize to the largest cell like this:

    int width = ((int)(maxNumCharacters * 1.14388)) * 256;
    sheet.setColumnWidth(i, width);
    

    where 1.14388 is a max character width of the "Serif" font and 256 font units.

    Performance of autosizing improved from 10 minutes to 6 seconds.

    0 讨论(0)
提交回复
热议问题