web-dev-qa-db-ja.com

Apache POIで列の自動サイズ設定を高速化するにはどうすればよいですか?

スプレッドシートの列のサイズを自動調整するには、次のコードを使用します。

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

問題は、3000行を超える大きなスプレッドシートの場合、各列の自動サイズ調整に10分以上かかることです。小さなドキュメントでも非常に高速です。自動サイズ設定をより速く機能させるのに役立つものはありますか?

22
antken

私のために働いた解決策:

マージされた領域を回避することができたので、他のセルを反復処理して、最終的に次のように最大のセルに自動サイズ調整できます。

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

ここで1.14388は、「Serif」フォントと256フォント単位の最大文字幅です。

自動サイズ調整のパフォーマンスが10分から6秒に向上しました。

33
antken

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));
                }
            }
        }
    }

追伸ありがとう Ondrej Kvasnovsky 関数 https://stackoverflow.com/a/35324693/13087091