因为最近甲方领导对excel导出的文件要求比较高,所以发现这个问题,同一个excel表格,在领导电脑上打印是一页刚刚好,而在其他人的电脑上打印则超过了一页。
一开始我们想到了几种可能的原因:
1、页面缩放
2、页边距设置
3、打印机设置
4、excel选项-默认字体设置
5、excel选项-标尺设置
6、不同excel版本问题
结果试了以后都不是这些原因导致的。后来经公司总部excel专家指导,发现是电脑dpi设置问题导致的,跟excel无关。
设置地方:控制面板-所有控制面板项-显示。如下图
我们正常的显示都是100%(默认)也就是dpi为96,而甲方领导因为大屏幕字太小说,所以自己设置为125%,也就是dpi为120。所有导致了同一个excel在不同电脑上打印效果不同。
下面是我们测试的经过
2、调整系统dpi为每英寸120像素(即125%),然后打开之前创建的excel表格,宽度和高度变成如下图所示。
另一个测试是反过来测试的,方法差不多,这里就不熬述了。在不同dpi设置下面的打印效果如下图(左边的是dpi为96的打印效果,右边是dpi为120的打印效果,高度还是差很多的)
那么这个问题是windows系统导致的,应该算是windows跟excel的一个bug吧。但是甲方领导不依不饶一定要解决这个问题(公司公关没做到位,坑的都是我们程序猿啊~),刚开始我们使用的pdf来替代excel的办法作为解决方案,使用OpenOffice插件在服务器端把excel转为pdf然后导出,经过测试这个方案没有问题,结果上甲方的测试系统时,问题来了~,甲方的服务器是AIX。OpenOffice根本没有提供AIX的插件包。。。后来又想了另一种折中方案,就是OpenOffice安装在另一台Linux服务器上,AIX服务器上的系统去调用OpenOffice所在的这台机器,这样的方案也是可以实现,结果甲方又是担心出问题,不同意这个方案。最后还是我们领导想出了一个解决办法,就是在jsp页面用js调用ActiveXObject读取客户端的注册表,然后判断客户端是那种dpi,代码如下
var dpiVal=96;
try{
var shell=new ActiveXObject("WScript.Shell");
var reginfo="HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics\\AppliedDPI"
dpiVal=shell.RegRead(reginfo);
}catch(e){
dpiVal=96;
}
这样我们在服务端做了2个excel模板来满足不同dpi设置,这样的结果是只能在ie浏览器上使用,而且把站点加入受信任站点,然后自定义级别,设置如下
这样终于把问题解决了,甲方领导也同意这样的方案。
下面附上跟微软400客服沟通的记录,以及msdn微软工程师的回复
与微软客户400电话沟通记录
2014年10月10日星期五 17:15
致电4008203800。
微软回复:需要正版许可才能获得技术支持。
2014年10月11日星期六 10:48
致电4008203800。
提供正版序列号。
微软回复:需要企业服务协议号才能获得技术支持。
2014年10月13日星期一 14:07
致电4008203800。
提供企业服务协议号,说明所遇到的问题。
微软回复:超出免费服务范围,需要有偿服务才能获得技术支持。
======================================================================
微软excel论坛微软工程师Johns Wu的回复
您好,
DPI是每英寸象素数,DPI不同显示效果是有差别的,这也是正常情况。(打印尺寸越大DPI越低)
通常打印效果受像素、分辨率等有关。例如照片的DPI一般是固定的,比如大多数机器都设定为72,那么600万象素的照片长是3400象素,每英寸72象素,那么打印出来就是长47英寸,合119厘米,大约1.2米。这种情况通常不现实,所以要调高DPI值或者减小照片分辨率,以达到最佳尺寸。
“打印尺寸”与影像分辨率有莫大的关系,只要影像分辨率改变了,打印的尺寸便会跟着变化,而像素和影像分辨率又有直接的关系,所以三者可以互相转换的。而其中最根本的就是像素了。
=======================================================================
excel帮助文档关于excel列宽不同的解释
大多数打印机提供了比计算机屏幕 (96 dpi) 变得更高的分辨率 (300 或 600 点 / 英寸)。因此,不同打印输出呈现在屏幕上显示的信息。当选择一列或行,并使用自动调整命令时在屏幕使用该字体规格不同于打印机使用的该度量值 ; 某些字体的有些字符可能会使用小数的值。
例如对于一种字体可能会报告 9.1 的像素,但它无法处理小数部分的多显示器驱动程序是舍入为最接近的整像素值量。在此的示例 9.1 像素被舍入,向下为 9.0 像素为单位)。更高分辨率打印机呈现打印预览中的视图中,或当打印工作表时,将使用时, 字符可能会打印在 9.1 像素的分辨率。因为基于圆角的整数值计算列的宽度,打印的输出的列是宽度的不同于显示的列的宽度。使用自动调整命令来调整列中包含长文本字符串,这种差异时尤其明显。