2012-07-20 247 views
37

我正在使用Apache POI API将Java工具编写为将XML转换为MS Excel的工具。在我的XML输入中,我以磅为单位获得列宽。但是,Apache POI API有一个基于字体大小等设置列宽的逻辑有点奇怪(参考API docs在Apache POI中设置列宽

是否有一个公式可以将Excel转换为宽度的公式?有没有人做过这个? 。

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

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

回答

74

不幸的是,只有功能setColumnWidth(int columnIndex, int width)。从class Sheet;其中宽度是标准字体中的字符数(工作簿中的第一个字体)如果字体发生变化,则不能使用它 下面解释了如何计算字体大小的宽度。公式是:

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

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

希望它有帮助。

+27

+1 autoSizeColumn – Nasir 2013-06-07 15:29:52

+1

thnx..it工作 – 2013-06-27 11:49:55

2

您也可以使用本博客中提到的util方法:Getting cell witdth and height from excel with Apache POI。它可以解决你的问题。

复制从博客&贴:

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; 
    } 

} 

所以,当你想获得细胞的宽度和高度,你可以使用这个在像素中获取价值,值approximatelly

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

在我的代码中使用这个和是它的伟大工程。 – 2017-08-16 14:15:28

12

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

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

我们在110k行/ 11列文件上使用它。该方法花费约6米自动化所有列。

更多细节看看:How to speed up autosizing columns in apache POI?