在Apache POI中设置列宽

Aru*_*run 55 excel apache-poi

我正在使用Apache POI API编写一个Java工具,将XML转换为MS Excel.在我的XML输入中,我以磅为单位接收列宽.但Apache POI API有一个稍微奇怪的逻辑,用于根据字体大小等设置列宽(请参阅API文档)

是否存在将点转换为Excel预期宽度的公式?有没有人这样做过?

setRowHeightInPoints()虽然有一种方法:(但没有列.

PS:输入XML是ExcelML格式,我必须转换为MS Excel.

小智 93

不幸的是只有函数setColumnWidth(int columnIndex,int width) from class Sheet; 其中width是标准字体中的字符数(工作簿中的第一个字体),如果字体正在更改,则无法使用它.解释了如何根据字体大小计算宽度.公式是:

width = Truncate([{NumOfVisibleChar} * {MaxDigitWidth} + {5PixelPadding}] / {MaxDigitWidth}*256) / 256
Run Code Online (Sandbox Code Playgroud)

autoSizeColumn(int column, boolean useMergedCells)输入数据后,您可以随时使用Sheet.

希望它有所帮助.

  • 小心 autoSizeColumn(); 它可能会在某些系统上引发错误,因为它依赖于可能不存在的字体的存在。 (2认同)

小智 24

请注意使用autoSizeColumn().它可以在小文件上使用而没有问题,但请注意,每个列只调用一次(最后)方法,而不是在一个没有意义的循环内调用.

请避免autoSizeColumn()在大型Excel文件上使用.该方法会产生性能问题.

我们在110k行/ 11列文件中使用它.该方法花了大约6米来自动调整所有列.

有关更多详细信息,请参阅:如何加速apache POI中的自动调整列?

  • 这是对已接受答案的评论,而不是对原始问题的独立答案。 (2认同)

lu_*_*_ko 12

您还可以使用本博客中提到的util方法:使用Apache POI从excel获取单元格和高度.它可以解决您的问题.

从该博客复制并粘贴:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当您想要获取单元格宽度和高度时,您可以使用它来获取像素,值近似值.

PixelUtil.heightUnits2Pixel((short) row.getHeight())
PixelUtil.widthUnits2Pixel((short) sh.getColumnWidth(columnIndex));
Run Code Online (Sandbox Code Playgroud)