poi 怎么设置表格宽度自适应

poi 怎么设置表格宽度自适应,第1张

POI是apache提供的一个读写Excel文档的开源组件,在 *** 作excel时常要合并单元格,合并单元格的方法是:

sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 2))

自适应列宽度

sheet.autoSizeColumn(1)

sheet.autoSizeColumn(1, true)

这两种方式都是自适应列宽度,但是注意这个方法在后边的版本才提供,poi的版本不要太老。 注意:第一个方法在合并单元格的的单元格并不好使,必须用第二个方法。

sheet.setColumnWidth(m, “列名”.getBytes().length*2*256)

这个方法是计算字符串的长度,以便设置列宽,该方法在解决中文的问题上比较好,前面两种方法对中文不好好用。。。。

还有在自适应宽度的时候,有时候遇到单元格是公式单元格,自适应不起作用,那是因为单元格存的是公式,并不是真正的数据,解决方法:

HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet.getWorkbook())

CellValue cell71Val = evaluator.evaluate(cell71)

cell71.setCellValue(cell71Val.getNumberValue())

将格式化后的数据再次set进去,就是真正的值了。

EXCEL的行高度和列宽度单位是不一样的。

1,EXCEL列高度的单位是磅,Apache POI的行高度单位是缇(twip):

1英寸=72磅=25.4毫米=1440缇

1磅=0.353毫米=20缇

POI中的行高=Excel的行高度*20

Excel的行高度=POI中的行高/20

这里顺便把像素的换行方法说一下:

DPI = 1英寸内可显示的像素点个数。通常电脑屏幕是96DPI, IPhone4s的屏幕是326DPI, 普通激光黑白打印机是400DPI

要计算POI行高或者Excel的行高,就先把它行转换到英寸,再乘小DPI就可以得到像素

像素 = (磅/72)*DPI

像素= (Excel的行高度/72)*DPI

像素= (POI中的行高/20/72)*DPI

Excel的行高度=像素/DPI*72

POI中的行高=像素/DPI*72*20

例如在电脑屏幕上, Excel默认行高度为13.5, (13.5/72)*96=18像素,而Excel中也确实显示的就是18像素。

2,EXCEL列宽度的单位是字符个数

(2014-08-18备注:关于Excel的宽度计算的详细介绍在这篇文章Excel的宽度怎么算的?)

在excel2003以上的版本中,可以建立一个空白的xls文档并将第一列宽度拉到10。然后在A1单元格中输入1234567890可以看到单元格正好可以容纳这十个字符。一个字符的宽度是通过测量1234567890这十个字符在默认字体(通常是宋体11号字,视版本可能不同)下的平均宽度得到的。

只要记住一个字符的宽度是8像素 (2013-10-29备注:一个字符的宽度取决于Excel文件中的第一个字体大小,并不一定就是8像素)就可以了。

一个单元格实际的像素宽度还要在 (字符个数 * 默认字符的宽度)的基础上前后各加2个像素的空白边。另外字符之间会叠加一个像素,在计算时也要减去:

(2013-10-29备注:一个字符的边距不一定只是2像素,和字体有关系)

像素 = 2个像素空白 + (字符个数 * 默认字符的宽度) + 2个像素空白 - (字符个数 - 1)

整理一下,公式变成:

像素 = 5 + (字符个数 * (默认字符的宽度 - 1))

代入默认字符宽度8:

像素 = 5 + (字符个数 * 7)

POI中的字符宽度算法是:

double 宽度 = (字符个数 * (字符宽度 - 1) + 5) / (字符宽度 - 1) * 256

然后再四舍五入成整数。

最后把我写的一个工具类贴上来,方便使用。

public class HSSFUtil {

private static final short TWIPS_PER_PIEXL = 15//1 Pixel = 1440 TPI / 96 DPI = 15 Twips

public static short pixel2PoiHeight(int pixel) {

return (short) (pixel * TWIPS_PER_PIEXL)

}

public static int poiHeight2Pixel(short height) {

return height / TWIPS_PER_PIEXL

}

//像素转poi宽度

public static int pixel2PoiWidth(FontInfo fontInfo, int pixel) {

double numChars = pixel2Character(fontInfo, pixel)

numChars *= fontInfo.charWidth

numChars += fontInfo.spacing

numChars /= fontInfo.charWidth

numChars *= 256

return (int)numChars

}

//poi宽度转像素

public static int poiWidth2Pixel(FontInfo fontInfo, int poiWidth) {

double numChars = poiWidth2Character(fontInfo, poiWidth)

return character2Piexl(fontInfo, numChars)

}

public static double poiWidth2Character(FontInfo fontInfo, int poiWidth){

double numChars = poiWidth / 256.0 - (fontInfo.spacing * 1.0 / fontInfo.charWidth)

//2位小数

return new BigDecimal(numChars).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()

}

public static int character2PoiWidth(FontInfo fontInfo, double numChars){

double w = (numChars + (fontInfo.spacing * 1.0 / fontInfo.charWidth)) * 256

return (int) w

}

//excel字符转像素

public static int character2Piexl(FontInfo fontInfo, double numChars){

double pixel = fontInfo.charWidth * numChars + fontInfo.spacing

return (int)pixel

}

//excel像素转字符

public static double pixel2Character(FontInfo fontInfo, int pixel){

double numChars = (pixel - fontInfo.spacing) * 1.0 / fontInfo.charWidth

return new BigDecimal(numChars).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()

}

//获得工作簿默认字符宽度

public static FontInfo getDefaultCharWidth(Workbook book){

//博客没人气,我已删除此段代码,请自行研究或者留邮箱

}

//获得不同字体的字符边距

private static int getSpacing(int fontHeightInPoints, int charWidth){

//博客没人气,我已删除此段代码,请自行研究或者留邮箱

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11017544.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存