Comment ajuster automatiquement le contenu d'une cellule à l'aide de l'API JXL?
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.
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.
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);
}
}
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.
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.
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);
où highest
est un entier qui contient la plus longue longueur de données de la colonne.
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.
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);
}
}