web-dev-qa-db-fra.com

Comment accélérer le dimensionnement automatique des colonnes dans Apache POI?

J'utilise le code suivant afin de redimensionner automatiquement les colonnes de ma feuille de calcul:

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

Le problème est qu'il faut plus de 10 minutes pour redimensionner automatiquement chaque colonne en cas de grandes feuilles de calcul avec plus de 3000 lignes. Cela va très vite pour les petits documents. Y a-t-il quelque chose qui pourrait aider le dimensionnement automatique à fonctionner plus rapidement?

22
antken

Solution qui a fonctionné pour moi:

Il était possible d'éviter les régions fusionnées, je pouvais donc parcourir les autres cellules et enfin redimensionner automatiquement la cellule la plus grande comme ceci:

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

où 1,14388 est une largeur maximale de caractères de la police "Serif" et 256 unités de police.

Les performances du dimensionnement automatique sont passées de 10 minutes à 6 secondes.

33
antken

La fonction autoSizeColumn elle-même ne fonctionne pas parfaitement et certaines largeurs de colonnes ne correspondent pas exactement aux données à l'intérieur. J'ai donc trouvé une solution qui fonctionne pour moi.

  1. Pour éviter des calculs fous, donnons cela à la fonction autoSizeColumn ():
   sheet.autoSizeColumn(<columnIndex>);
  1. Maintenant, notre colonne est redimensionnée automatiquement par bibliothèque, mais nous n'avons pas l'habitude d'ajouter un peu plus à la largeur de la colonne actuelle pour que le tableau semble bien:
   // 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. La fonction complète pourrait ressembler à:
   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. Merci Ondrej Kvasnovsky pour la fonction https://stackoverflow.com/a/35324693/13087091

1