在 Apache POI 中设置列宽



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

是否有将点转换为 Excel 预期的宽度的公式?以前有人这样做过吗?

不过,有一种setRowHeightInPoints()方法:(但列没有。

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

不幸的是,

只有函数setColumnWidth(int columnIndex, 整数宽度(从class Sheet;其中宽度是标准字体(工作簿中的第一种字体(中的字符数,如果字体正在更改,则无法使用它。解释了如何计算字体大小函数的宽度。公式为:

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

Sheet中输入数据后,您始终可以使用autoSizeColumn(int column, boolean useMergedCells)

请谨慎使用autoSizeColumn()。它可以在小文件上毫无问题地使用,但请注意,该方法只为每列调用一次(在末尾(,而不是在循环中调用,这毫无意义。

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

我们在 110k 行/11 列文件上使用它。该方法需要~6m来自动调整所有列的大小。

有关更多详细信息,请查看:如何在 apache POI 中加快自动调整列大小?

您还可以使用本博客中提到的实用方法:使用 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;
    }
}

因此,当您想获取单元格宽度和高度时,您可以使用它来获取像素值,值大致为

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

有了 Scala,有一个不错的 Wrapper spoiwo

你可以这样做:

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

我用所有列和单元格的默认宽度回答了我的问题,如下所示:

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

最新更新