EXCEL的高度和宽度计算-文档值到像素

本文深入探讨WPS表格中高度和宽度的计算原理,包括磅到像素的转换、厘米到像素的换算,以及列宽计算公式。揭示了Windows与Mac系统下WPS计算差异,适合对WPS表格布局感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过笔者多次查阅、验证,笔者认为官方文档在计算列款存在误导,实际使用与文档不一致,详见第三部分,欢迎大家来指正本文在宽度计算的问题,谢谢。

一、高度计算

EXCEL的高度在文档记录是以磅为单位的,sheetFormatPr类的defaultRowHeight是默认行高以磅为单位大小。
MAC WPS默认值:17.6磅 ( 默认字体:宋体 大小12磅), Windos WPS值:13.5磅 (默认字体:宋体 大小11磅)。
换算公式为:72磅=1英寸,1英寸=2.54厘米。
那么1磅=1/72英寸,而1英寸所含有PPI个像素,这里就不详细展开PPI的计算了,现在一般计算机默认为96,详细的计算可以自己百度。

   因此磅到像素的转换为 :  PX=(PT/72*PPI)      (公式-1) 其中PX为像素 PT为磅
      厘米到像素的转换为: PX= (mm/2.54*PPI) (公式-2) 其中PX为像素 mm为厘米
  1. WINDOWS WPS计算 默认字体:宋体 大小11磅

        高度为13.5磅的像素为   px=13.5/72*96 =18.00 
        高度为0.48厘米的像素为 px=0.48/2.54*96 =18.14
    

    在WPS的若某行存在与默认不一样的高度时,在某行类的属性上ht就存在磅值,其计算方式与默认磅值相同。
    此处的厘米数为wps上展示的,下同,和上述计算对比使用,有兴趣的同学可以根据宏获取磅值,再算像素

  2. MAC WPS计算 默认字体:宋体 大小12磅

          高度为17.6磅的像素为    px=17.6/72*96 =23.46     
          高度为0.62厘米的像素为 px=0.62/2.54*96 =23.43 
    

二、宽度计算

宽度值到像素的转换为 : PX=(width*8) (公式-3) 其中PX为像素 width为 defaultColWidth或列的值。

  1. WINDOWS WPS计算 默认字体:宋体 大小11磅 defaultColWidth值:9

            宽度width为9的像素为               px=9*8 =72.00                
            宽度为1.9厘米的像素为              px=1.9/2.54*96 =71.81   
         同样设置,在col上设置列宽时:
            宽度width为22.375的像素为       px=22.375*8 =179                
            宽度为4.74厘米的像素为            px=4.74/2.54*96 =179.14         
    
  2. MAC WPS计算 默认字体:宋体 大小12磅 defaultColWidth值:9.1428

             宽度为9.1428的像素为     px=9.1428*8 =73.14       
             宽度为1.79厘米的像素为  px=1.79/2.54*96 =67.65 
             宽度为1.93厘米的像 为  px=1.93/2.54*96 =72.94 (同样的设置在windows下)
    

    不知道WPS为何在MAC系统下计算的厘米数与WINDOWS下为何不同,难道是bug。
    不过73.14-67.65=5.49px(难道是2*padding+1gridlines)不计算在内,有懂WPS的人可以告诉笔者一下。当然对比两个系统下WPS还有其他差异,此处就不再一一描述来,总之研究WPS还是在WINDOWS下比较好(笔者被坑惨了,吐槽一下)。

三、宽度理论部分

  1. sheetFormatPr对象类的defaultColWidth属性

Default column width measured as the number of characters of the maximum digit width of the normal style’s font.
If the user has not set this manually, then it can be calculated:
defaultColWidth = baseColumnWidth + {margin padding (2 pixels on each side, totalling 4 pixels)} + {gridline (1pixel)}
If the user has set this manually, then there is no calculation, and simply a value is specified.
The possible values for this attribute are defined by the W3C XML Schema double datatype.
默认列宽度,以普通样式字体的最大数字宽度的字符数度量。
如果用户尚未手动设置此内容,则可以计算:
defaultColWidth = baseColumnWidth + {margin padding (2 pixels on each side, totalling 4 pixels)} + {gridline (1pixel)}
如果用户已手动设置此,则没有计算,并且只指定一个值。

  1. COl对象类的width (Column Width)属性

Column width measured as the number of characters of the maximum digit width of the numbers 0, 1, 2, …, 9 as rendered in the normal style’s font. There are 4 pixels of margin padding (two on each side), plus 1 pixel padding for the gridlines.
width = Truncate([{Number of Characters} * {Maximum Digit Width} + {5 pixel padding}]/{Maximum Digit Width}256)/256
[Example: Using the Calibri font as an example, the maximum digit width of 11 point font size is 7 pixels (at 96 dpi). In fact, each digit is the same width for this font. Therefore, if the cell width is 8 characters wide, the value of this attribute must beTruncate([8
7+5]/7256)/256 = 8.7109375. end example]
To translate the value of width in the file into the column width value at runtime (expressed in terms of pixels), use this calculation:
=Truncate(((256 * {width} + Truncate(128/{Maximum Digit Width}))/256)
{Maximum Digit Width})
[Example: Using the same example as above, the calculation would be Truncate(((2568.7109375+Truncate(128/7))/256)7) = 61 pixels. end example]
To translate from pixels to character width, use this calculation:
=Truncate(({pixels}-5)/{Maximum Digit Width} * 100+0.5)/100
[Example: Using the example above, the calculation would be Truncate((61- 5)/7
100+0.5)/100 = 8 characters. end example]
[Note: when wide borders are applied, part of the left/right border must overlap with the 2 pixel padding on each side. Wide borders do not affect the width calculation of the column. end note]
[Note: When the sheet is in the mode to view formulas instead of values, the pixel width of the column is doubled. end note]
The possible values for this attribute are defined by the W3C XML Schema double datatype.
列宽度,以数字 0、1、…、9 的最大数字宽度的字符数度量,以普通样式的字体呈现。边距填充有 4 个像素(每侧两个),
加上网格线的 1 像素填充。
width = Truncate([{Number of Characters} * {Maximum Digit Width} + {5 pixel padding}]/{Maximum Digit Width}256)/256 (公式-4)
示例:以 Calibri 字体为例,11 (pt)字体大小的最大数字宽度为 7 像素(在 96 dpi 时)。
因此,如果单元格宽度为 8 个字符宽,则此属性的值必须为
=Truncate([8
7+5]/7
256)/256 = 8.7109375
在运行时将文件中的宽度值转换为列宽度值(以像素表示),使用此计算:
=Truncate(((256 * {width} + Truncate(128/{Maximum Digit Width}))/256){Maximum Digit Width}) (公式-5)
[示例:使用与上述相同的示例,计算将为Truncate(((256
8.7109375+Truncate(128/7))/256)7) = 61 像素。
要从像素转换为字符宽度,请使用此计算:
Truncate(({pixels}-5)/{Maximum Digit Width} * 100+0.5)/100
[示例:使用上面的示例,计算将为Truncate((61- 5)/7
100+0.5)/100 = 8 个字符。

以上理论内容均是官方文档,在文档笔者发现在计算公式-4与常识有悖论的地方,假设默认8个字符宽度,那么将默认字符8,Maximum Digit Width为X导入上述 (公式-4 )

                   (8X+5)/256X=256width
                      =》 width =(8X+5)/ X    
                      =》 width =  8+5/X           (公式-5)

在公式-5中 5/x为一个反函数,超过5以后随着X-Maximum Digit Width的变大,宽度几乎保持不变?我们从实际的应用中可以知道数字的宽度随着字体的变大,宽度也变大, 这个从EXCEL的文档中就可以轻易证实。
这也是笔者没有使用官方的运算的方法的原因,根据这个公式怎么也计算不出想要的,这里也欢迎WPS/OFFICE的专家指正。

### Java 导出 Excel 设置单元格宽度 在Java中,可以利用Apache POI库来操作Excel文件。对于设置单元格宽度的操作,主要依赖于`setColumnWidth()`方法,该方法属于`Sheet`类的一部分[^1]。 当需要设定特定列的宽度时,可以通过获取工作表对象后调用此方法完成配置。参数分别为要调整的列索引以及表示宽度的具体数;这里的宽度单位是以字符'0'所占像素数为基础计算得出的一个特殊,因此如果希望更直观地控制显示效果,则可能还需要考虑字体大小等因素的影响[^4]。 下面是一个简单的例子用于说明如何创建一个新的Excel文档并向其中写入一些数据的同时指定某些列具有固定的宽度: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; public class SetCellWidthExample { public static void main(String[] args) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("示例"); Row row = sheet.createRow(0); Cell cellA = row.createCell(0); Cell cellB = row.createCell(1); cellA.setCellValue("这是较长的一段文字"); cellB.setCellValue("短文本"); // 设定第0列(A列)宽度为30个默认字符宽度 sheet.setColumnWidth(0, 30 * 256); // 自动调整第1列(B列)宽度以适应内容 sheet.autoSizeColumn(1); try (FileOutputStream fileOut = new FileOutputStream("example.xlsx")) { workbook.write(fileOut); } workbook.close(); } } ``` 上述代码片段展示了两种不同的方式来处理不同类型的列宽需求:一种是指定固定宽度,另一种则是让某一列自动根据其内部最大长度的内容来自我调节尺寸。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值