我正在使用 Apache POI API 在 Java 中编写一个工具来将 XML 转换为 MS Excel。在我的 XML 输入中,我收到以磅为单位的列宽。但是 Apache POI API 有一个稍微奇怪的逻辑,用于根据字体大小等设置列宽(请参阅API 文档)
是否有将点转换为 Excel 预期的宽度的公式?有没有人这样做过?
虽然有一种setRowHeightInPoints()方法:(但对于列没有。
PS:输入 XML 是 ExcelML 格式,我必须将其转换为 MS Excel。
我正在使用 Apache POI API 在 Java 中编写一个工具来将 XML 转换为 MS Excel。在我的 XML 输入中,我收到以磅为单位的列宽。但是 Apache POI API 有一个稍微奇怪的逻辑,用于根据字体大小等设置列宽(请参阅API 文档)
是否有将点转换为 Excel 预期的宽度的公式?有没有人这样做过?
虽然有一种setRowHeightInPoints()方法:(但对于列没有。
PS:输入 XML 是 ExcelML 格式,我必须将其转换为 MS Excel。
不幸的是,只有函数setColumnWidth(int columnIndex, int width) from class Sheet; 其中宽度是标准字体(工作簿中的第一个字体)中的字符数,如果您的字体正在更改,您将无法使用它。解释了如何根据字体大小计算宽度。公式为:
width = Truncate([{NumOfVisibleChar} * {MaxDigitWidth} + {5PixelPadding}] / {MaxDigitWidth}*256) / 256
将autoSizeColumn(int column, boolean useMergedCells)数据输入到您的Sheet.
请谨慎使用autoSizeColumn(). 它可以在小文件上毫无问题地使用,但请注意该方法对每一列仅调用一次(最后),而不是在没有意义的循环内调用。
请避免autoSizeColumn()在大型 Excel 文件上使用。该方法产生性能问题。
我们在一个 110k 行/11 列的文件中使用了它。该方法需要大约 6m 来自动调整所有列的大小。
有关更多详细信息,请查看:如何加速 apache POI 中的自动调整列大小?
您还可以使用本博客中提到的实用方法:Getting cell witdth and height from excel with Apache POI。它可以解决你的问题。
从该博客复制并粘贴:
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);