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){
- //博客没人气,我已删除此段代码,请自行研究或者留邮箱
- }
- }
2014-11-04:宽度的算法在这:《Excel的宽度怎么算的?》点击打开链接
相关推荐
李白高力士脱靴李白贺知章告别课本剧.pptx
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
C语言项目之超级万年历系统源码,可以做课程设计参考 文章参考:https://www.qqmu.com/4373.html
Jupyter-Notebook
51单片机加减乘除计算器系统设计(proteus8.17,keil5),复制粘贴就可以运行
《中国房地产统计年鉴》面板数据资源-精心整理.zip
Jupyter-Notebook
Jupyter-Notebook
毕业论文答辩ppt,答辩ppt模板,共18套
Jupyter-Notebook
《中国城市统计年鉴》面板数据集(2004-2020年,最新).zip
Python基础 本节课知识点: • set的定义 • Set的解析 • set的操作 • set的函数
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
兵制与官制研究资料最新版.zip
Jupyter-Notebook
七普人口数据+微观数据+可视化+GIS矢量资源-精心整理.zip
Support package for Hovl Studio assets.unitypackage
土壤数据库最新集.zip
Jupyter-Notebook
1991-2020年中国能源统计年鉴-能源消费量(分省)面板数据-已更至最新.zip