web-dev-qa-db-ja.com

Apache POIで列幅を設定する

Apache POI APIを使用してXMLをMS Excelに変換するツールをJavaで作成しています。XML入力では、列幅をポイント単位で受け取ります。しかし、Apache POI APIには少し奇妙なフォントサイズなどに基づいて列幅を設定するためのロジック( APIドキュメント を参照)

Excelで期待されるようにポイントを幅に変換するための式はありますか?誰もこれをやったことがありますか?

setRowHeightInPoints()メソッドがあります:(ただし、列にはありません)。

追伸:入力XMLはExcelML形式で、MS Excelに変換する必要があります。

54
Arun

残念ながら、関数はありません setColumnWidth(int columnIndex、int width) from _class Sheet_;幅は標準フォント(ワークブックの最初のフォント)の文字数です。フォントが変更されている場合は使用できません。フォントサイズの関数で幅を計算する方法が説明されています。式は次のとおりです。

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

Sheetにデータを入力した後は、常に autoSizeColumn(int column, boolean useMergedCells) を使用できます。

90
ArtiBucco

autoSizeColumn()の使用には注意してください。小さなファイルでは問題なく使用できますが、メソッドは各列に対して一度だけ(最後に)呼び出され、意味のないループ内では呼び出されないことに注意してください。

大きなExcelファイルではautoSizeColumn()を使用しないでください。このメソッドはパフォーマンスの問題を生成します。

110k行/ 11列のファイルで使用しました。このメソッドは、すべての列を自動サイズ調整するのに約6mかかりました。

詳細については、以下を参照してください。 Apache POIで列の自動サイズ調整を高速化する方法

20
Arthur bauer

このブログで言及されているutilメソッドも使用できます。 Apache POIでExcelからセルの幅と高さを取得する 。問題を解決できます。

そのブログからコピーして貼り付けます:

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

}

したがって、セルの幅と高さを取得する場合、これを使用してピクセル単位の値を取得できます。値は近似的にです。

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

Scalaでは、Nice Wrapperspoiwo

次のようにできます:

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

次のように、すべての列とセルのデフォルトの幅で問題に答えました:

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