web-dev-qa-db-fra.com

Taille de taille automatique pour les lignes dans Apache POI

J'entre des valeurs dans une feuille de calcul à l'aide d'Apache POI. Ces valeurs ont des sauts de ligne, et j'ai pu utiliser ce code avec succès:

CellStyle style = cell.getCellStyle()
style.setWrapText(true)
cell.setCellStyle(style)

Malheureusement, alors que le texte est correctement encapsulé, les lignes n'augmentent pas toujours suffisamment en hauteur pour afficher le contenu. Comment puis-je m'assurer que mes rangées ont toujours la bonne hauteur?

33
user1007895
currentRow.setHeight((short)-1)

Fonctionne pour XSSFCell et Excel 2013

20
Franz Frühwirth
HSSFWorkbook workbook=new HSSFWorkbook();
HSSFSheet sheet =  workbook.createSheet("FirstSheet");  
HSSFRow rowhead=   sheet.createRow((short)0);
HSSFCellStyle style = workbook.createCellStyle();
style.setWrapText(true);
row.setRowStyle(style);
row.getCell(0).setCellStyle(style);

Le code ci-dessus générera une hauteur dynamique des lignes.

18
Vinil Vijayan

La seule façon de le faire fonctionner était d'écrire ma propre implémentation pour calculer la hauteur de ligne. Le code est maintenant publié en tant que projet Taro , vous pouvez donc l'utiliser. Il a de nombreuses méthodes pratiques pour vous permettre d'écrire un fichier Excel dans beaucoup moins de lignes de code.

Si vous préférez mettre l'implémentation dans votre propre code, vous pouvez la trouver dans la classe SpreadsheetTab . Il existe une méthode autoSizeRow (int rowIndex) à mi-chemin. Il itère essentiellement sur la ligne et pour chaque cellule trouve le nombre de lignes de texte, puis utilise la taille de police pour calculer la hauteur de cellule optimale. Il définit ensuite la hauteur de ligne à la hauteur de la cellule la plus haute.

5
JMB

Voir tout ce lien , qui fournit un code pour calculer manuellement la hauteur correcte pour une ligne, en fonction de la largeur de la colonne et du contenu des cellules. Je ne l'ai pas testé personnellement. Également collé ci-dessous pour plus de commodité:

// Create Font object with Font attribute (e.g. Font family, Font size, etc) for calculation
Java.awt.Font currFont = new Java.awt.Font(fontName, 0, fontSize);
AttributedString attrStr = new AttributedString(cellValue);
attrStr.addAttribute(TextAttribute.FONT, currFont);

// Use LineBreakMeasurer to count number of lines needed for the text
FontRenderContext frc = new FontRenderContext(null, true, true);
LineBreakMeasurer measurer = new LineBreakMeasurer(attrStr.getIterator(), frc);
int nextPos = 0;
int lineCnt = 0;
while (measurer.getPosition() < cellValue.length())
{
    nextPos = measurer.nextOffset(mergedCellWidth); // mergedCellWidth is the max width of each line
    lineCnt++;
    measurer.setPosition(nextPos);
}

Row currRow = currSht.getRow(rowNum);
currRow.setHeight((short)(currRow.getHeight() * lineCnt));

// The above solution doesn't handle the newline character, i.e. "\n", and only
// tested under horizontal merged cells.
4
GreenGiant

Vous ne pouvez pas régler directement la hauteur des cellules. Mais vous pouvez changer la hauteur de la ligne

final HSSFSheet fs = wb.createSheet("sheet1");
final HSSFRow row0 = fs.createRow(0);
final HSSFCell cellA1 = row0.createCell(0);
row0.setHeight((short)700);
3
Arthur
cell.getRow().setHeight((short) -1);

A travaillé pour HSSFCell dans Apache poi 3.9 ou supérieur

1
Miller Cy Chan

Cela fonctionne dans Excel 2010. J'ai défini la limite de longueur de cellule de 50 caractères

    Row row = sheet.createRow(0);
    CellStyle style = workbook.createCellStyle();
    style.setWrapText(true);
    if (data.length() > 50) {
        for (int i = 1; i <= Math.abs(data.length() / 50); i++) {
            data = data.substring(0, i * 50) + "\n" + data.substring(i * 50);
        }
        Cell cell = row.createCell(0);
        row.setRowStyle(style);
        cell.setCellStyle(style);
        cell.setCellValue(data);
        sheet.autoSizeColumn(0);
    }
1
Valery Tarasenko

Row aitosize travaille pour moi:

cell.getRow().setHeight((short)0);

Ici 0 pour calculer la hauteur automatique.

0
Michael Kazarian