如何加快apache POI中列的自动调整大小?

2022-09-01 12:57:53

我使用以下代码来自动调整电子表格中的列大小:

for (int i = 0; i < columns.size(); i++) {
   sheet.autoSizeColumn(i, true);
   sheet.setColumnWidth(i, sheet.getColumnWidth(i) + 600);
}

问题是,在包含超过3000行的大型电子表格的情况下,自动调整每列的大小需要10分钟以上。不过,对于小文档来说,它的速度非常快。有什么可以帮助自动调整大小以更快地工作吗?


答案 1

对我有用的解决方案:

可以避免合并区域,因此我可以循环访问其他单元格,并最终自动调整到最大的单元格,如下所示:

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

其中 1.14388 是“衬线”字体和 256 个字体单位的最大字符宽度。

自动调整大小的性能从 10 分钟提高到 6 秒。


答案 2

autoSizeColumn 函数本身工作不完美,某些列宽不完全适合其中的数据。因此,我找到了一些适合我的解决方案。

  1. 为了避免疯狂的计算,让我们把它交给autoSizeColumn()函数:
   sheet.autoSizeColumn(<columnIndex>);
  1. 现在,我们的列按库自动调整大小,但我们不会向当前列宽添加更多内容以使表格看起来很好:
   // 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. 完整函数可能如下所示:
   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. 感谢 Ondrej Kvasnovsky 的功能 https://stackoverflow.com/a/35324693/13087091


推荐