web-dev-qa-db-fra.com

Définition de la largeur de colonne dans les points d'intérêt Apache

J'écris un outil en Java en utilisant Apache POI API pour convertir un fichier XML en MS Excel. Dans mon entrée XML, je reçois la largeur de la colonne en points. Mais l'API POI Apache a une apparence légèrement étrange. logique pour définir la largeur de la colonne en fonction de la taille de la police, etc. (voir documentation de l'API )

Existe-t-il une formule pour convertir les points en largeur comme prévu par Excel? Est-ce que quelqu'un a déjà fait ça?

Il existe cependant une méthode setRowHeightInPoints() :( mais aucune pour la colonne.

P.S .: Le XML d'entrée est au format ExcelML que je dois convertir en MS Excel.

54
Arun

Malheureusement, il n’ya que la fonction setColumnWidth (int columnIndex, int width) à partir de class Sheet; dans lequel width correspond à un nombre de caractères dans de la police standard (première police du classeur) si vos polices changent, vous ne pouvez pas l'utiliser. Il est expliqué comment calculer la largeur en fonction d’une taille de police. La formule est la suivante:

width = Truncate([{NumOfVisibleChar} * {MaxDigitWidth} + {5PixelPadding}] / {MaxDigitWidth}*256) / 256

Vous pouvez toujours utiliser autoSizeColumn(int column, boolean useMergedCells) après avoir saisi les données dans votre Sheet.

90
ArtiBucco

S'il vous plaît soyez prudent avec l'utilisation de autoSizeColumn(). Il peut être utilisé sans problème sur de petits fichiers, mais veillez à ce que la méthode ne soit appelée qu'une fois (à la fin) pour chaque colonne et non à l'intérieur d'une boucle, ce qui n'aurait aucun sens.

Veuillez éviter d'utiliser autoSizeColumn() sur des fichiers Excel volumineux. La méthode génère un problème de performance.

Nous l'avons utilisé sur un fichier de 110 000 lignes/11 colonnes. La méthode a pris ~ 6m pour redimensionner automatiquement toutes les colonnes.

Pour plus de détails, consultez: Comment accélérer la création automatique de colonnes dans les POI Apache?

20
Arthur bauer

Vous pouvez également utiliser les méthodes util mentionnées dans ce blog: Obtenir la taille et la hauteur de cellule dans Excel avec Apache POI . Cela peut résoudre votre problème.

Copier et coller depuis ce blog:

public class PixelUtil {

  public static final short Excel_COLUMN_WIDTH_FACTOR = 256; 
  public static final short Excel_ROW_HEIGHT_FACTOR = 20; 
  public static final int UNIT_OFFSET_LENGTH = 7; 
  public static final int[] UNIT_OFFSET_MAP = new int[] { 0, 36, 73, 109, 146, 182, 219 };

  public static short pixel2WidthUnits(int pxs) {
    short widthUnits = (short) (Excel_COLUMN_WIDTH_FACTOR * (pxs / UNIT_OFFSET_LENGTH)); 
    widthUnits += UNIT_OFFSET_MAP[(pxs % UNIT_OFFSET_LENGTH)];  
    return widthUnits; 
  } 

  public static int widthUnits2Pixel(short widthUnits) {
    int pixels = (widthUnits / Excel_COLUMN_WIDTH_FACTOR) * UNIT_OFFSET_LENGTH; 
    int offsetWidthUnits = widthUnits % Excel_COLUMN_WIDTH_FACTOR; 
    pixels += Math.floor((float) offsetWidthUnits / ((float) Excel_COLUMN_WIDTH_FACTOR / UNIT_OFFSET_LENGTH));   
    return pixels; 
  }

  public static int heightUnits2Pixel(short heightUnits) {
    int pixels = (heightUnits / Excel_ROW_HEIGHT_FACTOR); 
    int offsetWidthUnits = heightUnits % Excel_ROW_HEIGHT_FACTOR; 
    pixels += Math.floor((float) offsetWidthUnits / ((float) Excel_ROW_HEIGHT_FACTOR / UNIT_OFFSET_LENGTH));   
    return pixels; 
  }

}

Ainsi, lorsque vous souhaitez obtenir la largeur et la hauteur d'une cellule, vous pouvez l'utiliser pour obtenir une valeur en pixels. Les valeurs sont approximativement .

PixelUtil.heightUnits2Pixel((short) row.getHeight())
PixelUtil.widthUnits2Pixel((short) sh.getColumnWidth(columnIndex));
11
lu_ko

Avec Scala il y a un bel emballage spoiwo

Vous pouvez le faire comme ça:

Workbook(mySheet.withColumns(
      Column(autoSized = true),
      Column(width = new Width(100, WidthUnit.Character)),
      Column(width = new Width(100, WidthUnit.Character)))
    )
2
pme

J'ai répondu à mon problème avec une largeur par défaut pour toutes les colonnes et cellules, comme ci-dessous:

int width = 15; // Where width is number of caracters 
sheet.setDefaultColumnWidth(width);
1
Sham Fiorin