在Apache POI中设置列宽

我正在用Java编写一个工具,使用Apache POI API将XML转换为MS Excel。 在我的XMLinput中,我收到了点宽的列宽。 但是,Apache POI API有一个基于字体大小等设置列宽的逻辑稍微不同(参考API文档 )

是否有一个公式将点转换为Excel所预期的宽度? 有没有人做过这个?

有一个setRowHeightInPoints()方法虽然:(但没有列。

PS:inputXML是ExcelML格式,我必须转换为MS Excel。

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

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

在工作Sheetinput数据后autoSizeColumn(int column, boolean useMergedCells)您始终可以使用autoSizeColumn(int column, boolean useMergedCells)

希望它有帮助。

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

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

我们用它在一个11万行/ 11列的文件。 该方法花了约6米自动化所有列。

有关更多细节,请看: 如何加快自动化apache POI的列?

您也可以使用本博客中提到的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; } } 

所以,当你想获得单元格的宽度和高度,你可以使用它来获得像素值是approxlly

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