web-dev-qa-db-fra.com

Formatage des cellules JXL

Comment ajuster automatiquement le contenu d'une cellule à l'aide de l'API JXL?

27
SAK

Je sais que c'est une vieille question à ce stade, mais je cherchais la solution à cela et j'ai pensé la publier au cas où quelqu'un d'autre en aurait besoin.

Taille automatique CellView

Je ne sais pas pourquoi le FAQ ne le mentionne pas, car il existe très clairement dans les documents.

Mon code ressemblait à ceci:

for(int x=0;x<c;x++)
{
    cell=sheet.getColumnView(x);
    cell.setAutosize(true);
    sheet.setColumnView(x, cell);
}

c stocke le nombre de colonnes créées
La cellule n'est qu'un espace réservé temporaire pour l'objet CellView retourné
La feuille est mon objet WriteableSheet

L'Api prévient qu'il s'agit d'une fonction gourmande en processeur, donc elle n'est probablement pas idéale pour les gros fichiers. Mais pour un petit fichier comme le mien (<100 lignes), cela n'a pas pris de temps notable.

J'espère que cela aide quelqu'un.

42
clang1234

La méthode est explicite et commentée:

private void sheetAutoFitColumns(WritableSheet sheet) {
    for (int i = 0; i < sheet.getColumns(); i++) {
        Cell[] cells = sheet.getColumn(i);
        int longestStrLen = -1;

        if (cells.length == 0)
            continue;

        /* Find the widest cell in the column. */
        for (int j = 0; j < cells.length; j++) {
            if ( cells[j].getContents().length() > longestStrLen ) {
                String str = cells[j].getContents();
                if (str == null || str.isEmpty())
                    continue;
                longestStrLen = str.trim().length();
            }
        }

        /* If not found, skip the column. */
        if (longestStrLen == -1) 
            continue;

        /* If wider than the max width, crop width */
        if (longestStrLen > 255)
            longestStrLen = 255;

        CellView cv = sheet.getColumnView(i);
        cv.setSize(longestStrLen * 256 + 100); /* Every character is 256 units wide, so scale it. */
        sheet.setColumnView(i, cv);
    }
}
13
neuro_sys
for(int x=0;x<c;x++)
{
    cell=sheet.getColumnView(x);
    cell.setAutosize(true);
    sheet.setColumnView(x, cell);
}

C'est bien, au lieu de balayer toutes les colonnes. Passez la colonne comme paramètre.

void display(column) 
{ 
    Cell = sheet.getColumnView(column);
    cell.setAutosize(true);
    sheet.setColumnView(column, cell);
}

Ainsi, lorsque vous afficherez votre texte, vous pouvez définir la longueur particulière. Peut être utile pour les énormes fichiers Excel.

6
John

Depuis JExcelApi FAQ

Comment puis-je faire l'équivalent de la "Sélection format/colonne/ajustement automatique" d'Excel?

Il n'y a pas de fonction API pour le faire pour vous. Vous devrez écrire du code qui analyse les cellules de chaque colonne, calcule la longueur maximale, puis appelle setColumnView () en conséquence. Cela vous rapprochera de ce que fait Excel, mais pas exactement. Étant donné que la plupart des polices ont des caractères à largeur variable, pour obtenir la même valeur exacte, vous devez utiliser FontMetrics pour calculer la largeur maximale de chaque chaîne de la colonne. Personne n'a encore publié de code sur la façon de procéder. N'hésitez pas à publier le code sur Yahoo! groupe ou l'envoyer directement à l'auteur FAQ répertorié au bas de cette page.

FontMetrics fait probablement référence à Java.awt.FontMetrics . Vous devriez pouvoir travailler quelque chose avec la méthode getLineMetrics (String, Graphics) que j'aurais cependant.

2
Brian Beckett

La méthode de redimensionnement automatique de CellView ne fonctionne pas pour moi tout le temps. Ma façon de procéder consiste à définir par programme la taille (largeur) de la colonne en fonction de la longueur de données la plus élevée de la colonne. Effectuez ensuite quelques opérations mathématiques.

CellView cv = excelSheet.getColumnView(0);
cv.setSize((highest + ((highest/2) + (highest/4))) * 256);

highest est un entier qui contient la plus longue longueur de données de la colonne.

2
Jemp

la méthode setAutosize () NE FONCTIONNERA PAS si votre cellule contient plus de 255 caractères. Cela est lié à la spécification de la largeur de colonne maximale d'Excel 2003: http://office.Microsoft.com/en-us/Excel-help/Excel-specifications-and-limits-HP005199291.aspx

Vous devrez écrire votre propre méthode de redimensionnement automatique pour gérer ce cas.

1

Essayez cet exemple:

 expandColumns(sheet, 3);

    workbook.write();
    workbook.close();

private void expandColumn(WritableSheet sheet, int amountOfColumns){
    int c = amountOfColumns;
    for(int x=0;x<c;x++)
    {
        CellView cell = sheet.getColumnView(x);
        cell.setAutosize(true);
        sheet.setColumnView(x, cell);
    }
}
0
Leandro P.