Apache POI Excel - comment configurer les colonnes à développer?


102

J'utilise Apache POI APIpour générer excel spreadsheetpour générer des données.

Le problème auquel je suis confronté est que lorsque la feuille de calcul est créée et ouverte, les colonnes ne sont pas développées de sorte qu'un texte long comme le texte au format Date ne s'affiche pas au premier coup d'œil.

Je pourrais simplement double-cliquer sur la bordure de colonne dans Excel pour développer ou faire glisser la bordure pour ajuster la largeur de la colonne, mais il pourrait y avoir plus de 20 colonnes et il n'y a aucun moyen que je veuille le faire manuellement chaque fois que j'ouvre la feuille de calcul :(

J'ai découvert (bien que cela puisse être une mauvaise méthode) groupRow()et je setColumnGroupCollapsed()pourrais peut-être faire l'affaire, mais pas de chance. Peut-être que je l'utilise mal.

Extrait de code d'exemple

        Workbook wb = new HSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        //create sheet
        Sheet sheet = wb.createSheet("masatoSheet");

        //not really working yet.... :(
        //set group for expand/collapse
        //sheet.groupRow(0, 10); //just random fromRow toRow argument values...
        //sheet.setColumnGroupCollapsed(0, true);

        //create row
        Row row = sheet.createRow((short)0);
        //put a cell in the row and store long text data
        row.createCell(0).setCellValue("Loooooooong text not to show up first");

Lorsque cette feuille de calcul est créée, la chaîne «Looooooong text to not show up first» se trouve dans la cellule, mais comme la colonne n'est pas développée, seul «Loooooooo» apparaît.

Comment puis-je le configurer pour que lorsque j'ouvre ma feuille de calcul, la colonne soit déjà développée ???



Vous semblez chercher un moyen d'utiliser POI pour y parvenir. Mais pour le faire simplement dans Excel, sélectionnez la feuille entière et double-cliquez sur la limite d'en-tête de colonne AB. Si vous devez effectuer cette opération sur plusieurs feuilles, une solution codée peut mieux vous servir.
moyenne du

Réponses:


176

Après avoir ajouté toutes vos données à la feuille, vous pouvez appeler autoSizeColumn(int column)votre feuille pour ajuster automatiquement les colonnes à la taille appropriée

Voici un lien vers l' API .

Voir cet article pour plus de références Problème d'ajustement de la taille de cellule Excel à la taille du contenu lors de l'utilisation d'apache poi


8
Je voulais juste souligner que autoSizeColumncela ne s'adapte pas bien et sera très lent si vous avez beaucoup de lignes. J'ai dû faire un peu de piratage et faire quelque chose de similaire à ce qui était suggéré dans cette question .
lbstr

8
Avertissement concernant autoSizeColumn , cela nécessite que java Font soit disponible. Cela ne fait pas partie du java java headless utilisé sur les serveurs et lancera une NullPointerException.
Stephen Dillon

@StephenDillon Une idée de la façon de corriger le pointeur nul pour la configuration de la police?
Veeshal

Le meilleur moyen que nous avons trouvé était de boucler sur chaque ligne du col, de trouver la longueur de caractère la plus longue et de multiplier par x + ajouter un tampon. X utilise des essais et des erreurs pour voir ce qui convient, mais il devrait s'agir d'une largeur moyenne d'un caractère. Sans police, je ne pense pas que vous puissiez vraiment faire les choses correctement, mais nous en sommes assez proches. Sinon, vous pouvez ajouter une macro pour exceller pour le réparer la première fois que l'utilisateur l'ouvre, c'était la meilleure méthode mais nécessite l'activation des macros
Stephen Dillon

46

Conseil: pour que la taille automatique fonctionne, l'appel à sheet.autoSizeColumn(columnNumber)doit être effectué après le remplissage des données dans Excel.

L'appel de la méthode avant de remplir les données n'aura aucun effet.



La réponse fournie ici est liée à Java, alors que le lien fourni dans le commentaire est lié à Android. La réponse fonctionne toujours dans tous les cas Java (à l'exception des JRE Java headless pour lesquels la police java n'est pas disponible).
Unni Kris

merci, j'ai calculé func et utilisé setColumnWidth de la manière suivante: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
user7856586

@ user7856586 pouvez-vous élaborer cette méthode un peu plus en détail pour moi
Mehroz Mustafa

39

Si vous souhaitez dimensionner automatiquement toutes les colonnes d'un classeur, voici une méthode qui pourrait être utile:

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

Je reçois NullPointerExceptionà row.cellIterator(). Est-ce parce que je n'ai aucune valeur dans l'une des cellules?
rakeeee

10

Vous pouvez essayer quelque chose comme ceci:

HSSFSheet summarySheet = wb.createSheet();
summarySheet.setColumnWidth(short column, short width);

Ici les paramètres sont: le numéro de colonne dans la feuille et sa largeur Mais, les unités de largeur sont assez petites, vous pouvez essayer 4000 par exemple.


Bon à savoir merci! Je pense que pour mon objectif, où la chaîne de colonne peut être générée dynamiquement, la méthode de dimensionnement automatique conviendrait au cas.
Meow


5

exemple de code ci-dessous

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("your sheet name");
HSSFRow row = sheet.createRow(0);

cell = row.createCell(0);
cell.setCellValue("A BIG NAME WITH AUTO SIZE FEATURE ENABLED");

// c'est crucial

sheet.autoSizeColumn(0);

// l'argument doit être un numéro de cellule

cell = row.createCell(1);
cell.setCellValue("a big name without auto size feature enabled");

Vérifiez la sortie et devenez fou :)


2
sheet.setColumnWidth (columnIndex, width) est aussi une méthode que vous voulez voir
Mateen

3

Si vous connaissez le nombre de vos colonnes (par exemple, il est égal à une liste de collection). Vous pouvez simplement utiliser cette seule ligne pour ajuster toutes les colonnes d'une feuille (si vous utilisez au moins java 8):

IntStream.range(0, columnCount).forEach((columnIndex) -> sheet.autoSizeColumn(columnIndex));

1

J'utilise ci-dessous une solution simple:

Voici votre classeur et votre feuille:

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("YOUR Workshhet");

puis ajoutez des données à votre feuille avec des colonnes et des lignes. Une fois terminé, ajoutez des données à la feuille, écrivez le code suivant sur la autoSizeColumnlargeur.

for (int columnIndex = 0; columnIndex < 15; columnIndex++) {
                    sheet.autoSizeColumn(columnIndex);
                }

Ici, au lieu de 15, vous ajoutez le nombre de colonnes dans votre feuille.

J'espère que quelqu'un aide ça.


0

C'est très simple, utilisez ce code d'une ligne dataSheet.autoSizeColumn (0)

ou indiquez le nombre de colonnes entre parenthèses dataSheet.autoSizeColumn (numéro de cellule)


0

Vous pouvez également envelopper le texte. Exemple de code PFB:

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.