67

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

ポイントを Excel が期待する幅に変換する式はありますか? 誰もこれを以前にやったことがありますか?

ただし、setRowHeightInPoints()方法はあります:(しかし、列にはありません。

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

4

5 に答える 5

101

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

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

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

于 2012-07-20T07:17:50.390 に答える
16

このブログで説明されている util メソッドも使用できます: Getting cell witdth and height from Excel with Apache POI。それはあなたの問題を解決することができます。

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

static 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));
于 2015-08-05T16:10:26.080 に答える
2

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

int width = 15; // Where width is number of caracters 
sheet.setDefaultColumnWidth(width);
于 2019-05-10T17:41:10.783 に答える