在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
在工作Sheet
input数据后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));