Excel的宽度怎么算的? | 您所在的位置:网站首页 › 表格的长度宽度怎样计算的啊 › Excel的宽度怎么算的? |
1,什么是默认字体? 新建工作簿时的字体就是默认字体。 2003(XP系统)默认字体设置:
2010(Win7系统)默认字体设置:
2,宽度相同时,像素值相同吗? 在excel2003以上的版本中,可以建立一个空白的xls文档并将第一列宽度拉到10。然后在A1单元格中输入1234567890可以看到单元格正好可以容纳这十个字符。一个字符的宽度是通过测量1234567890这十个字符在默认字体(通常是宋体11号字,视版本可能不同)下的平均宽度得到的。 宋体11号字:
宋体18号字:
这两张图片中的宽度都为10,且正好容纳下1~0十数字,但是它们的宽度像素值却不相同。 3,宽度的像素值是如何计算的?
上图是我做的一张表格,里面包含一些常见的字体和它们在Excel中的实测宽度(2003和2010测试结果相同) 这张图说明了几个问题: 一、字符像素宽度 = 字体宽度 * 字符个数 + 边距 例如宋体11号字,字体宽度8,边距5,计算10个字符的实际像素值: 8 * 10 + 5 = 85; 二、不同的字体,字体宽度和边距是不同的 三、网上到处流传的拿字体宽度8边距5 进行像素计算的,就是因为EXCEL2003的默认字体为宋体12,EXCEL2010默认字体为11,而它们的参数正好相同。一旦客户某天改了默认字体,新建了个Excel文件,你的程序就可能不对了。 四、Arial 10字体很重要,因为它是Apache POI中所有关于像素计算的默认字体。用POI创建出来的EXCEL就是这个字体。有时你可能要精确设置列宽度,或者用POI往EXCEL里面插入一张图片还要进行精确定位,你就必须要知道这个默认字体的问题。 如果你用POI新建Excel文件,那么参数就是7和5 如果你用预先画的EXCEL文件打印报表之类的操作,你就要看它的默认字体是什么了。 5,怎么看EXCEL文件中的默认字体是什么? 我用的POI代码查看的,其他方法暂时不知道,有知道的朋友请指导。 注:第0个字体就是默认字体 public static void main(String[] args) throws IOException { File xlsFile = new File("d:\\1.xls"); HSSFWorkbook book = new HSSFWorkbook(new FileInputStream(xlsFile)); HSSFFont font = book.getFontAt((short)0); System.out.println(font.getFontName() + font.getFontHeightInPoints()); } 6,怎么使用POI修改Excel文件的默认字体?这个暂时不知道,有知道的朋友请指导。 7,解决方案呢? 解决方案1:使用POI创建的EXCEL文件,请使用参数7和5,用第3条中的公式计算宽度即可。 解决方案2:把常用的EXCEL文件用代码扫描一下看看默认字体是什么 import java.io.File; import java.io.FileInputStream; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class ReadFont { public static void main(String[] args) { //扫描目录下的所有XLS文件 File rootDir = new File("D:\\test"); List files = collectionFiles(rootDir); System.out.println("共有EXCEL文件:" + files.size() + "个"); Map counts = new HashMap(); for (File xlsFile : files) { String font = readFont(xlsFile); Integer c = counts.get(font); if(c == null){ c = 0; } counts.put(font, c + 1); } for (Entry entry : counts.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } } private static String readFont(File xlsFile) { HSSFWorkbook book = null; try { book = new HSSFWorkbook(new FileInputStream(xlsFile)); } catch (Exception e) { throw new RuntimeException(e); } HSSFFont font = book.getFontAt((short)0); return font.getFontName() + font.getFontHeightInPoints(); } private static List collectionFiles(File rootDir) { List result = new LinkedList(); collectionFiles(rootDir, result); return result; } private static void collectionFiles(File rootDir, List result) { for (File f : rootDir.listFiles()) { if(f.isDirectory()){ collectionFiles(f, result); }else if(f.getName().endsWith(".xls")){ result.add(f); } } } }个人测试结果如下:共有EXCEL文件:213个 宋体12 = 112 宋体11 = 54 Arial10 = 31 宋体10 = 14 仿宋_GB231212 = 1 宋体8 = 1 可以人看出常用字体大概在3、4种左右,只需根据第2条,用EXCEL实际测量一下就可以算出参数。然后究竟是写配置文件,还是定义个常量,请随意。 8,有没有办法直接从字体、字号算出字符宽度、边距这两个参数呢? 激动人心的时刻到来了,但我还是留个坑吧,如有需要请留言。 |
CopyRight 2018-2019 实验室设备网 版权所有 |