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<File> files = collectionFiles(rootDir);
		System.out.println("共有EXCEL文件:" + files.size() + "个");
		
		Map<String, Integer> counts = new HashMap<String, Integer>();
		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<String, Integer> 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<File> collectionFiles(File rootDir) {
		List<File> result = new LinkedList<File>();
		collectionFiles(rootDir, result);
		return result;
	}

	private static void collectionFiles(File rootDir, List<File> 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,有没有办法直接从字体、字号算出字符宽度、边距这两个参数呢?

激动人心的时刻到来了,但我还是留个坑吧,如有需要请留言。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 31
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值